




免费预览已结束,剩余16页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
DS1302可调时钟日历程序简介: 8为数码管显示 通过切换时间日历 时间格式位XXXX分别为时分秒 日历格式为XX分别为月日星期在时间显示时,通过按K2实现时、分、秒的闪烁切换 在日期显示时,通过按K2实现月、日、星期的闪烁切换 在任意数码管闪烁时,短按K3,该闪烁位值增1,短按K4,该闪烁位值减1 在任意数码管闪烁时,长按K3,该闪烁位值连续增1,长按K4,该闪烁位值连续减1 在任意调节状态,短按K5,正常显示时间 (程序经硬件实际测试通过,采用共阳数码管,程序放在WORD中有点乱,复制到KILE中就好了)DS1302时钟电路图DS1302程序 #include #define uchar unsigned char #define uint8 unsigned int sbit io_DS1302_RST = P15 ; sbit io_DS1302_IO = P16 ; sbit io_DS1302_SCLK = P17 ; sbit duan=P10;sbit wei=P12;char shi,fen,miao,day,month,year,week,k,tiaoshijian,tiaoriqi,bb;uchar table12=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf; uchar table111=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x80,0x90,0xbf,0xbf; #define KEY_1 0x0e #define KEY_2 0x0d#define KEY_3 0x0b#define KEY_4 0x07#define KEY_5 0x10#define KEY_NULL 0x1f#define KEY_PRESS 0x80 #define KEY_LONG 0x40#define KEY_STATE_INIT 0 #define KEY_STATE_PRESS 1#define KEY_STATE_LONG 2#define KEY_STATE_UP 3#define KEY_LONG_PERIOD 20 #define KEY_CONTINUE_PERIOD 10bit set;bit dao1S=0; bit dao2MS=0;bit dao10MS;bit ss,mm,ff,yue,tian,xq; sbit key1=P30; sbit key2=P31;sbit key3=P32;sbit key4=P33;sbit key5=P34;int main_flag=0,exit_flag,up_flag,down_flag; int tab=0,0,0,0,0,0; uchar weitable=0x01,0x02,0x04,0x08,0x10,0x20;uchar tab1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;void nint() TMOD=0X01; TH0=0XF8; TL0=0XCC; TR0=1; ET0=1; uchar KeyScan() if(key1=0) return KEY_1; if(key2=0) return KEY_2; if(key3=0) return KEY_3; if(key4=0) return KEY_4;if(key5=0) return KEY_5; return KEY_NULL;uchar GetKey()uchar keyRetu=0,keyTemp=KEY_NULL; static uchar s_keyState=KEY_STATE_INIT,keyTime=0,keyLast=KEY_NULL; keyTemp=KeyScan();switch (s_keyState) case KEY_STATE_INIT: if(keyTemp!=KEY_NULL) s_keyState=KEY_STATE_PRESS; break; case KEY_STATE_PRESS: if(keyTemp!=KEY_NULL) s_keyState=KEY_STATE_LONG; keyTime=0; keyLast=keyTemp; else s_keyState=KEY_STATE_INIT; break; case KEY_STATE_LONG: if(keyTemp=KEY_NULL) s_keyState=KEY_STATE_INIT; keyRetu=(keyLast|KEY_PRESS); else if(+keyTime=KEY_LONG_PERIOD) s_keyState=KEY_STATE_UP; keyTime=0; break; case KEY_STATE_UP: if(keyTemp=KEY_NULL) s_keyState=KEY_STATE_INIT; else if(+keyTime=KEY_CONTINUE_PERIOD) keyTime=0; keyRetu=(keyLast|KEY_LONG); break;return keyRetu; uchar bcdtoasc(uchar cha) return (cha/16)*10+(cha%16); uchar asctobcd(uchar cha) return (cha/10)*16+(cha%10); void timer() interrupt 1 static count=0;static count1=0;TH0=0XF8;TL0=0XCC;dao2MS=1;count+;if(+count1=10) count1=0; dao10MS=1; if(!(count%25) set = !set;if(count=500) count=0; dao1S=1; /-常数宏-/ #define DS1302_SECOND_WRITE 0x80 /写时钟芯片的寄存器位置 #define DS1302_MINUTE_WRITE 0x82 #define DS1302_HOUR_WRITE 0x84 #define DS1302_WEEK_WRITE 0x8A #define DS1302_DAY_WRITE 0x86 #define DS1302_MONTH_WRITE 0x88 #define DS1302_YEAR_WRITE 0x8C #define DS1302_SECOND_READ 0x81 /读时钟芯片的寄存器位置 #define DS1302_MINUTE_READ 0x83 #define DS1302_HOUR_READ 0x85 #define DS1302_WEEK_READ 0x8B #define DS1302_DAY_READ 0x87 #define DS1302_MONTH_READ 0x89 #define DS1302_YEAR_READ 0x8D /-操作宏-/ #define DS1302_SCLK_HIGH io_DS1302_SCLK = 1 ; #define DS1302_SCLK_LOW io_DS1302_SCLK = 0 ; #define DS1302_IO_HIGH io_DS1302_IO = 1 ; #define DS1302_IO_LOW io_DS1302_IO = 0 ; #define DS1302_IO_READ io_DS1302_IO #define DS1302_RST_HIGH io_DS1302_RST = 1 ; #define DS1302_RST_LOW io_DS1302_RST = 0 ; /* * 保存时间数据的结构体 * */ struct uint8 Second ; uint8 Minute ; uint8 Hour ; uint8 Day ; uint8 Week ; uint8 Month ; uint8 Year ; CurrentTime ; /* * Function: static void v_DS1302Write_f( uint8 Content ) * * Description:向DS1302写一个字节的内容 * * Parameter:uint8 Content : 要写的字节 * * * */ void delay(uchar z) uchar a,b; for(a=z;a0;a-) for(b=110;b0;b-); static void v_DS1302Write_f( uint8 Content ) uint8 i ; for( i = 8 ; i 0 ; i- ) if( Content & 0x01 ) DS1302_IO_HIGH else DS1302_IO_LOW Content = 1 ; DS1302_SCLK_HIGH DS1302_SCLK_LOW /* * Function: static uint8 v_DS1302Read_f( void ) * * Description: 从DS1302当前设定的地址读取一个字节的内容 * * Parameter: * * Return: 返回读出来的值(uint8) * */ static uint8 v_DS1302Read_f( void ) uint8 i, ReadValue ; DS1302_IO_HIGH for( i = 8 ; i 0 ; i- ) ReadValue = 1 ; if( DS1302_IO_READ ) ReadValue |= 0x80 ; else ReadValue &= 0x7f ; DS1302_SCLK_HIGH DS1302_SCLK_LOW return ReadValue ; /* * Function: void v_DS1302WriteByte_f( uint8 Address, uint8 Content ) * * Description: 从DS1302指定的地址写入一个字节的内容 * * Parameter: Address: 要写入数据的地址 * * Content: 写入数据的具体值 * * Return: * */ void v_DS1302WriteByte_f( uint8 Address, uint8 Content ) DS1302_RST_LOW DS1302_SCLK_LOW DS1302_RST_HIGH v_DS1302Write_f( Address ) ; v_DS1302Write_f( Content ) ; DS1302_RST_LOW DS1302_SCLK_HIGH /* * Function: uint8 v_DS1302ReadByte_f( uint8 Address ) * * Description:从DS1302指定的地址读出一个字节的内容 * * Parameter:Address: 要读出数据的地址 * * * * Return: 指定地址读出的值(uint8) * */ uint8 v_DS1302ReadByte_f( uint8 Address ) uint8 ReadValue ; DS1302_RST_LOW DS1302_SCLK_LOW DS1302_RST_HIGH v_DS1302Write_f( Address ) ; ReadValue = v_DS1302Read_f() ; DS1302_RST_LOW DS1302_SCLK_HIGH return ReadValue ; /* * Function: void v_ClockInit_f( void ) * * Description:初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可) * * Parameter: * * * * Return: * */ void v_ClockInit_f( void ) if( v_DS1302ReadByte_f( 0xc1) != 0xf0 ) v_DS1302WriteByte_f( 0x8e, 0x00 ) ; /允许写操作 v_DS1302WriteByte_f( DS1302_YEAR_WRITE, 0x11 ) ; /年 v_DS1302WriteByte_f( DS1302_WEEK_WRITE, 0x01 ) ; /星期 v_DS1302WriteByte_f( DS1302_MONTH_WRITE, 0x01 ) ; /月 v_DS1302WriteByte_f( DS1302_DAY_WRITE, 0x03 ) ; /日 v_DS1302WriteByte_f( DS1302_HOUR_WRITE, 0x15 ) ; /小时 v_DS1302WriteByte_f( DS1302_MINUTE_WRITE, 0x21 ) ; /分钟 v_DS1302WriteByte_f( DS1302_SECOND_WRITE, 0x30 ) ; /秒 v_DS1302WriteByte_f( 0x90, 0xa5 ) ; /充电 v_DS1302WriteByte_f( 0xc0, 0xf0 ) ; /判断是否初始化一次标识写入 v_DS1302WriteByte_f( 0x8e, 0x80 ) ; /禁止写操作 /* * Function: void v_ClockUpdata_f( void ) * * Description:读取时间数据,并保存在结构体CurrentTime中 * * Parameter: * * * * Return: * */ void v_ClockUpdata_f( void ) CurrentTime.Second = v_DS1302ReadByte_f( DS1302_SECOND_READ ) ; CurrentTime.Minute = v_DS1302ReadByte_f( DS1302_MINUTE_READ ) ; CurrentTime.Hour = v_DS1302ReadByte_f( DS1302_HOUR_READ ) ; CurrentTime.Day = v_DS1302ReadByte_f( DS1302_DAY_READ ) ; CurrentTime.Month = v_DS1302ReadByte_f( DS1302_MONTH_READ ) ; CurrentTime.Week = v_DS1302ReadByte_f( DS1302_WEEK_READ ) ; CurrentTime.Year = v_DS1302ReadByte_f( DS1302_YEAR_READ ) ; void updata() miao = (CurrentTime.Second&0x70)4)&0x0f)*10 + (CurrentTime.Second&0x0F); fen = (CurrentTime.Minute&0x70)4)&0x0f)*10 + (CurrentTime.Minute&0x0F); shi = (CurrentTime.Hour&0x30)4)&0x0f)*10 + (CurrentTime.Hour&0x0F); day=(CurrentTime.Day&0x30)4)&0x0f)*10 + (CurrentTime.Day&0x0F); month=(CurrentTime.Month&0x10)4)&0x0f)*10 + (CurrentTime.Month&0x0F); week=CurrentTime.Week; year=(CurrentTime.Year&0xf0)4)&0x0f)*10 + (CurrentTime.Year&0x0F); void displayriqi() /因为当LE为1时,锁存器是透明的,应该先使P0清零,即一个段也不被点亮 duan=1; / 打开段锁存器 P0=tablemonth%10; / 将第1位的值放入锁存器 ,显示第1位if(set&yue) P0=0XFF; duan=0; /关闭段锁存器,将内容锁存 wei=1; /开位锁存器 P2=0x40; /位选通 wei=0; /关位锁存器 delay(10); duan=1; P0=tablemonth/10; /显示第2位if(set&yue) P0=0XFF; duan=0; wei=1; P2=0x80; wei=0; delay(10);duan=1; P0=table11; /显示_ duan=0; wei=1; P2=0x20; wei=0; delay(10); duan=1; P0=tableday%10; /显示第3位if(set&tian) P0=0XFF; duan=0; wei=1; P2=0x08; wei=0; delay(10); duan=1; P0=tableday/10; /显示第4位if(set&tian) P0=0XFF; duan=0; wei=1; P2=0x10; wei=0; delay(10);duan=1; P0=table1week;if(set&xq) P0=0XFF; duan=0; wei=1; P2=0x01; wei=0; delay(10); /if(set&(k=main_flag-1) /P0=0XFF;void dispalyshijian() duan=1; / 打开段锁存器 P0=tablemiao%10; / 将第1位的值放入锁存器 ,显示第1位if(set&mm) P0=0XFF; duan=0; /关闭段锁存器,将内容锁存 wei=1; /开位锁存器 P2=0x01; /位选通 wei=0; /关位锁存器 delay(5); duan=1; P0=tablemiao/10; /显示第2位if(set&mm) P0=0XFF; duan=0; wei=1; P2=0x02; wei=0; delay(5);duan=1; P0=table11; /显示_ duan=0; wei=1; P2=0x04; wei=0; delay(5); duan=1; P0=tablefen%10; /显示第3位if(set&ff) P0=0XFF; duan=0; wei=1; P2=0x08; wei=0; delay(5); duan=1; P0=tablefen/10; /显示第4位if(set&ff) P0=0XFF; duan=0; wei=1; P2=0x10; wei=0; delay(5); duan=1; P0=table11; /显示_ duan=0; wei=1; P2=0x20; wei=0; delay(5); duan=1; P0=tableshi%10; /显示第5位if(set&ss) P0=0XFF; duan=0; wei=1; P2=0x40; wei=0; delay(5); duan=1; P0=tableshi/10; /显示第6位if(set&ss) P0=0XFF; duan=0; wei=1; P2=0x80; wei=0; / delay(5); void main() v_ClockInit_f(); nint(); EA=1; while(1) v_ClockUpdata_f(); updata(); if(main_flag=1) displayriqi(); else dispalyshijian(); if(dao10MS) dao10MS=0; switch (GetKey() case (KEY_1|KEY_PRESS): if(+main_flag=2) main_flag=0; break; case (KEY_2|KEY_PRESS): switch (main_flag) case 0: if(+tiaoshijian=5) tiaoshijian=0; switch(tiaoshijian) case 1: mm=0; ss=1; break; case 2: ss=0; ff=1; break; case 3: ff=0; mm=1; break; case 4: ff=0; mm=0;ss=0; break; break; case 1: if(+tiaoriqi=5) tiaoriqi=0; switch(tiaoriqi) case 1: xq=0; yue=1; break; case 2: yue=0; tian=1; break; case 3: tian=0; xq=1; break; case 4: tian=0; xq=0;yue=0; break; break; case (KEY_3|KEY_PRESS): if(main_flag=0)&(ss=1)/调小时 v_DS1302WriteByte_f(0x8e,0x00); /关写保护 shi=bcdtoasc(CurrentTime.Hour); shi+=1; if(shi=24) shi=0; shi=asctobcd(shi); v_DS1302WriteByte_f(0x84,shi); /write_add(0x04,shi);/写分数据 / shi=read_add(0x04)&0x3f;/读取秒数据 CurrentTime.Hour = v_DS1302ReadByte_f( DS1302_HOUR_READ ) ; shi=(CurrentTime.Hour&0x30)4)&0x0f)*10 + (CurrentTime.Hour&0x0F); v_DS1302WriteByte_f(0x8e,0x80); /开写保护 dispalyshijian(); else if(main_flag=0)&(ff=1) /调分钟 v_DS1302WriteByte_f(0x8e,0x00); /关写保护 fen=bcdtoasc(CurrentTime.Minute); fen+=1; if(fen=60) fen=0; fen=asctobcd(fen); v_DS1302WriteByte_f(0x82,fen); /write_add(0x04,shi);/写分数据 / shi=read_add(0x04)&0x3f;/读取秒数据 CurrentTime.Minute = v_DS1302ReadByte_f(DS1302_MINUTE_READ ) ; fen=(CurrentTime.Minute&0x70)4)&0x0f)*10 + (CurrentTime.Minute&0x0F); v_DS1302WriteByte_f(0x8e,0x80); /开写保护 dispalyshijian(); else if(main_flag=0)&(mm=1)/调秒 v_DS1302WriteByte_f(0x8e,0x00); /关写保护 miao=bcdtoasc(CurrentTime.Second); miao+=1; if(miao=60) miao=0; miao=asctobcd(miao); v_DS1302WriteByte_f(0x80,miao); /write_add(0x04,shi);/写分数据 / shi=read_add(0x04)&0x3f;/读取秒数据 CurrentTime.Second= v_DS1302ReadByte_f(DS1302_SECOND_READ ) ; miao=(CurrentTime.Second&0x70)4)&0x0f)*10 + (CurrentTime.Second&0x0F); v_DS1302WriteByte_f(0x8e,0x80); /开写保护 dispalyshijian(); else if(main_flag=1)&(yue=1)/调月份 v_DS1302WriteByte_f(0x8e,0x00); /关写保护 month=bcdtoasc(CurrentTime.Month); month+=1; if(month=13) month=0; month=asctobcd(month); v_DS1302WriteByte_f(0x88,month); CurrentTime.Month = v_DS1302ReadByte_f( DS1302_MONTH_READ ) ; month=(CurrentTime.Month&0x10)4)&0x0f)*10 + (CurrentTime.Month&0x0F); v_DS1302WriteByte_f(0x8e,0x80); /开写保护 dispalyshijian(); else if(main_flag=1)&(tian=1)/调日 v_DS1302WriteByte_f(0x8e,0x00); /关写保护 day=bcdtoasc(CurrentTime.Day); day+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 收银设备销售合同范本
- 商业种植花卉合同范本
- 个人销售酒合同范本
- 厂房公摊合同范本
- 铲车机械费合同范本
- 物业委托 服务合同范本
- 珠宝订货定金合同范本
- 社区居务基础知识培训课件
- 大棚购销合同范本
- 社区安全知识培训课件记录
- 2022年上海市法院系统辅助文员招聘128人笔试备考题库及答案解析
- 北师大版九年级数学上九年级第一二单元综合数学试题
- 二级建造师成绩复核申请
- 全过程工程咨询服务技术方案
- GB/T 35568-2017中国荷斯坦牛体型鉴定技术规程
- GB/T 28707-2012碟簧支吊架
- GB/T 2791-1995胶粘剂T剥离强度试验方法挠性材料对挠性材料
- GB/T 25702-2010复摆颚式破碎机颚板磨耗
- GB 29541-2013热泵热水机(器)能效限定值及能效等级
- 住宅项目实测实量操作指引(图文并茂)
- 流体力学-流体力学基本方程课件
评论
0/150
提交评论