51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx

上传人:b****1 文档编号:5799102 上传时间:2023-05-05 格式:DOCX 页数:22 大小:33.05KB
下载 相关 举报
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第1页
第1页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第2页
第2页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第3页
第3页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第4页
第4页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第5页
第5页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第6页
第6页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第7页
第7页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第8页
第8页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第9页
第9页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第10页
第10页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第11页
第11页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第12页
第12页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第13页
第13页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第14页
第14页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第15页
第15页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第16页
第16页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第17页
第17页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第18页
第18页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第19页
第19页 / 共22页
51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx

《51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx(22页珍藏版)》请在冰点文库上搜索。

51单片机DS1302时钟1602显示可调时钟Word文档下载推荐.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2