基于51单片机的ds1302程序Word文档下载推荐.docx
- 文档编号:6161810
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:17
- 大小:16.95KB
基于51单片机的ds1302程序Word文档下载推荐.docx
《基于51单片机的ds1302程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于51单片机的ds1302程序Word文档下载推荐.docx(17页珍藏版)》请在冰点文库上搜索。
"
ucharl_tmpdate[7]={0,55,16,22,8,6,9};
//秒分时日月周年//可随时更改
ucharcodewrite_add[7]={0x80,0x82,0x84,0x86,
0x88,0x8a,0x8c};
//秒分时日月周年写的寄存器地址
ucharcoderead_add[7]={0x81,0x83,0x85,0x87,
0x89,0x8b,0x8d};
//秒分时日月周年读的寄存器地址
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d
0x7d,0x07,0x7f,0x6f,0x40};
//共阴数码管0-9加'
-'
熄灭表
voiddelay(uintz)
{
while(--z);
}
voidwrite_com(ucharcom)//液晶写命令函数
RS=0;
//写命令使能
RW=0;
//写
delay(5000);
/****在高脉冲下命令输入*****/
E=0;
P0=com;
delay(500);
E=1;
voidwrite_data(uchardat)//液晶写数据函数
RS=1;
//写数据使能
/****在高脉冲下数据输入*****/
P0=dat;
voidinit()//液晶初始化
ucharnum;
write_com(0x38);
//显示模式设置
write_com(0x08);
//显示关闭
write_com(0x01);
//显示清屏
write_com(0x06);
//光标移动设置整屏不移动
write_com(0x0c);
//屏幕开、光标不闪(0)不显示(0)
write_com(0x80);
for(num=0;
num<
16;
num++)
write_data(time0[num]);
delay(5);
write_com(0x80+0x40);
13;
write_data(time1[num]);
voidWrite_Ds1302_Byte(uchartemp)//写一个字节
uchari;
for(i=0;
i<
8;
i++)//循环8次写入数据
{
SCK=0;
SDA=temp&
0x01;
//每次传输低字节
temp>
>
=1;
//右移一位
SCK=1;
}
/****************************************************************************/
voidWrite_Ds1302(ucharadd,uchardat)//向寄存器写数据
RST=0;
_nop_();
RST=1;
//启动
Write_Ds1302_Byte(add);
//发送地址
Write_Ds1302_Byte(dat);
//发送数据
//恢复
ucharRead_Ds1302_Byte()//读一个字节
uchari,temp=0x00;
i++)//循环8次读取数据
if(SDA)
temp|=0x80;
//每次传输低字节
return(temp);
ucharRead_Ds1302(ucharaddress)//从寄存器读数据
uchardate;
Write_Ds1302_Byte(address);
date=Read_Ds1302_Byte();
//以下为DS1302复位的稳定时间
SDA=0;
SDA=1;
return(date);
/*********************************************************/
voidRead_RTC(void)//读取日历
uchari,*p;
p=read_add;
//读的地址传递
for(i=0;
7;
i++)//分7次读取秒分时日月周年
l_tmpdate[i]=Read_Ds1302(*p);
p++;
/******************************************************/
voidSet_RTC(void)//设定日历
uchari,*p,tmp;
i++)
{//BCD处理,将十六进制转换成十进制
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
Write_Ds1302(0x8E,0X00);
//关闭写保护
p=write_add;
//传要写的寄存器地址
i++)//7次写入秒分时日月周年
Write_Ds1302(*p,l_tmpdate[i]);
Write_Ds1302(0x8E,0x80);
//打开写保护
voidwrite_lcd()
staticuchari,temp[2];
switch(i)
case0:
write_com(0x80+0x40+0x0b);
break;
//秒
case1:
write_com(0x80+0x40+8);
//分
case2:
write_com(0x80+0x40+5);
//时
case3:
write_com(0x80+0x0b);
//日
case4:
write_com(0x80+8);
//月
case5:
write_com(0x80+0x0e);
//星期
case6:
write_com(0x80+5);
//年
temp[0]=l_tmpdate[i]/16;
//数据的转换
temp[1]=l_tmpdate[i]&
0x0f;
write_data(0x30+temp[0]);
write_data(0x30+temp[1]);
i++;
if(i==7)
i=0;
ucharchange(ucharx)//十进制转换成十六进制
uchartep,y;
y=x;
tep=y/16;
y=y%16;
y=y+tep*10;
returny;
voidkeyscan()
uchartem[2],tp,Flag;
//存储要更改的时间数据
if(set==0)
flag=1;
//时间停止
//去键盘按下抖动
while(!
set);
//去键盘抬起时抖动
setn++;
if(setn==1)
write_com(0x80+0x40+12);
//将光标移动到秒个位
write_com(0x0f);
//显示光标并且闪烁
if(setn==2)
write_com(0x80+0x40+9);
//将光标移动到分个位
if(setn==3)
write_com(0x80+0x40+6);
//将光标移动到时个位
if(setn==4)
write_com(0x80+15);
if(setn==5)
write_com(0x80+12);
if(setn==6)
write_com(0x80+9);
if(setn==7)
write_com(0x80+6);
if(setn==8)
setn=0;
Write_Ds1302(write_add[0],l_tmpdate[0]);
flag=0;
//时钟正常运行
//光标停止闪烁
if(setn!
=0)//更改时间
if(s1==0)//增加时间
if(s1==0)
s1);
l_tmpdate[0]=change(l_tmpdate[0]);
l_tmpdate[0]++;
if(l_tmpdate[0]>
=60)
l_tmpdate[0]=0;
tp=l_tmpdate[0]/10;
l_tmpdate[0]=l_tmpdate[0]%10;
l_tmpdate[0]=l_tmpdate[0]+tp*16;
write_com(0x80+0x40+11);
tem[0]=l_tmpdate[0]/16;
tem[1]=l_tmpdate[0]&
write_data(0x30+tem[0]);
write_data(0x30+tem[1]);
Flag=1;
{l_tmpdate[1]=change(l_tmpdate[1]);
l_tmpdate[1]++;
if(l_tmpdate[1]==60)
l_tmpdate[1]=0;
tp=l_tmpdate[1]/10;
l_tmpdate[1]=l_tmpdate[1]%10;
l_tmpdate[1]=l_tmpdate[1]+tp*16;
Write_Ds1302(write_add[1],l_tmpdate[1]);
write_com(0x80+0x40+8);
tem[0]=l_tmpdate[1]/16;
tem[1]=l_tmpdate[1]&
{l_tmpdate[2]=change(l_tmpdate[2]);
l_tmpdate[2]++;
if(l_tmpdate[2]>
=24)
l_tmpdate[2]=0;
tp=l_tmpdate[2]/10;
l_tmpdate[2]=l_tmpdate[2]%10;
l_tmpdate[2]=l_tmpdate[2]+tp*16;
Write_Ds1302(write_add[2],l_tmpdate[2]);
write_com(0x80+0x40+5);
tem[0]=l_tmpdate[2]/16;
tem[1]=l_tmpdate[2]&
l_tmpdate[5]=change(l_tmpdate[5]);
l_tmpdate[5]++;
if(l_tmpdate[5]==8)
l_tmpdate[5]=1;
tp=l_tmpdate[5]/10;
l_tmpdate[5]=l_tmpdate[5]%10;
l_tmpdate[5]=l_tmpdate[5]+tp*16;
Write_Ds1302(write_add[5],l_tmpdate[5]);
write_com(0x80+14);
tem[0]=l_tmpdate[5]/16;
tem[1]=l_tmpdate[5]&
l_tmpdate[3]=change(l_tmpdate[3]);
l_tmpdate[3]++;
if(l_tmpdate[3]==32)
l_tmpdate[3]=0;
tp=l_tmpdate[3]/10;
l_tmpdate[3]=l_tmpdate[3]%10;
l_tmpdate[3]=l_tmpdate[3]+tp*16;
Write_Ds1302(write_add[3],l_tmpdate[3]);
write_com(0x80+11);
tem[0]=l_tmpdate[3]/16;
tem[1]=l_tmpdate[3]&
l_tmpdate[4]=change(l_tmpdate[4]);
l_tmpdate[4]++;
if(l_tmpdate[4]==13)
l_tmpdate[4]=0;
write_com(0x80+8);
tp=l_tmpdate[4]/10;
l_tmpdate[4]=l_tmpdate[4]%10;
l_tmpdate[4]=l_tmpdate[4]+tp*16;
Write_Ds1302(write_add[4],l_tmpdate[4]);
tem[0]=l_tmpdate[4]/16;
tem[1]=l_tmpdate[4]&
l_tmpdate[6]=change(l_tmpdate[6]);
l_tmpdate[6]++;
if(l_tmpdate[6]==100)
l_tmpdate[6]=0;
write_com(0x80+5);
tp=l_tmpdate[6]/10;
l_tmpdate[6]=l_tmpdate[6]%10;
l_tmpdate[6]=l_tmpdate[6]+tp*16;
Write_Ds1302(write_add[6],l_tmpdate[6]);
tem[0]=l_tmpdate[6]/16;
tem[1]=l_tmpdate[6]&
if(s2==0)//减少时间
if(s2==0)
s2);
if(l_tmpdate[0]!
=0)
l_tmpdate[0]--;
if(l_tmpdate[0]==0)
l_tmpdate[0]=59;
l_tmpdate[1]=change(l_tmpdate[1]);
if(l_tmpdate[1]!
l_tmpdate[1]--;
if(l_tmpdate[1]==0)
l_tmpdate[1]=59;
if(l_tmpdate[2]!
l_tmpdate[2]--;
if(l_tmpdate[2]==0)
l_tmpdate[2]=23;
if(l_tmpdate[5]!
l_tmpdate[5]--;
if(l_tmpdate[5]==0)
l_tmpdate[5]=7;
tem[1]=l
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 ds1302 程序