基于单片机的电子时钟和显示屏的设计(编辑修改稿)内容摘要:

0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00, 0x00, 14 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20, 0x00, /*五 */ 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00, /*六 */ }。 /*半角数字点阵 8 乘 16*/ uchar code DIGITS[]= { 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F, 0x00,/*0*/ 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00, 0x00,/*1*/ 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30, 0x00,/*2*/ 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E, 0x00,/*3*/ 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24, 0x00,/*4*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E, 0x00,/*5*/ 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E, 15 0x00,/*6*/ 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00, 0x00,/*7*/ 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C, 0x00,/*8*/ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F, 0x00,/*9*/ }。 /*生日快乐歌的音符频率表 ,不同的频率由不同的延时值来决定 */ uchar code SONG_TONE[]= { 212,212,190,212,159,169,212,212,190,212,142,159 , 212,212,106,126,159,169,190,119,119,126,159,142,159,0 }。 /*生日快乐歌节拍表 ,节拍表决定了每个音符的演奏长短 */ uchar code SONG_LONG[]= { 9,3,12,12,12,24,9,3,12,12,12,24, 9,3,12,12,12,12,12,9,3,12,12,12,24,0 }。 void DelayMS(uint x) /*调用延时子函数 */ { uchar i。 while(x) for(i=0。 i120。 i++)。 } void PlayMusic()/*音乐播放函数 */ { uint i=0,j,k。 16 while(SONG_LONG[i]!=0||SONG_TONE[i]!=0) { /*播放各个音符 ,SONG_LONG 为拍 */for(j=0。 jSONG_LONG[i]*20。 j++) { SPK=~SPK。 /*SONG_TONE 延时表决定了每个音符的频率 */ for(k=0。 kSONG_TONE[i]/3。 k++)。 } DelayMS(100)。 /*下一个音符的索引 */ i++。 } } void Alarm(uchar t) /*温度报警函数 */ { uchar i,j。 for(i=0。 i200。 i++) { SPK=~SPK。 /*由参数 t 形成不同的频率 */ for(j=0。 jt。 j++)。 } } /*向 DS1302 写入一字节 */ void Write_A_Byte_TO_DS1302(uchar x) { uchar i。 for(i=0。 i8。 i++) { SDA=xamp。 1。 CLK=1。 CLK=0。 x=1。 17 } } /*从 DS1302 读取一字节 */ uchar Get_A_Byte_FROM_DS1302() { uchar i,b,t。 for(i=0。 i8。 i++) { b=1。 t=SDA。 b|=t7。 CLK=1。 CLK=0。 } /*BCD 码转换 */ return(b/16*10+b%16)。 } /*从 DS1302 指定位置读数 据 */ uchar Read_Data(uchar addr) } uchar dat。 RST=0。 CLK=0。 RST=1。 Write_A_Byte_TO_DS1302(addr)。 dat=Get_A_Byte_FROM_DS1302()。 CLK=1。 RST=0。 return dat。 } /*向 DS1302 某地址写入数据 */ void Write_DS1302(uchar addr,uchar dat) { CLK=0。 RST=1。 Write_A_Byte_TO_DS1302(addr)。 Write_A_Byte_TO_DS1302(dat)。 CLK=1。 RST=0。 } 18 /*设置时间 */ void SET_DS1302() { uchar i。 Write_DS1302(0x8E,0x00)。 /*秒分时日月年依次写入 */ for(i=0。 i7。 i++) { /*秒 ,分 ,时 ,日 ,月 ,星期 ,年的起始地址分别为0x80,0x82,0x84,0x86,0x88,0x8A,0x8C*/ Write_DS1302(0x80+2*i,(DateTime[i]/104)|(DateTime[i]%10))。 } Write_DS1302(0x8E,0x80)。 }/*读取当前时间 */ void GetTime() { uchar i。 for(i=0。 i7。 i++) { DateTime[i]=Read_Data(0x81+2*i)。 } } uchar isLeapYear(uint y)/*判断是否为闰年 */ { return (y%4==0amp。 amp。 y%100!=0)||(y%400==0)。 } /*********刷新星期 ******/ void RefreshWeekDay() { uint i,d,w=5。 /*已知 是周五 */ for(i=2020。 i2020+DateTime[6]。 i++) { 19 d=isLeapYear(i)?366:365。 w=(w+d)%7。 } d=0。 for(i=1。 iDateTime[4]。 i++) d+=MonthsDays[i]。 d+=DateTime[3]。 /*保存星期 ,0~6 表示星期日 ,星期一 ,二 ,三 ,四 ,五 ,六 ,为了与 DS1302 的星期格式匹配 , 返回值需要 加 1*/ DateTime[5]=(w+d)%7+1。 }/*蜂鸣器函数 */ void Beep(uchar t) { uchar i。 for(i=0。 i100。 i++) { SPK=~SPK。 DelayMS(t)。 } SPK=0。 } void DateTime_Adjust(char x)/*年月日时分 ++或 */ { switch(Adjust_Index) { case 6: /*年 0099*/ if(x==1amp。 amp。 DateTime[6]99) DateTime[6]++。 if(x==1amp。 amp。 DateTime[6]0) DateTime[6]。 /*获取 2 月天数 */ MonthsDays[2]=isLeapYear(2020+DateTime[6])?29:28。 /*如果年份变化后当前月份的天数大于上限则设为上限 */ if(DateTime[3]MonthsDays[DateTime[4]]) DateTime[3]=MonthsDays[DateTime[4]]。 20 RefreshWeekDay()。 /*刷新星期 */ break。 case 4: /*月 01 至 12*/ if(x==1amp。 amp。 DateTime[4]12) DateTime[4]++。 if(x==1amp。 amp。 DateTime[4]1) DateTime[4]。 /*获取 2 月天数 */ MonthsDays[2]=isLeapYear(2020+DateTime[6])?29:28。 /*如果年份变化后当前月份的天数大于上限则设为上限 */ if(DateTime[3]MonthsDays[DateTime[4]]) DateTime[3]=MonthsDays[DateTime[4]]。 RefreshWeekDay()。 /*刷新星期 */ break。 case 3: /*日 00 至 28/29/30/31。 调节之前首先根据年份得出该年中 2 月的天数 */ MonthsDays[2]=isLeapYear(2020+DateTime[6])?29:28。 /*再根据当前月份决定调节日期的上限 */ if(x==1amp。 amp。 DateTime[3]MonthsDays[DateTime[4]])。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。