1、完整C程序源代码/* 主程序:顶层程序 * * 显示默认功能:时间日期显示; * 调用子程序; * */# include # include zimo.h /字模程序;nokia5110.h/5110驱动程序;ds1302.h /ds1302驱动程序;key.h /按键扫描程序;printf.h /显示函数;power.h /电源模块;main.h /引脚定义;delay.h /延时函数;macroandconst.h/数据类型宏定义;ADC.H /ADC电压测量ds18b20.h /温度模块;void main() system_inint(); /系统初始化; /Set_RTC(); w
2、hile(1) checkclock(); caidan(); /菜单显示; if(menue=0) if(ok=1) LCD_clear(); /清屏幕 while(menue=0) /由此进入时钟功能 ok=0; logo(); Read_RTC();/读取时钟; data_change();/时钟数据处理 tiaozheng_flag(); date_time(); /显示年月日时分秒; week();/星期处理; set_date_time();/设置改变时间和日期; powervcc(); LCD_clear(); else if(menue=1) /由此进入温度检测功能 while
3、(menue=1) temperatuercheck(); else if(menue=2) /由此进入电压测量功能 while(menue=2) power();/电量检测 else if(menue=3)/由此进入闹钟功能 while(menue=3) clock(); else LCD_clear();void extern0() interrupt 0 /*外部中断0中断函数定义;*/key(); * 子程序:底层程序 * * 功能:时间日期数据处理; * *stc12c5a60s2.hsbit SCK = P02; /DS1302时钟;sbit SDA = P01; /DS1302数
4、据;sbit RST = P00;/ DS1302复位;uchar l_tmpDate=0,0,0,1,1,1,13;/秒分时日月周年08-05-15 12:00:00uchar l_tmpdisplay13;code uchar Write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位code uchar Read_RTC_address7=0x81,0x83,0x85,0x87,0x89,0x8b,0x8d;/*/* 写一个字节 */void Write_Ds1302_Byte(unsigned char
5、temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; /* 写入DS1302 */void Write_Ds1302( unsigned char address,unsigned char dat ) RST=0; _nop_(); SCK=0; RST=1; _nop_(); /启动 Write_Ds1302_Byte(address); /发送地址 Write_Ds1302_Byte(dat); /发送数据 /恢复/* 读出DS1302数据 */unsigned char Read_Ds1302 ( uchar address ) unsig
6、ned char i,temp=0x00; for (i=0;i+) /循环8次 读取数据 if(SDA) temp|=0x80; /每次传输低字节 temp SCK=1; SCK=0; /以下为DS1302复位的稳定时间 RST=0; SDA=0; SDA=1; return (temp); /返回/* 读时钟数据 */void Read_RTC(void) /读取 日历 unsigned char i,*p; p=Read_RTC_address; /地址传递 for(i=0;7;i+) /分7次读取 秒分时日月周年 l_tmpDatei=Read_Ds1302(*p); p+;/* 设定
7、时钟数据 */void Set_RTC(void) /设定 日历 uchar i,*p,tmp;i+) /BCD处理 tmp=l_tmpDatei/10; l_tmpDatei=l_tmpDatei%10; l_tmpDatei=l_tmpDatei+tmp*16; Write_Ds1302(0x8E,0X00); /关闭写保护; p=Write_rtc_address; /传地址 for(i=0;i+) /7次写入 秒分时日月周年 Write_Ds1302(*p,l_tmpDatei); p+; Write_Ds1302(0x8E,0x80); /打开写保护;底层程序 * 按键处理,键值显示
8、;eeprom.huchar set=0; /按键选择标志位;char key_flag=0;/按键加减标志位;uchar menue=0; /菜单选择标志位;uchar ok=0; /确认标志位;char miao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;uchar clocktable5; /分,时,星期;char hour=7;char minute=30;char week2=1;void Delay10ms() /11.0592MHz unsigned char i, j; i = 108; j = 145; do while (-j); while
9、 (-i);void key() EA=0; /*判断选择按键是否按下;如果按下了当松开的时候让背光打开;set+; if(keyswitch=0) Delay10ms(); if(keyswitch=0) Delay10ms(); while(keyswitch=0); LCD_BLA=1; if(set8)set=0; set+; /*up和down按键的检测;加减标志位*/ if(keyup=0) Delay10ms(); if(keyup=0) LCD_BLA=1; Delay10ms(); while(keyup=0); key_flag+; if(keydown=0) if(key
10、down=0) while(keydown=0); key_flag-; if(keymenue=0) if(keymenue=0) /菜单选择标志位; while(keymenue=0); LCD_BLA=1; menue+; if(menue3)menue=0; if(keyok=0) if(keyok=0) /确认标志位; while(keyok=0); ok+; if(ok1)ok=0; set=0;LCD_BLA=0;TR0 = 0; if(set=2)TR0 = 0; EA=1;void set_date_time()if(set=2)/ while(keyup=0|keydown
11、=0); miao=l_tmpdisplay10*10+l_tmpdisplay11; miao=miao+key_flag; if(key_flag59)miao=0; miao=miao%10+(miao/10)*16; Write_Ds1302(0x8E,0x00); Write_Ds1302(0x80,miao); Write_Ds1302(0x8E,0x80);if(set=3) / while(keyup=0|keydown=0); fen=l_tmpdisplay8*10+l_tmpdisplay9; fen=fen+key_flag; if(fen59) fen=0; if(k
12、ey_flag&(fen23)shi=0;(shi31)ri=1;(ri12)yue=1;(yue7)zhou=1;(zhou79)nian=0;(nian0)nian=79; nian=nian%10+(nian/10)*16; Write_Ds1302(0x8C,nian);key_flag=0;void caidan() uchar counter; uchar function; /*光标显示位置控制*/ if(menue=0) LCD_write_hanzi(0,4,10);Delay1ms(120);LCD_write_hanzi(0,0,3);LCD_write_hanzi(0,2,10);LCD_write_hanzi(4,0,10