基于ds1302数字时钟芯片的数字时钟程序.docx_第1页
基于ds1302数字时钟芯片的数字时钟程序.docx_第2页
基于ds1302数字时钟芯片的数字时钟程序.docx_第3页
基于ds1302数字时钟芯片的数字时钟程序.docx_第4页
基于ds1302数字时钟芯片的数字时钟程序.docx_第5页
免费预览已结束,剩余4页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/* DS1302实时时钟实验 功能:在数码管上显示从DS1302读取的时间日期星期数据 时间格式:时-分-秒 日期格式:年月日-星期 S1:选择显示时间还是日期 S2:循环选择所要编辑的位 S3:编辑的位的数值加1 S4:编辑的位的数值减1*/#include #include #define uchar unsigned charuchar Code12=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff; /共阳数码管编码表sbit DsySelect=P36; /控制数码管的74HC244所在IO口uchar BitCode=0x80; /数码管位码初值uchar DS13028=0,0,0,0,0,0,0,0; /秒,分,时,日,月,星期,年uchar DateBit8=0,0,0,0,0,0,10,0; /日期各位显示的数值uchar TimeBit8=0,0,10,0,0,10,0,0; /时间各位显示的数值sbit DATA=P11; /数据传送总线sbit SCLK=P10; /时钟控制总线sbit RST=P12; /复位总线sbit S1=P34; /S1输入口sbit S2=P35; /S2输入口sbit S3=P32; /S3输入口sbit S4=P33; /S4输入口uchar TimeFlag=0; /显示日期时间标志uchar EditFlag=0; /闪烁显示标志uchar S2Num=0; /S2按的次数uchar num=0;/向DS1302写一字节数据,address为命令字节void WriteByte(uchar Command,uchar WriteData)uchar j,k=1;RST=0;SCLK=0;RST=1;for(j=0;j=7;j )if(Command&k) DATA=1;else DATA=0;SCLK=1;k=1;SCLK=0;k=1;for(j=0;j=7;j )if(WriteData&k) DATA=1;else DATA=0;SCLK=1;k=1;SCLK=0;RST=0;/读取DS1302一字节数据,address为命令字节uchar ReadByte(uchar Command)uchar i,k=1;RST=0;SCLK=0;RST=1;for(i=0;i8;i )if(Command&k) DATA=1;else DATA=0;SCLK=1;k=1;if(i!=7) SCLK=0;k=0;for(i=0;i=1;SCLK=0;if(DATA) k|=0x80;SCLK=1;RST=0;return(k);/延时程序void delay(uchar ms)uchar i;while(ms-)for(i=0;i125;i );/扫描显示程序void Display()uchar i;for(i=0;i0) /判断是否闪烁if(TimeFlag) /判断日期还是时间闪烁switch(S2Num) /根据S2按的次数判断日期那一位闪烁case 1:P2=BitCode&0x3F;break;case 2:P2=BitCode&0xCF;break;case 3:P2=BitCode&0xF3;break;case 4:P2=BitCode&0xFE;break;elseswitch(S2Num) /根据S2按的次数判断时间那一位闪烁case 1:P2=BitCode&0x3F;break;case 2:P2=BitCode&0xE7;break;case 3:P2=BitCode&0xFC;break;elseP2=BitCode; /输出位码if(TimeFlag) P0=CodeDateBiti; /判断显示时间还是日期elseP0=CodeTimeBiti;BitCode=_cror_(BitCode,1); /位码循环右移一位delay(1); /延时1msP0=0xFF;/时间编辑程序void TimeEdit(uchar flag)uchar Data,NowData;if(flag) /判断加1还是减1switch(S2Num) /判断编辑时间的哪一位case 1:Data=ReadByte(0x85); /读取小时数据NowData=Data 1;if(NowData&0x0F)9) NowData=NowData 6;if(NowData=0x24) NowData=0;WriteByte(0x84,NowData); /写入小时数据break;case 2:Data=ReadByte(0x83); /读取分数据NowData=Data 1;if(NowData&0x0F)9) NowData=NowData 6;if(NowData=0x60) NowData=0;WriteByte(0x82,NowData); /写入分数据break;case 3:Data=ReadByte(0x81); /读取秒数据NowData=Data 1;if(NowData&0x0F)9) NowData=NowData 6;if(NowData&0x7F)=0x60) NowData=0;WriteByte(0x80,(NowData&0x7F)|(Data&0x80); /写入秒数据break;elseswitch(S2Num) /判断编辑时间的哪一位case 1:Data=ReadByte(0x85); /读取小时数据if(Data=0)NowData=0x23;elseNowData=Data-1;if(NowData&0x0F)9) NowData=NowData-6;WriteByte(0x84,NowData); /写入小时数据break;case 2:Data=ReadByte(0x83); /读取分数据if(Data=0)NowData=0x59;elseNowData=Data-1;if(NowData&0x0F)9) NowData=NowData-6;WriteByte(0x82,NowData); /写入分数据break;case 3:Data=ReadByte(0x81); /读取秒数据if(Data=0)NowData=0x59;elseNowData=Data-1;if(NowData&0x0F)9) NowData=NowData-6;WriteByte(0x80,(NowData&0x7F)|(Data&0x80); /写入秒数据break;/日期编辑程序void DateEdit(uchar flag)uchar Data,NowData;if(flag) /判断加1还是减1switch(S2Num) /判断编辑日期的哪一位case 1: /年加1Data=ReadByte(0x8d); /读取年数据NowData=Data 1; /年加1if(NowData&0x0F)9) NowData=NowData 6; /BCD调整if(NowData=0xA0) NowData=0; /年=100时,年=0WriteByte(0x8c,NowData); /年写入DS1302break;case 2:Data=ReadByte(0x89); /读取月数据NowData=Data 1; /月加1if(NowData&0x0F)9) NowData=NowData 6; /BCD调整if(NowData=0x13) NowData=1; /月=13,月=1WriteByte(0x88,NowData); /月写入DS1302break;case 3:Data=ReadByte(0x87); /读取日数据NowData=Data 1; /日加1if(NowData&0x0F)9) NowData=NowData 6; /BCD调整if(NowData=0x32) NowData=1; /日=32,日=1WriteByte(0x86,NowData); /日写入DS1302break;case 4:Data=ReadByte(0x8B); /读取星期数据NowData=Data 1; /星期加1if(NowData=8) NowData=1; /星期=8,星期=1WriteByte(0x8A,NowData); /星期写入DS1302break;elseswitch(S2Num)case 1: /年减1Data=ReadByte(0x8d); /读取年数据if(Data=0)NowData=0x99; /如果年=0,减1则为99elseNowData=Data-1; /年减1if(NowData&0x0F)9) NowData=NowData-6; /BCD调整WriteByte(0x8c,NowData); /年写入DS1302break;case 2:Data=ReadByte(0x89); /读取月数据NowData=Data-1; /月减1if(NowData&0x0F)9) NowData=NowData-6; /BCD调整if(NowData=0) NowData=0x12; /月=0,月=12WriteByte(0x88,NowData); /月写入DS1302break;case 3:Data=ReadByte(0x87); /读取日数据NowData=Data-1; /日减1if(NowData&0x0F)9) NowData=NowData-6; /BCD调整if(NowData=0) NowData=0x31; /日=0,日=31WriteByte(0x86,NowData); /日写入DS1302break;case 4:Data=ReadByte(0x8B); /读取星期数据NowData=Data-1; /星期减1if(NowData=0) NowData=7; /星期=0,星期=7WriteByte(0x8A,NowData); /星期写入DS1302break;/按钮功能函数void KeyFun(uchar key)ET0=0;switch(key)case 0x0E: /S1按下,切换显示日期还是时间TimeFlag=TimeFlag;S2Num=0;break;case 0x0D: /S2按下,S2Num加1S2Num ;if(TimeFlag0)&(S2Num=5) S2Num=0; /如果当前编辑的是日期并且S2Num=5,则编辑完毕,返回正常状态if(TimeFlag=0)&(S2Num=4) S2Num=0; /如果当前编辑的是时间并且S2Num=4,则编辑完毕,返回正常状态break;case 0x0B: /S3按下,所选位加1if(TimeFlag=0) TimeEdit(1); /判断编辑日期还是时间else DateEdit(1);break;case 0x07: /S4按下,所选位减1if(TimeFlag=0) TimeEdit(0); /判断编辑日期还是时间else DateEdit(0);break;ET0=1;/键盘扫描程序uchar KeyScan()uchar key=0x00;key|=S4;key=1;key|=S3;key=1;key|=S2;key=1;key|=S1;return key;/读取DS1302的秒,分,时,日,月,星期,年void ReadDS1302()uchar i;for(i=0;i=4;TimeBit4=DS13021&0x0F;TimeBit3=DS13021&0x70;TimeBit3=4;TimeBit1=DS13022&0x0F;TimeBit0=DS13022&0x30;TimeBit0=4;DateBit5=DS13023&0x0F;DateBit4=DS13023&0x30;DateBit4=4;DateBit3=DS13024&0x0F;DateBit2=DS13024&0x10;DateBit2=4;DateBit7=DS13025&0x07;DateBit1=DS13026&0x0F;DateBit0=DS13026&0xF0;DateBit0=4;/T0中断程序,读取和显示时间日期,更新闪烁标志void T0Int(void) interrupt 1TL0=0x00;TH0=0xb8;num ;if(num=15)EditFlag=EditFlag; /更新闪烁标志num=0;ReadDS1302();Display();/主函数main()uchar key

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论