51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx
- 文档编号:5799102
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:22
- 大小:33.05KB
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx
《51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。
DS1302的寄存器
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见数据手册。
此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。
时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。
DS1302与RAM相关的寄存器分为两类:
一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;
另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写>
、FFH(读>
。
下面是其C程序<
独家转售):
#include<
reg51.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLCDIOP2
sbitrs=P3^0。
sbitrd=P3^1。
sbitlcden=P3^2。
sbitacc0=ACC^0。
//移位时的第0位
sbitacc7=ACC^7。
//移位时用的第7位
ucharsecond,minute,hour,day,month,year,week,count=0。
ucharReadValue,num,time。
ucharcodetable[]={"
2018-11-29MON"
}。
ucharcodetable1[]={"
15:
45:
00"
ucharcodetable2[]="
THUFRISATSUNMONTUEWES"
sbitDATA=P0^1。
sbitRST=P0^2。
sbitSCLK=P0^0。
sbitmenu=P3^5。
//菜单
sbitadd=P3^6。
//加一
sbitdec=P3^7。
//减一
voiddelay(uintz>
{
uintx,y。
for(x=z。
x>
0。
x-->
for(y=110。
y>
y-->
}
voiddelay1(uintz>
for(。
z>
z-->
voidwrite_com(ucharcom>
rs=0。
rd=0。
lcden=0。
P2=com。
delay(5>
lcden=1。
voidwrite_date(uchardate>
rs=1。
P2=date。
voidinit(>
ucharnum。
write_com(0x38>
write_com(0x0c>
write_com(0x06>
write_com(0x01>
write_com(0x80>
for(num=0。
num<
15。
num++>
{
write_date(table[num]>
delay(5>
}
write_com(0x80+0x40>
10。
write_date(table1[num]>
}
voidWrite1302(uchardat>
uchari。
SCLK=0。
//拉低SCLK,为脉冲上升沿写入数据做好准备
delay1(2>
//稍微等待,使硬件做好准备
for(i=0。
i<
8。
i++>
//连续写8个二进制位数据
{
DATA=dat&
0x01。
//取出dat的第0位数据写入1302
delay(2>
SCLK=1。
//上升沿写入数据
//重新拉低SCLK,形成脉冲
dat>
>
=1。
//将dat的各数据位右移1位,准备写入下一个数据位
}
voidWriteSet1302(ucharCmd,uchardat>
RST=0。
//禁止数据传递
//确保写数居前SCLK被拉低
RST=1。
//启动数据传输
Write1302(Cmd>
//写入命令字
Write1302(dat>
//写数据
//将时钟电平置于已知状态
ucharRead1302(void>
uchari,dat。
//连续读8个二进制位数据
//将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1>
//如果读出的数据是1
dat|=0x80。
//将1取出,写在dat的最高位
//将SCLK置于高电平,为下降沿读出
//稍微等待
//拉低SCLK,形成脉冲下降沿
}
returndat。
//将读出的数据返回
ucharReadSet1302(ucharCmd>
uchardat。
//拉低RST
dat=Read1302(>
//读出数据
voidInit_DS1302(void>
{
WriteSet1302(0x8E,0x00>
//根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10>
<
4|(0%10>
//根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((45/10>
4|(45%10>
//根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((15/10>
4|(15%10>
//根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((29/10>
4|(29%10>
//根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((11/10>
4|(11%10>
//根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((10/10>
4|(10%10>
//nian
WriteSet1302(0x8a,((4/10>
4|(4%10>
voidDisplaySecond(ucharx>
uchari,j。
i=x/10。
j=x%10。
write_com(0xc8>
write_date(0x30+i>
write_date(0x30+j>
voidDisplayMinute(ucharx>
write_com(0xc5>
voidDisplayHour(ucharx>
write_com(0xc2>
voidDisplayDay(ucharx>
write_com(0x89>
voidDisplayMonth(ucharx>
write_com(0x86>
voidDisplayYear(ucharx>
write_com(0x83>
voidDisplayWeek(ucharx>
{uchari。
x=x*3。
write_com(0x8c>
3。
write_date(table2[x]>
x++。
voidread_date(void>
ReadValue=ReadSet1302(0x81>
second=((ReadValue&
0x70>
4>
*10+(ReadValue&
0x0F>
ReadValue=ReadSet1302(0x83>
minute=((ReadValue&
ReadValue=ReadSet1302(0x85>
hour=((ReadValue&
ReadValue=ReadSet1302(0x87>
day=((ReadValue&
ReadValue=ReadSet1302(0x89>
month=((ReadValue&
ReadValue=ReadSet1302(0x8d>
year=((ReadValue&
ReadValue=ReadSet1302(0x8b>
//读星期
week=ReadValue&
0x07。
DisplaySecond(second>
DisplayMinute(minute>
DisplayHour(hour>
DisplayDay(day>
DisplayMonth(month>
DisplayYear(year>
DisplayWeek(week>
voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num>
newval=ReadSet1302(newaddr>
//读取当前时间
newval=((newval&
*10+(newval&
0x0f>
//将bcd码转换成十进制
if(flag>
//判断是加一还是减一
{
newval++。
switch(s1num>
{case1:
if(newval>
99>
newval=0。
DisplayYear(newval>
break。
case2:
12>
newval=1。
DisplayMonth(newval>
case3:
31>
DisplayDay(newval>
case4:
6>
DisplayWeek(newval>
case5:
23>
DisplayHour(newval>
case6:
59>
DisplayMinute(newval>
case7:
DisplaySecond(newval>
default:
break。
}
else
newval--。
switch(s1num>
if(newval==0>
newval=99。
newval=12。
break。
newval=31。
DisplayDay(newval>
if(newval<
0>
newval=6。
newval=23。
newval=59。
break。
default:
}
WriteSet1302((newaddr-1>
((newval/10>
|(newval%10>
//将新数据写入寄存器
//键盘扫描程序
//*******************************************
voidkey_scan(void>
{ucharmiao,s1num=0。
if(menu==0>
if(menu==0>
while(!
menu>
s1num++。
while(1>
while(!
}
miao=ReadSet1302(0x81>
second=miao。
WriteSet1302(0x80,miao|0x80>
write_com(0x0f>
//光标闪射
if(s1num==1>
{year=ReadSet1302(0x8d>
write_com(0x80+4>
//年光标
if(add==0>
{
delay(3>
{while(!
add>
turn_val(year,1,0x8d,1>
}
if(dec==0>
if(dec==0>
{while(!
dec>
turn_val(year,0,0x8d,1>
if(s1num==2>
month=ReadSet1302(0x89>
write_com(0x80+7>
//月光标
if(add==0>
turn_val(month,1,0x89,2>
if(dec==0>
turn_val(month,0,0x89,2>
if(s1num==3>
{day=ReadSet1302(0x87>
write_com(0x80+10>
//日光标
turn_val(day,1,0x87,3>
turn_val(day,0,0x87,3>
//写入日寄存器
if(s1num==4>
{week=ReadSet1302(0x8b>
write_com(0x80+14>
//星期光标
turn_val(week,1,0x8b,4>
turn_val(week,0,0x8b,4>
if(s1num==5>
{hour=ReadSet1302(0x85>
write_com(0x80+0x40+3>
//时光标
turn_val(hour,1,0x85,5>
turn_val(hour,0,0x85,5>
if(s1num==6>
//调时间分
{minute=ReadSet1302(0x83>
write_com(0x80+0x40+6>
turn_val(minute,1,0x83,6>
//写入分寄存器
turn_val(minute,0,0x83,6>
//写入分寄存器
if(s1num==7>
//调时间秒
{second=ReadSet1302(0x81>
write_com(0x80+0x40+9>
//秒光标
if(second==0x60>
second=0x00。
turn_val(second,1,0x81,7>
turn_val(second,0,0x81
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 DS1302 时钟 1602 显示 可调