長期以來,一直想做一個大數碼管萬年歷,但大數碼管筆段大都為幾個LED串聯組成,顯示部分需要較高的電壓,不能與單片機共用5v電源。這將使電路復雜化。前些時候受本論壇一個網友的啟發,時間顯示部分用多只LED并聯組成8字形“數碼管”,公歷農歷日期溫度都用0.8吋數碼管,制作萬年歷成功,用手機充電器供電,十分方便。單片機用STC89c52RC,時間獲取用DS12C887,顯示驅動用三支7219級聯完成。電路圖手工諒解制作,畫的不好,望網友們諒解。
電路原理圖如下:
萬年歷原理圖.PNG (94.48 KB, 下載次數: 35)
下載附件
2022-10-23 11:00 上傳
單片機源程序如下:
- /*************說明*************************************************
- 1.程序主體部分參照ds1302+max7219級聯驅動24位數碼管萬年歷程序編輯修改
- 2.7219初始化要設置0x09,0x0a,0x0b,0x0c,0x0f五個控制寄存器,并且要在
- 顯示之前初始化,否則可能出現顯示錯誤
- 3.ds12c887初始化程序兩項主要內容1為控制寄存器參數,2為初次設置的時間
- 日期。兩項可合為一函數,887初始化僅限1次,一旦開啟887運行,由于887由
- 芯片內部電池供電,數據不會丟失,因此不需要再次寫入
- 4.由于7219選擇不譯碼和語音報時函數都需要十進制數據,887設置為二進制,
- 即B寄存器設置DM=1 (要注意,一些中文資料DM=0是錯誤的)
- *************************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #include <yyxp.h>
- #include <string.h>
- #include <absacc.h> //頭文件
- #include "eeprom52.h"
- #include "ds18b20.h"
- #include "max7219.h"
- #define uc unsigned char //宏定義
- #define ui unsigned int
- #include "gton.h"
- /*----定義DS12C887數據線---*/
- //#define Ds_DATA P0 //DS12CR887數據總線,P0.0-P0.7對應連接AD0-AD7
- sbit ds_cs = P2^4;
- sbit ds_as = P2^5;
- sbit ds_rw = P2^6;
- sbit ds_ds = P2^7;
- /*----定義其它數據線---*/
- sbit s1=P1^4; //按鍵設置+確認
- sbit s2=P1^5; //加 ,運行狀態下為語音播報模式設置
- sbit s3=P1^6; //減, 運行狀態下為鬧鐘開關設置
- sbit s4=P1^7; //運行狀態下為語音報時開關
- sbit s5=P3^4; //運行狀態下為關閉報警
- sbit LED1 =P3^6; //鬧鐘指示燈
- sbit deng=P3^7; //秒燈
- sbit fmq=P2^3; //蜂鳴器
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- void display(); //顯示函數
- void sec_led(); //控制秒燈的函數
- void bofang(uc ms,uc *df);
- // 0 1 2 3 4 5 6 7 8 9
- uc code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x0d}; //不譯碼段選
- uc code tab1[]={0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb}; //帶小數點
- uc code dxy[]={0,1,2,1,0,1,0,1,1,0,1,0,1};
- uc set=0,ee; //設置鍵按下次數(菜單),定時器溢出次數
- char nian,yue,ri,xq,shi,fen,miao,nz_shi,nz_fen; //定義公歷年月日星期時分秒(十進制碼)
-
- bit bdata bs,tt,h; //整點報時標志位,設置完成標志位,秒燈控制標志位
- bit bj=0; //鬧鈴標志位
- bit zdbj=0; //中斷報警標志
- bit bjkg=0; //鬧鈴開關
-
- uc mode=0; //語音播報模式:1報時間;2報日期和時間;3報時間和溫度;4三項全報;5關閉
- uc disbuff[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //數組用于存放時間溫度距離等信息
- uc nl_nian,nl_yue,nl_ri; // 定義農歷年,月,日
- bit bdata bs,tt,h; //語音報時標志,時間設置完成標志位,秒燈標志位,
-
-
- /******************把數據保存到單片機內部eeprom中******************/
- void write_eeprom()
- {
- SectorErase(0x2000);
- byte_write(0x2000, nz_shi);
- byte_write(0x2001, nz_fen);
- byte_write(0x2002, bjkg);
- byte_write(0x2003, mode);
- byte_write(0x2060, a_a);
- }
- /******************把數據從單片機內部eeprom中讀出來*****************/
- void read_eeprom()
- {
- nz_shi = byte_read(0x2000);
- nz_fen = byte_read(0x2001);
- bjkg = byte_read(0x2002);
- mode = byte_read(0x2003);
- a_a = byte_read(0x2060);
- }
-
- /**************開機自檢eeprom初始化*****************/
- void init_eeprom()
- {
- read_eeprom(); //先讀
- if(a_a != 1) //新的單片機初始單片機內問eeprom
- {
- nz_shi = 12;
- nz_fen = 30;
- bjkg=0;
- mode=4;
- a_a = 1;
- write_eeprom(); //保存數據
- }
- }
- void delayms(ui x) //延時x毫秒
- {
- ui i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++);
- }
-
-
- /*****ds12c887函數*****/
- void write_ds12c887(uc add,uc date) //寫入地址和數據
- {
-
- //date=((date/10)*16)+(date%10); // 十進制轉換成DCB碼(僅在887設置為BCD數據格式時使用)
- ds_cs=0;
- ds_as=1;
- ds_ds=1;
- ds_rw=1;
- P0=add;
- ds_as=0;
- ds_rw=0;
- P0=date;
- ds_rw=1;
- ds_as=1;
- ds_cs=1;
- }
- uc read_ds12c887(uc add) //讀數據
- {
- uc time;
- ds_as=1;
- ds_ds=1;
- ds_rw=1;
- ds_cs=0;
- P0=add;
- ds_as=0;
- ds_ds=0;
- P0=0xff;
- time=P0;
- ds_as=1;
- ds_ds=1;
- ds_cs=1;
- // time=time/16*10+time%16; //BCD轉十進制
- return time;
- }
- void ds12c887() //讀取寫入ds12c887函數
- {
- if((tt==1)&&(set==0)) //當退出時間設定時,首先將設定的時間寫入芯片
- {
- tt=0;
- write_ds12c887(0x00,miao); //秒
- write_ds12c887(0x02,fen); //分
- write_ds12c887(0x04,shi); //時
- write_ds12c887(0x06,xq); //星期
- write_ds12c887(0x07,ri); //日
- write_ds12c887(0x08,yue); //月
- write_ds12c887(0x09,nian); //年
-
- }
- if(set==0)
- {
- miao=read_ds12c887(0x00);
- fen=read_ds12c887(0x02);
- shi=read_ds12c887(0x04);
- xq=read_ds12c887(0x06);
- ri=read_ds12c887(0x07);
- yue=read_ds12c887(0x08);
- nian=read_ds12c887(0x09);
-
- }
-
- }
- /*void DS12C887_init() //887初始化,設置887寄存器初始參數,僅限初次上電使用
- {
- write_ds12c887(10, 0x20); //DS12CR887寄存器A功能設置,開啟時鐘振蕩器
- write_ds12c887(11, 0x06); //寄存器B功能設置,不開啟鬧鐘中斷使能,數據模式為二進制,24小時模式。
- write_ds12c887(9, 22);
- write_ds12c887(8, 10);
- write_ds12c887(7, 6);
- write_ds12c887(6, 4);
- write_ds12c887(4, 12);
- write_ds12c887(2, 55);
- write_ds12c887(0, 58);
- } */
- /*****按鍵函數*****/
- void key()
- {
- ui out_set=0; //退出設置時間記數
- //out_clear=0;
-
- if(s1==0) //如果s1設置鍵按下
- { //
- delayms(5); //延時消抖 ()
- if(s1==0) //確認s1按下
- {
- while((s1==0)&&(set!=0)) //已確認s1按下并彈回時
- {
- display(); //顯示初始化數據
- out_set++; //
- if(out_set==300) // 如果設置鍵彈開時間達300毫秒
- {
- set=0;
- out_set=0;
- tt=0;
- fmq=0; //蜂鳴器短響一聲
- delayms(20);
- fmq=1;
- delayms(100);
- fmq=0;
- delayms(20);
- fmq=1;
- goto x;
- }
- }
-
- set++; //進入設置方式1
- if(set<10) //如果設置次數小于8
- {
- out_set=0; //退出設置
- fmq=0;
- delayms(10);
- fmq=1;
- }
- else
- {
- set=0; //設置次數歸0
- tt=1; //設置完成
- fmq=0;
- delayms(200);
- fmq=1;
- }
- x: while(!s1) //等待s1彈起
- {
- display();
- sec_led();
- }
- }
- }
-
- if(set!=0)
- {
- if(s2==0) //如果加鍵按下
- {
- delayms(5);
- if(s2==0)
- {
- fmq=0;
- delayms(10);
- fmq=1;
- if(set==1) //如果設置鍵按下次數為1(菜單1,設置年)
- {
- nian++; //年增加(隨著加鍵按下)
- if(nian==100)
- nian=0;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri>28)==1)//當平年二月day大于28時
- ri=28;
- }
- if(set==2) //如果設置菜單為2(設置月)
- {
- yue++; //月增加
- if(yue==13)
- yue=1;
- if((dxy[yue]==0)&&(ri>30)==1) //當小月day大于30時
- ri=30;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)//當平年二月day大于28時
- ri=28;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri>29)==1)//當閏年二月day大于29時
- ri=29;
- }
- if(set==3) //如果設置菜單為3(設置日)
- {
- ri++; //日增加
-
- if((dxy[yue]==0)&&(ri==31)==1) //當小月day被加到了31時
- ri=1;
- if((dxy[yue]==1)&&(ri==32)==1) //當大月day被加到32時
- ri=1;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri==29)==1) //當平年二月day被加到29時
- ri=1;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri==30)==1) //當閏年二月day被加到30時
- ri=1;
- }
- if(set==4) //如果設置菜單為4(設置星期)
- {
- xq++;
- if(xq==8)
- xq=1;
-
- }
- if(set==5) //如果設置菜單為5(設置時)
- {
- shi++;
- if(shi==24)
- shi=0;
-
- }
- if(set==6) //如果設置菜單為6(設置分)
- {
- fen++;
- if(fen==60)
- fen=0;
- }
- if(set==7) //如果設置菜單為7(設置秒)
- {
- miao++;
- if(miao==60)
- miao=0;
- }
- if(set==8) //如果設置菜單為8(設置鬧鐘時)
- {
- nz_shi++;
- if(nz_shi==24)
- nz_shi=0;
- write_eeprom(); //保存數據
- }
- if(set==9) //如果設置菜單為9(設置鬧鐘分)
- {
- nz_fen++;
- if(nz_fen==60)
- nz_fen=0;
- write_eeprom();
- }
- while(!s2) //等待加按鍵彈起
- {display();} //正常顯示
- }
- }
- if(s3==0) //如果減鍵按下
- {
- delayms(5);
- if(s3==0)
- {
- fmq=0;
- delayms(10);
- fmq=1;
- if(set==1) //如果設置菜單為1
- {
- nian--; //年減少
- if(nian==(-1))
- nian=99;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)
- ri=28;
- }
- if(set==2)
- {
- yue--;
- if(yue==0)
- yue=12;
- if((dxy[yue]==0)&&(ri>30)==1)
- ri=30;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)
- ri=28;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri>29)==1)
- ri=29;
- }
- if(set==3)
- {
- ri--;
-
- if((dxy[yue]==0)&&(ri==0)==1)
- ri=30;
- if((dxy[yue]==1)&&(ri==0)==1)
- ri=31;
- if((dxy[yue]==2)&&(nian%4==0)&&(ri==0)==1)
- ri=28;
- if((dxy[yue]==2)&&(nian%4!=0)&&(ri==0)==1)
- ri=29;
- }
- if(set==4)
- {
- xq--;
- if(xq==0)
- xq=7;
- }
- if(set==5)
- {
- shi--;
- if(shi==(-1))
- shi=23;
-
- }
- if(set==6)
- {
- fen--;
- if(fen==(-1))
- fen=59;
- }
- if(set==7) //如果設置菜單為7
- {
- miao--;
- if(miao==(-1))
- miao=59;
- }
- if(set==8)
- {
- nz_shi--;
- if(nz_shi==(-1))
- nz_shi=23;
- write_eeprom(); //保存數據
- }
- if(set==9)
- {
- nz_fen--;
- if(nz_fen==(-1))
- nz_fen=59;
- write_eeprom(); //保存數據
- }
- while(!s3)
- {display();}
- }
- }
- }
- if(set==0) //如果設置菜單為0,時日設置完成
- {
- if(s2==0) //如果s2按下
- {
- delayms(5);
- if(s2==0) //如果確認s2按下,語音報時模式選擇
- {
- fmq=0; //蜂鳴器短鳴一聲
- delayms(10);
- fmq=1;
- mode++;
- if(mode>5)
- mode=1;
- write_eeprom(); //保存數據
- }
- while(!s2);
- {display();}
- }
- if(s3==0) //如果s3按下,報警開關
- {
- delayms(5); //延時5毫秒
- if(s3==0)
- {
- fmq=0; //蜂鳴器短鳴一聲
- delayms(10);
- fmq=1;
- bjkg=~bjkg;
- write_eeprom();
- }
- while(!s4);
- {display();}
- }
- if(s4==0)
- {
- bofang(mode,disbuff);
- }
- if((s5==0)&&(bj==1)) //按鍵關閉鬧鐘
- {
- zdbj=1;
- bj=0;
- fmq=1;
- }
- }
- }
- //=====================================================================================
- //=====================================================================================
- /*****主顯示函數*****/
- void display()
- { // 年 月 日 時 分 溫度 秒
- uc x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15;
- //農歷月農歷日 鬧鐘時鬧鐘分
- uc y1,y2,y3,y4,y5,y6,y7,y8;
-
- x1=nian/10; //年十位
- x2=nian%10; //年個位
- x3=yue/10;
- x4=yue%10;
- x5=ri/10;
- x6=ri%10;
- x7=shi/10; //時十位
- x8=shi%10;
- x9=fen/10; //分十位
- x10=fen%10;
- x11=wendu/100; //溫度十位
- x12=(wendu%100)/10;
- x13=(wendu%100)%10;
- x14=miao/10; //秒十位
- x15=miao%10;
- y5=nz_shi/10; //鬧鐘時十位
- y6=nz_shi%10;
- y7=nz_fen/10; //鬧鐘分十位
- y8=nz_fen%10;
- InitDis_3();
- if(set!=1) // 設置年數據
- {
- WriteWord_3(0x07,tab[2]);
- WriteWord_3(0x08,tab[0]);
- WriteWord_3(0x01,tab[x1]);
- WriteWord_3(0x02,tab[x2]);
- }
- else if(set==1) // 寫入年數據
- {
- if(h==0) // 秒燈滅時寫入
- {
- WriteWord_3(0x07,tab[2]); //顯示2
- WriteWord_3(0x08,tab[0]); //顯示0
- WriteWord_3(0x01,tab[x1]); //顯示x1
- WriteWord_3(0x02,tab[x2]); //顯示x2
- }
- else // 秒燈亮時不顯示(秒燈閃爍顯示數據隨著閃爍)
- {
- WriteWord_3(0x07,tab[10]); //不顯示
- WriteWord_3(0x08,tab[10]); //
- WriteWord_3(0x01,tab[10]); //
- WriteWord_3(0x02,tab[10]); //不顯示
- }
- }
- if(set!=2) // 設置月數據
- {
- if(x3==0)
- { //如果月十位為0
- WriteWord_3(0x03,tab[10]); //不顯示
- WriteWord_3(0x04,tab[x4]);
- }
- else
- { //否則
- WriteWord_3(0x03,tab[x3]); //顯示x3
- WriteWord_3(0x04,tab[x4]);
- } //顯示x4
- }
- else if(set==2) // 寫入月數據
- {
- if(h==0)
- {
- if(x3==0)
- {
- WriteWord_3(0x03,tab[10]);
- WriteWord_3(0x04,tab[x4]);
- }
- else
- {
- WriteWord_3(0x03,tab[x3]);
- WriteWord_3(0x04,tab[x4]);
- }
- }
- else
- {
- WriteWord_3(0x03,tab[10]);
- WriteWord_3(0x04,tab[10]);
- }
- }
- if(set!=3) // 設置日數據
- {
-
- if(x5==0)
- {
- WriteWord_3(0x05,tab[10]);
- WriteWord_3(0x06,tab[x6]);
- }
- else
- WriteWord_3(0x05,tab[x5]);
- WriteWord_3(0x06,tab[x6]);
- }
- else if(set==3) // 寫入日數據
- {
- WriteWord_3(0x05,tab[x5]);
- WriteWord_3(0x06,tab[x6]);
-
- if(h==0)
- {
- if(x5==0)
- {
- WriteWord_3(0x05,tab[10]);
- WriteWord_3(0x06,tab[x6]);
- }
- else
- WriteWord_3(0x05,tab[x5]);
- WriteWord_3(0x06,tab[x6]);
- }
- else
- {
- WriteWord_3(0x05,tab[10]);
- WriteWord_3(0x06,tab[10]);
- }
- }
- InitDis_2();
-
- if(set!=4)
- {
- if(xq!=7)
- WriteWord_2(0x07,tab[xq]);
- else
- WriteWord_2(0x07,tab[(xq+1)]);
- }
- else if(set==4)
- {
- if(h==0)
- {
- if(xq!=7)
- WriteWord_2(0x07,tab[xq]);
- else
- WriteWord_2(0x07,tab[(xq+1)]);
- }
- else
- {
- WriteWord_2(0x07,tab[10]);
- }
- }
- if(set!=5) //設置時數據
- {
- if(x7==0)
- { //如果時十位是0
- WriteWord_2(0x01,tab[10]); //不顯示
- WriteWord_2(0x02,tab[x8]);
- }
- else //否則
- WriteWord_2(0x01,tab[x7]); //顯示時十位
- WriteWord_2(0x02,tab[x8]); //顯示時個位
- }
- else if(set==5) //寫入時數據
- {
- if(h==0) //秒燈滅寫入
- {
- if(x7==0)
- {
- WriteWord_2(0x01,tab[10]);
- WriteWord_2(0x02,tab[x8]);
- }
- else
- WriteWord_2(0x01,tab[x7]);
- WriteWord_2(0x02,tab[x8]);
- }
- else //秒燈亮不顯示
- {
- WriteWord_2(0x01,tab[10]);
- WriteWord_2(0x02,tab[10]);
- }
- }
- if(set!=6) //設置分
- {
- WriteWord_2(0x03,tab[x9]);
- WriteWord_2(0x04,tab[x10]);
- }
- else if(set==6) //寫入分
- {
- if(h==0)
- {
- WriteWord_2(0x03,tab[x9]);
- WriteWord_2(0x04,tab[x10]);
- }
- else
- {
- WriteWord_2(0x03,tab[10]);
- WriteWord_2(0x04,tab[10]);
- }
- }
-
- if(set!=7)
- {
- WriteWord_2(0x05,tab[x14]);
- WriteWord_2(0x06,tab[x15]);
- }
- else if(set==7)
- {
- if(h==0)
- {
- WriteWord_2(0x05,tab[x14]);
- WriteWord_2(0x06,tab[x15]);
- }
- else
- {
- WriteWord_2(0x05,tab[10]);
- WriteWord_2(0x06,tab[10]);
- }
-
- }
-
- InitDis_1();
- if(set==8)
- {
- WriteWord_1(0x05,tab[y5]);
- WriteWord_1(0x06,tab[y6]);
- }
- if(set==9)
- {
- WriteWord_1(0x07,tab[y7]);
- WriteWord_1(0x08,tab[y8]);
- }
- if(set==0) //如果時鐘走時時間設置菜單為0 ,時日設置完成
- {
-
- SunToMoon(nian,yue,ri); //調用農歷轉換
-
- y1=month_moon/10; //農歷月十位
- y2=month_moon%10;
- y3=day_moon/10; //農歷日十位
- y4=day_moon%10;
- if(y1==0)
- {
- WriteWord_1(0x01,tab[10]);
- WriteWord_1(0x02,tab[y2]);
- }
- else
- {
- WriteWord_1(0x01,tab[y1]); //顯示農歷月
- WriteWord_1(0x02,tab[y2]);
- }
- if(y3==0)
- {
- WriteWord_1(0x03,tab[10]);
- WriteWord_1(0x04,tab[y4]);
- }
- else
- {
- WriteWord_1(0x03,tab[y3]); //顯示農歷日
- WriteWord_1(0x04,tab[y4]);
- }
- if(x11==0)
- {
- WriteWord_1(0x05,tab[10]); //溫度十位為0不顯示
- WriteWord_1(0x06,tab1[x12]);
- WriteWord_1(0x07,tab[x13]);
- WriteWord_1(0x08,tab[11]); //顯示C
- }
- else //否則
- {
- WriteWord_1(0x05,tab[x11]); //顯示溫度
- WriteWord_1(0x06,tab1[x12]);
- WriteWord_1(0x07,tab[x13]);
- WriteWord_1(0x08,tab[11]); //顯示C
- }
- if(bjkg==1)
- LED1=0; //顯示鬧鐘開
- else
- LED1=1;
-
- }
- disbuff[0]=x1; //年十位值 數組0號數據
- disbuff[1]=x2; //年個位值 數組1號數據
- disbuff[2]=x3; //月十位值 數組2號數據
- disbuff[3]=x4; //月個位值 數組3號數據
- disbuff[4]=x5;
- disbuff[5]=x6; //日個位值
- disbuff[6]=xq; //星期 數組6號數據
- disbuff[7]=x7; //時十位值 數組7號數據
- disbuff[8]=x8; //時個位值
- disbuff[9]=x9; //分十位值
- disbuff[10]=x10; //分個位值
- disbuff[11]=x14; //秒十位值
- disbuff[12]=x15;
- disbuff[13]=x11; //溫度十位值
- disbuff[14]=x12; //溫度個位值
- disbuff[15]=x13; //溫度小數位值
-
-
- }
- /*****鬧鐘函數*****/
- void clock_dis()
- {
- if(zdbj==0&&bjkg==1&&set==0)
- {
- if(shi==nz_shi&&fen==nz_fen)
- bj=1;
- else
- {
- fmq=1;
- bj=0;
- }
- }
-
- }
- /*****語音報時函數*****/
- void bofang(uc broadcast,uc *str) //兩個參數(節目,數組指針)
- {
- uc length,length_finish; //根據芯片秒數聲明播放語句數(大約每句1秒)?
- // length=1;
- if(broadcast==1) //播放模式1 只報時間
- {
- length=15; //從第15句開始
- length_finish=26; //到第26句結束
- }
- else if(broadcast==2) //播放模式2 報時間和日期
- {
- length=0;
- length_finish=26;
- }
- else if(broadcast==3) //播放模式3 報時間和溫度
- {
- length=15;
- length_finish=33;
- }
- else if(broadcast==4) //播放模式4 報時間和日期 溫度
- {
- length=0; //從第0句開始
- length_finish=33; //到第33句結束
- }
- else //否則不播放 模式0
- {
- length=1; //從第1句開始
- length_finish=1; //到第1句結束
- }
-
- if(length<length_finish)
- {
- TR0=0; //關閉定時器
- //speak(25); //車站大廳音樂-------開機音樂 */
- while(length<length_finish/*&&flag_bofang*/) //最大32
- {
- if(yyxp_busy==1) //
- {
- if(length==15||length==26) //如果播報從15句或26句開始
- delayms(200); //延時0.2秒
- switch (length)
- { //x?
-
- case 0:speak(25);length++;break; //報時音樂
- case 1:speak(27); length++;break; //今天是
- case 2:if(*str!=0) speak(*str+1); else speak(1);length++;break; //年十位
- case 3:if(*(str+1)!=0) speak(*(str+1)+1); else speak(1);length++;break; //年個位
- case 4:speak(16);length++;break; //年
- case 5:if(*(str+2)!=0) {speak(11);length++;} else length++; break;//月十位 為1時播報十,為0時不播報
- case 6:if(*(str+3)!=0) {speak(*(str+3)+1);length++;} else length++;break; //月個位
- case 7:speak(17);length++;break; //月
- case 8:if(*(str+4)==1) length++; else if(*(str+4)>1) {speak(*(str+4)+1);length++;}else length+=2;break;//日十位 為1時跳到case 10播報十,大于1時播報數字并跳到case 10播報十,為0十時不播報跳到case 11
- case 9:speak(11);length++;break; //十
- case 10:if(*(str+5)!=0) {speak(*(str+5)+1);length++;} else length++;break; //日個位
- case 11:speak(18);length++;break; //日
- case 12:speak(19);length++;break; //星期
- case 13:if(*(str+6)==7) length++; else {speak(*(str+6)+1);length=16;} break; //
- case 14:speak(18);length+=2;break; //日
- case 15:speak(25);length++;break; //音樂1,3模式報
- case 16:speak(22);length++;break; //現在時刻北京時間
- case 17:if(*(str+7)==1) length++; else if(*(str+7)>1) {speak(*(str+7)+1);length++;}else length+=2;break; //
- //時十位 為1時跳到case 17播報十,大于1時播報數字并跳到case 17播報十,為0十時不播報跳到case 15
- case 18:speak(11);length++;break; //十
- case 19:if(*(str+8)!=0) speak(*(str+8)+1);if(*(str+7)==0&&*(str+8)==0)speak(1);length++;break; //時個位
- case 20:speak(13);length++;break; //點 ---此處修改speak(22為speak(13)
-
- case 21:
- if(*(str+9)==1)
- length++;
- else if(*(str+9)>1)
- {
- speak(*(str+9)+1);
- length++;
- }
- else if((*(str+9))==0&&(*(str+10))==0)
- {
- if((*(str+11))==0&&(*(str+12))==0)
- length=25;
- else
- length+=2;
- }
- else if((*(str+9))==0&&(*(str+10))!=0)
- {
- speak(1);length+=2;
- }
- break;
- //分十位 為1時跳到case 10播報十,大于1時播報數字并跳到case 10播報十,為0十時不播報跳到case 19
- case 22:speak(11);length++;break; //十
- case 23:if(*(str+10)!=0)speak(*(str+10)+1); if(*(str+9)==0&&*(str+10)==0)speak(1);length++;break; //分個位
- case 24:speak(14);length+=2;break; //分
-
- /*case 21:if(*(str+11)==1) length++; //不播報秒
- else if(*(str+11)>1) {speak(*(str+11)+1);length++;}
- else if(*(str+11)==0&&*(str+12)!=0){speak(1);length+=2;}
- else if(*(str+11)==0&&*(str+12)==0){length+=2;}break;
- //秒十位 為1時跳到case 22播報十,大于1時播報數字并跳到case 22播報十,秒十位為0秒個位不為0時播報0跳到case 23,
- //秒數據為0時不播報跳到case 23
- //case 22:speak(11);length++;break; //十
- //case 23:if(*(str+12)!=0) speak(*(str+12)+1);if(*(str+11)==0&&*(str+12)==0)speak(1);length++;break; //秒個位
- //case 24:speak(15);length=26;break; //秒 ---此處修改speak(24)為speak(15) */
- case 25:speak(26);length++;break; //整 ---此處修改speak(21)為speak(26)
-
- case 26:speak(23);length++;break; //當前溫度 ---- 此處修改speak(15)為speak(23)
-
- case 27:if(*(str+13)==1) length++; else if(*(str+13)>1) {speak(*(str+13)+1);length++;}else length+=2;break;//溫度十位 為1時跳到case 10播報十,大于1時播報數字并跳到case 10播報十,為0十時不播報跳到case 11
- case 28:speak(11);length++;break; //十
- case 29:if(*(str+14)!=0) speak(*(str+14)+1);length++;break; //溫度個位
- case 30:speak(13);length++;break; //點 ----此處修改speak(22)為speak(13)
- case 31:if(*(str+15)!=0) speak(*(str+15)+1);else speak(1);length++;break; //溫度小數位
- case 32:speak(20);length++;break; // 度----此處修改speak(16)為speak(20)
-
- }
- yydelay(2);
- }
- }
- TR0=1;
- while(!yyxp_busy); //等待播完
-
- bs=0;
- delayms(100);
- }
- }
- /*****秒燈控制函數*****/
- void sec_led(void)
- {
- if(set==0)
- deng=h; //秒燈閃爍
- if(set==1)
- deng=1; //按下set鍵關秒燈
-
- }
-
- /*****定時器T0*****/
- void init()
- {
- EA=1;
- ET0=1;
- TMOD=0x01;
- TH0=0x3c; //12M 50ms
- TL0=0xb0;
- TR0=1;
-
-
- }
-
- /*****主函數*****/
- void main()
- {
- uc aa;
- init(); //定時器初始化,啟動定時器0
- // DS12C887_init() // 初始化ds12c887,僅限初次使用,以后不必寫入
- // InitDis (); //初始化7219
-
-
- for(aa=0;aa<30;aa++) //10毫秒讀取一次溫度,讀取30次
- {
- ds18b20();
- delayms(10);
- }
- fmq=0; //蜂鳴器長鳴
- delayms(200);
- fmq=1;
- delayms(100);
- init_eeprom(); //eeprom初始化
- while(1) //循環執行
- {
- key(); //按鍵掃描
- ds12c887(); //獲取時間
- ds18b20(); //獲取溫度
- sec_led();
- display(); //顯示
- clock_dis(); //鬧鐘輸出
- if((fen==0)&&(miao==0)&&set==0) // hour,min,sec
- {
- if(shi>=7&&shi<=21) //7點到21點播報
- bs=1;
- if(bs==1)
- bofang(mode,disbuff);
- }
-
- /* if(shi>=7&&shi<=21) //白天亮度
- {
- WriteWord_1 (Intensity,11);
- WriteWord_2 (Intensity,10);
- WriteWord_3 (Intensity,11);
- }
- else if(shi<7||shi>21) //夜間節能模式
- {
- WriteWord_1 (Intensity,0);
- WriteWord_2 (Intensity,0);
- WriteWord_3 (Intensity,0);
- } */
- }
- }
- void time() interrupt 1 //中斷函數
- {
-
- TH0=0x3c; //12M 50ms
- TL0=0xb0; //定時50毫秒(晶振12M)
- ee++; //記錄溢出次數
- if(ee==10) //溢出達到10次
- {
- h=~h; //秒點每秒閃爍一次
- ee=0;
- if(bj==1)
- fmq=!fmq; //蜂鳴器每秒短叫一次
-
- }
-
- }
復制代碼
Keil代碼下載:
LED萬年歷.zip
(257.94 KB, 下載次數: 49)
2022-10-23 11:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|