1、Microsoft Word 文档#include #define uchar unsigned char#define uint unsigned intsbit CLK_166=P31;sbit SHLD_166=P34;unsigned char dat;unsigned char K1,H2,K3;sbit SDA=P10; /DS1302数据线sbit CLK=P11; /DS1302时钟线sbit RST=P12; /DS1302复位线/sbit K1=P35; / 小时调整/sbit K2=P36; / 分钟调整/sbit K3=P37; / 确定sbit LED_DS=P23;
2、 /数据输入SI sbit LED_ST=P21; /显示控制RCKsbit LED_SH=P22; /数据控制SCK/ 数码管字形码uchar code DSY_shuma=0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF; /共阳/显示缓冲:23-57-18 ;2011年04月16日uchar DSY_BUFFER=0,0,0xBF,0,0;/显示缓冲00-00-00(12-04-10)uchar Current_Time7;/通过DS1302读取的日期和时间就放在这个数
3、组中。bit Adjust_Flag;/*-子程序声明-*/void delay(uint K); /延时子程序void Display(); / 显示子程序, 主要显示小时、分钟和void Initialization(); /初始化子程序void Write_Byte_TO_DS1302(uchar x) ; / 向DS1302写入一个字节uchar Read_Byte_FROM_DS1302(); / 从DS1302读取一个字节void Write_Data_TO_DS1302(uchar addr,uchar dat); /向DS1302中的寄存器中写入数据uchar Read_Dat
4、a_FROM_DS1302(uchar addr); /从DS1302的某个寄存器中读取数据void GET_Time(); /读取当前时间,年月日,小时、分钟、秒钟void SET_Time(); /当调整时间时需要设置时间/-/主程序/- void main() Initialization(); while(1) if(Adjust_Flag=0) GET_Time(); Display(); / while(1) SHLD_166=0; CLK_166=0; CLK_166=1; delay(1000); SHLD_166=1; SCON=0X10; while(RI=0); dat=
5、SBUF; switch(dat)case 0Xfe: K1=0; break; case 0Xfd: H2=0; break; case 0Xfb: K3=0; break; case 0Xf7: P0=0x1f; break; case 0Xef: P0=0X2f; break; case 0Xdf: P0=0xff; break; /- /键盘中断服务程序(INT0) /-void EX_INT0()interrupt 0 if(K1=0) / 小时调整 Adjust_Flag=1; /正在调整 Current_Time2=(Current_Time2+1)%24; else if(H2
6、=0) / 分钟调整 Adjust_Flag=1; /正在调整 Current_Time1=(Current_Time1+1)%60; else if(K3=0) SET_Time(); /将调整后的时间写入DS1302 Adjust_Flag=0; /结束调整,时间继续正常显示 /*-延时子程序-*/void delay(uint K) uchar i,p=120; for(i=K;i0;i-) for(;p0;p-); /*-写字节函数,向DS1302写入一个字节-*/ void Write_Byte_TO_DS1302(uchar X) / 向DS1302写入一个字节 uchar i;
7、for(i=0;i=1; /*-读字节函数,从DS1302读取一个字节-*/uchar Read_Byte_FROM_DS1302() uchar i,byte,t; for(i=0;i=1; t=SDA; byte|=t7; CLK=1; CLK=0; /BCD码转换 return byte/16*10+byte%16; /- /从DS1302指定位置读取数据 , 读数据 /- uchar Read_Data_FROM_DS1302(uchar addr) uchar dat; RST=0; CLK=0; RST=1; Write_Byte_TO_DS1302(addr); /向DS1302
8、写入一个地址 dat=Read_Byte_FROM_DS1302(); /在上面写入的地址中读取数据 CLK=1; RST=0; return dat; /- /向DS1302指定位置写入数据, 写数据 /- void Write_Data_TO_DS1302(uchar addr,uchar dat) CLK=0; RST=1; Write_Byte_TO_DS1302(addr); Write_Byte_TO_DS1302(dat); CLK=1; RST=0; /- /读取当前时间,年月日,小时、分钟、秒钟 /- void GET_Time() Current_Time0 =Read_D
9、ata_FROM_DS1302(0x81); /读取当前时间秒 Current_Time1 =Read_Data_FROM_DS1302(0x83); /读取当前时间分钟 Current_Time2 =Read_Data_FROM_DS1302(0x85); /读取当前时间时钟 Current_Time3 =Read_Data_FROM_DS1302(0x87); /读取当前时间日 Current_Time4 =Read_Data_FROM_DS1302(0x89); /读取当前时间月 Current_Time5 =Read_Data_FROM_DS1302(0x8B); /读取当前时间秒星期
10、 Current_Time6 =Read_Data_FROM_DS1302(0x8D); /读取当前时间秒年 /- /设置时间函数,当需要调整时间时,需要把调整好的时间写入时间缓冲数组中 /- void SET_Time() Write_Data_TO_DS1302(0x8e,0x00) ; /写控制字,取消写保护 Write_Data_TO_DS1302(0x82,(Current_Time1/104)|( Current_Time1%10); /写入分钟 Write_Data_TO_DS1302(0x84,(Current_Time2/104)|( Current_Time2%10); /
11、写入时钟 Write_Data_TO_DS1302(0x8e,0x80); /加保护 /-/初始化子程序/-void Initialization() Adjust_Flag=0; IE=0x81; IT0=0x01; /- / 显示 /- void Display() char j,j1,j2,j3,mask; mask=0x01; delay(1000); for(j=0;j8;j+) LED_SH=0;/数据控制 LED_DS=(DSY_shumaCurrent_Time1%10&mask); /数据输入 LED_SH=1;/数据控制 mask=mask1; mask=0x01; /de
12、lay(10); for(j1=0;j18;j1+) LED_SH=0;/数据控制 LED_DS=(DSY_shumaCurrent_Time1/10&mask); /数据输入 & 同一则一,有零则零 LED_SH=1;/数据控制 mask=mask1; mask=0x01; /delay(10); for(j2=0;j28;j2+) LED_SH=0;/数据控制 LED_DS=(DSY_shumaCurrent_Time2%10&mask); /数据输入 & 同一则一,有零则零 LED_SH=1;/数据控制 mask=mask1; mask=0x01; /delay(10); for(j3=
13、0;j38;j3+) LED_SH=0;/数据控制 LED_DS=(DSY_shumaCurrent_Time2/10&mask); /数据输入 & 同一则一,有零则零 LED_SH=1;/数据控制 mask=mask1; LED_ST=0;/显示控制 LED_ST=1;/显示控制/-#include #define uchar unsigned char#define uint unsigned intsbit CLK_166=P31;sbit SHLD_166=P32;unsigned char dat;unsigned char K1,K2,K3,K4=0,K5,K6;sbit SDA=
14、P10; /DS1302数据线sbit CLK=P11; /DS1302时钟线sbit RST=P12; /DS1302复位线/sbit K1=P35; / 小时调整/sbit K2=P36; / 分钟调整/sbit K3=P37; / 确定sbit LED_clk=P20;sbit LED_st=P21;sbit LED=P22; /数据控制SCK/ 数码管字形码uchar code DSY_shuma=0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF; /共阳/显示缓冲:
15、23-57-18 ;2011年04月16日uchar DSY_BUFFER=0,0,0xBF,0,0;/显示缓冲00-00-00(12-04-10)uchar Current_Time7;/通过DS1302读取的日期和时间就放在这个数组中。bit Adjust_Flag;/*-子程序声明-*/void delay(uint K); /延时子程序void Display(); / 显示子程序, 主要显示小时、分钟和void Initialization(); /初始化子程序void Write_Byte_TO_DS1302(uchar x) ; / 向DS1302写入一个字节uchar Read
16、_Byte_FROM_DS1302(); / 从DS1302读取一个字节void Write_Data_TO_DS1302(uchar addr,uchar dat); /向DS1302中的寄存器中写入数据uchar Read_Data_FROM_DS1302(uchar addr); /从DS1302的某个寄存器中读取数据void GET_Time(); /读取当前时间,年月日,小时、分钟、秒钟void SET_Time(); /当调整时间时需要设置时间/-/主程序/- void main() Initialization(); while(1) if(Adjust_Flag=0) GET_
17、Time(); Display(); / while(1) SHLD_166=0; CLK_166=0; CLK_166=1; delay(1000); SHLD_166=1; SCON=0X10; while(RI=0); dat=SBUF; switch(dat)case 0Xfe:P0=0x03; K1=0; break; case 0Xfd: K2=0; break; case 0Xfb: K3=0; break; case 0Xf7: K4+; break; case 0Xef: K5+; break; case 0Xdf: K6+; break; /- /键盘中断服务程序(INT0
18、) /-void EX_INT0()interrupt 0 if(K1=0) / 小时调整 Adjust_Flag=1; /正在调整 Current_Time2=(Current_Time2+1)%24; else if(K2=0) / 分钟调整 Adjust_Flag=1; /正在调整 Current_Time1=(Current_Time1+1)%60; else if(K3=0) SET_Time(); /将调整后的时间写入DS1302 Adjust_Flag=0; /结束调整,时间继续正常显示 /* if(K4%2=1) / 小时调整 / Adjust_Flag=1; /正在调整 if
19、(K5=1) Current_Time2=(Current_Time2+1)%24; if(K6=1) Current_Time2=(Current_Time2-1)%24; Else /if(K4=2) 分钟调整 Adjust_Flag=1; /正在调整 if(K5=1) Current_Time1=(Current_Time1+1)%60; if(K6=1) Current_Time1=(Current_Time1-1)%60; /*else if(K4=0) SET_Time(); /将调整后的时间写入DS1302 Adjust_Flag=0; /结束调整,时间继续正常显示 */*-延时
20、子程序-*/void delay(uint K) uchar i,p=120; for(i=K;i0;i-) for(;p0;p-); /*-写字节函数,向DS1302写入一个字节-*/ void Write_Byte_TO_DS1302(uchar X) / 向DS1302写入一个字节 uchar i; for(i=0;i=1; /*-读字节函数,从DS1302读取一个字节-*/uchar Read_Byte_FROM_DS1302() uchar i,byte,t; for(i=0;i=1; t=SDA; byte|=t7; CLK=1; CLK=0; /BCD码转换 return byt
21、e/16*10+byte%16; /- /从DS1302指定位置读取数据 , 读数据 /- uchar Read_Data_FROM_DS1302(uchar addr) uchar dat; RST=0; CLK=0; RST=1; Write_Byte_TO_DS1302(addr); /向DS1302写入一个地址 dat=Read_Byte_FROM_DS1302(); /在上面写入的地址中读取数据 CLK=1; RST=0; return dat; /- /向DS1302指定位置写入数据, 写数据 /- void Write_Data_TO_DS1302(uchar addr,ucha
22、r dat) CLK=0; RST=1; Write_Byte_TO_DS1302(addr); Write_Byte_TO_DS1302(dat); CLK=1; RST=0; /- /读取当前时间,年月日,小时、分钟、秒钟 /- void GET_Time() Current_Time0 =Read_Data_FROM_DS1302(0x81); /读取当前时间秒 Current_Time1 =Read_Data_FROM_DS1302(0x83); /读取当前时间分钟 Current_Time2 =Read_Data_FROM_DS1302(0x85); /读取当前时间时钟 Current_Time3 =Read_Data_FROM_DS1302(0x87); /读取当前时间日 Current_Time4 =Read_Data_FROM_DS1302(0x89); /读取当前时间月 Current_Time5 =Read_Data_FROM_DS1302(0x8B); /读取当前时间秒星期 Current_Time6 =Read_Data_FROM_DS1302(0x8D); /读取当前时间秒年 /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1