《51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)》由会员分享,可在线阅读,更多相关《51单片机+带字库液晶12864+DS1302数字时钟C源程序(无按键修改功能)(10页珍藏版)》请在金锄头文库上搜索。
1、 51 单片机+带字库液晶 12864+DS1302 数字时钟 C 源程序(无按键修改功能)2009-10-19 16:47经过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了这个程序。目前还不能修改时间与日期,只是以预定时间以始。适用于开发板:51 单片机(AT89S52)+带字库液晶 12864(ST7920)+DS1302(实时时钟)实现功能:简单,数字时钟+日期(以后会不断完美)。C 语言源程序如下:#include #include #define uchar unsigned char#define uint unsigned int/*DS1302 端口设置 */s
2、bit SCK=P36; /DS1302 时钟sbit SDA=P34; /DS1302 IOsbit RST = P35; / DS1302 复位bit ReadRTC_Flag; /读 DS1302 全局变量/* 12864 端口定义*/#define LCD_data P0 /带字库液晶 12864 数据口sbit LCD_RS = P24; /寄存器选择输入 sbit LCD_RW = P25; /液晶读/写控制sbit LCD_EN = P26; /液晶使能控制sbit PSB=P21; /并口控制sbit RES=P23;uchar code dis1 = 电子设计天地; /液晶显
3、示的汉字uchar code dis2 = 有志者,事竟成!;uchar code dis4 = 0,1,2,3,4,5,6,7,8,9;unsigned char temp;#define delayNOP(); _nop_();_nop_();_nop_();_nop_();void lcd_pos(uchar X,uchar Y); /确定显示位置unsigned char l_tmpdate7=0,7,16,19,10,1,9;/秒分时日月周年 09-10-19 16:07:00code unsigned char write_rtc_address7=0x80,0x82,0x84,0
4、x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code unsigned char read_rtc_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d; 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
5、Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0/*/* */* 延时函数 */* */*/void delay(unsigned int m) /延时程序unsigned int i,j;for(i=0;i=1; /右移一位SCK=1; /*/void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0;_nop_();SCK=0;_nop_();RST=1; _nop_(); /启动Write_Ds1302_Byte(address); /发送地址
6、Write_Ds1302_Byte(dat); /发送数据RST=0; /恢复/*/unsigned char Read_Ds1302 ( unsigned char address )unsigned char i,temp=0x00;RST=0;_nop_();SCK=0;_nop_();RST=1;_nop_();Write_Ds1302_Byte(address);for (i=0;i=1; /右移一位SCK=1; RST=0;_nop_(); /以下为 DS1302 复位的稳定时间RST=0;SCK=0;_nop_();SCK=1;_nop_();SDA=0;_nop_();SDA=
7、1;_nop_();return (temp); /返回/*/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+
8、tmp*16;Write_Ds1302(0x8E,0X00);p=write_rtc_address; /传地址 for(i=0;i7;i+) /7 次写入 秒分时日月周年Write_Ds1302(*p,l_tmpdatei);p+; Write_Ds1302(0x8E,0x80);void tim(void) interrupt 1 using 1/中断,用于数码管扫描static unsigned char i,num;TH0=0xf5;TL0=0xe0;/P0=tablel_tmpdisplayi; /查表法得到要显示数字的数码段/P2=table1i;i+;if(i=8)i=0;num+;if(20=num) /隔段时间读取 1302 的数据。时间间隔可以调整ReadRTC_Flag=1; /使用标志位判断num=0;/*END */以上经过在开发板上调试 OK。下面讲一下调试经验与大家分享。首先用液晶显示 DS1302 分三步走。第一步:搞清楚液晶 12864(带字库,方便使用),也就是怎样让其显示汉字及字符。第二步:搞清楚 DS1302 怎样用,怎样写入与显示出时间数据。第三步:把上面两步程序合在一起进行调试,当然要注意各端口的定义与连接。这里并不能修改时间日期,以后会进一步研究。总之,在液晶显示学习上又进一步了。路要一步步走。