《DS芯片C语言程序.pdf》由会员分享,可在线阅读,更多相关《DS芯片C语言程序.pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 DS 芯片 C 语言程序 The Standardization Office was revised on the afternoon of December 13,2020#include/包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit SCK=P36;/时钟 sbit SDA=P34;/数据 sbit RST=P35;/DS1302复位 sbit LS138A=P22;sbit LS138B=P23;sbit LS138C=P24;bit ReadRTC_Flag;/定义读 DS1302标志 unsigned char l_tmpdate7=0
2、,0,12,15,5,3,8;/秒分时日月周年 08-05-15 12:00:00 unsigned char l_tmpdisplay8;code unsigned char write_rtc_address7=0 x80,0 x82,0 x84,0 x86,0 x88,0 x8a,0 x8c;/秒分时日月周年 最低位读写位 code unsigned char read_rtc_address7=0 x81,0 x83,0 x85,0 x87,0 x89,0 x8b,0 x8d;code unsigned char table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,
3、0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x40;/共阴数码管 0-9 -熄灭表 /*/*函数声明 */*/void Write_Ds1302_byte(unsigned char temp);void Write_Ds1302(unsigned char address,unsigned char dat);unsigned char Read_Ds1302(unsigned char address);void Read_RTC(void);/read RTC void Set_RTC(void);/set RTC void InitTIMER0(void);/ini
4、tal timer0/*/*主函数 */*/void main(void)InitTIMER0();/初始化定时器 0 Set_RTC();/写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽 while(1)if(ReadRTC_Flag)ReadRTC_Flag=0;Read_RTC();l_tmpdisplay0=l_tmpdate2/16;/数据的转换,因我们采用数码管 09的显示,将数据分开 l_tmpdisplay1=l_tmpdate2&0 x0f;l_tmpdisplay2=10;/加入-l_tmpdisplay3=l_tmpdate1/16;l_tmpdi
5、splay4=l_tmpdate1&0 x0f;l_tmpdisplay5=10;l_tmpdisplay6=l_tmpdate0/16;l_tmpdisplay7=l_tmpdate0&0 x0f;/*/*定时器 0 初始化 */*/void InitTIMER0(void)TMOD|=0 x01;/定时器设置 16 位 TH0=0 xef;/初始化值 TL0=0 xf0;ET0=1;TR0=1;EA=1;/*/*写一个字节 */*/void Write_Ds1302_Byte(unsigned char temp)unsigned char i;for(i=0;i=1;/右移一位 SCK=
6、1;/*/*写入 DS1302 */*/void Write_Ds1302(unsigned char address,unsigned char dat)RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();/启动 Write_Ds1302_Byte(address);/发送地址 Write_Ds1302_Byte(dat);/发送数据 RST=0;/恢复 /*/*读出 DS1302数据 */*/unsigned char Read_Ds1302(unsigned char address)unsigned char i,temp=0 x00;RST=0;_no
7、p_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byte(address);for(i=0;i=1;/右移一位 _nop_();_nop_();_nop_();SCK=1;RST=0;_nop_();/以下为 DS1302复位的稳定时间 _nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return(temp);/返回
8、/*/*读时钟数据 */*/void Read_RTC(void)/读取 日历 unsigned char i,*p;p=read_rtc_address;/地址传递 for(i=0;i7;i+)/分 7 次读取 秒分时日月周年 l_tmpdatei=Read_Ds1302(*p);p+;/*/*设定时钟数据 */*/void Set_RTC(void)/设定 日历 unsigned char i,*p,tmp;for(i=0;i7;i+)/BCD处理 tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16
9、;Write_Ds1302(0 x8E,0X00);p=write_rtc_address;/传地址 for(i=0;i7;i+)/7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpdatei);p+;Write_Ds1302(0 x8E,0 x80);/*/*定时器中断函数 */*/void tim(void)interrupt 1 using 1 /中断,用于数码管扫描 static unsigned char i,num;TH0=0 xf5;TL0=0 xe0;P0=tablel_tmpdisplayi;/查表法得到要显示数字的数码段 switch(i)case 0:L
10、S138A=0;LS138B=0;LS138C=0;break;case 1:LS138A=1;LS138B=0;LS138C=0;break;case 2:LS138A=0;LS138B=1;LS138C=0;break;case 3:LS138A=1;LS138B=1;LS138C=0;break;case 4:LS138A=0;LS138B=0;LS138C=1;break;case 5:LS138A=1;LS138B=0;LS138C=1;break;case 6:LS138A=0;LS138B=1;LS138C=1;break;case 7:LS138A=1;LS138B=1;LS138C=1;break;i+;if(i=8)i=0;num+;if(10=num)/隔段时间读取 1302的数据。时间间隔可以调整 ReadRTC_Flag=1;/使用标志位判断 num=0;