久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2470|回復: 0
打印 上一主題 下一主題
收起左側

用LED制作數碼管萬年歷 單片機+ds12c887+max7219 附源程序

[復制鏈接]
跳轉到指定樓層
樓主
長期以來,一直想做一個大數碼管萬年歷,但大數碼管筆段大都為幾個LED串聯組成,顯示部分需要較高的電壓,不能與單片機共用5v電源。這將使電路復雜化。前些時候受本論壇一個網友的啟發,時間顯示部分用多只LED并聯組成8字形“數碼管”,公歷農歷日期溫度都用0.8吋數碼管,制作萬年歷成功,用手機充電器供電,十分方便。單片機用STC89c52RC,時間獲取用DS12C887,顯示驅動用三支7219級聯完成。電路圖手工諒解制作,畫的不好,望網友們諒解。

電路原理圖如下:


單片機源程序如下:

  1. /*************說明*************************************************
  2. 1.程序主體部分參照ds1302+max7219級聯驅動24位數碼管萬年歷程序編輯修改
  3. 2.7219初始化要設置0x09,0x0a,0x0b,0x0c,0x0f五個控制寄存器,并且要在
  4.   顯示之前初始化,否則可能出現顯示錯誤
  5. 3.ds12c887初始化程序兩項主要內容1為控制寄存器參數,2為初次設置的時間
  6. 日期。兩項可合為一函數,887初始化僅限1次,一旦開啟887運行,由于887由
  7. 芯片內部電池供電,數據不會丟失,因此不需要再次寫入
  8. 4.由于7219選擇不譯碼和語音報時函數都需要十進制數據,887設置為二進制,
  9. 即B寄存器設置DM=1 (要注意,一些中文資料DM=0是錯誤的)
  10. *************************************************************************/
  11. #include <reg52.h>
  12. #include <intrins.h>
  13. #include <yyxp.h>
  14. #include <string.h>
  15. #include <absacc.h>                //頭文件
  16. #include "eeprom52.h"
  17. #include "ds18b20.h"
  18. #include "max7219.h"
  19. #define uc unsigned char //宏定義
  20. #define ui unsigned int
  21. #include "gton.h"

  22. /*----定義DS12C887數據線---*/
  23. //#define Ds_DATA P0  //DS12CR887數據總線,P0.0-P0.7對應連接AD0-AD7
  24. sbit ds_cs = P2^4;
  25. sbit ds_as = P2^5;
  26. sbit ds_rw = P2^6;
  27. sbit ds_ds = P2^7;

  28. /*----定義其它數據線---*/
  29. sbit s1=P1^4;                         //按鍵設置+確認
  30. sbit s2=P1^5;                          //加 ,運行狀態下為語音播報模式設置
  31. sbit s3=P1^6;                          //減, 運行狀態下為鬧鐘開關設置
  32. sbit s4=P1^7;                          //運行狀態下為語音報時開關
  33. sbit s5=P3^4;                          //運行狀態下為關閉報警
  34. sbit LED1 =P3^6;                  //鬧鐘指示燈
  35. sbit deng=P3^7;                         //秒燈
  36. sbit fmq=P2^3;                         //蜂鳴器
  37. sbit ACC0=ACC^0;
  38. sbit ACC7=ACC^7;

  39. void display();                                //顯示函數
  40. void sec_led();                                //控制秒燈的函數
  41. void bofang(uc ms,uc *df);
  42.                           //        0         1           2         3          4           5          6           7          8           9
  43. uc code tab[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x0d};        //不譯碼段選
  44. uc code tab1[]={0xfe,0xb0,0xed,0xf9,0xb3,0xdb,0xdf,0xf0,0xff,0xfb};                //帶小數點
  45. uc code dxy[]={0,1,2,1,0,1,0,1,1,0,1,0,1};
  46. uc set=0,ee;  //設置鍵按下次數(菜單),定時器溢出次數

  47. char nian,yue,ri,xq,shi,fen,miao,nz_shi,nz_fen;        //定義公歷年月日星期時分秒(十進制碼)

  48. bit bdata bs,tt,h;          //整點報時標志位,設置完成標志位,秒燈控制標志位
  49. bit bj=0;          //鬧鈴標志位
  50. bit zdbj=0;                //中斷報警標志
  51. bit bjkg=0;                //鬧鈴開關
  52.                                  
  53. uc mode=0;                                //語音播報模式:1報時間;2報日期和時間;3報時間和溫度;4三項全報;5關閉
  54. uc disbuff[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};                 //數組用于存放時間溫度距離等信息
  55. uc nl_nian,nl_yue,nl_ri;                 //        定義農歷年,月,日
  56. bit bdata bs,tt,h;    //語音報時標志,時間設置完成標志位,秒燈標志位,
  57.                                    
  58.                                                                   
  59. /******************把數據保存到單片機內部eeprom中******************/
  60. void write_eeprom()
  61. {
  62.         SectorErase(0x2000);
  63.         byte_write(0x2000, nz_shi);
  64.         byte_write(0x2001, nz_fen);
  65.         byte_write(0x2002, bjkg);
  66.         byte_write(0x2003, mode);
  67.         byte_write(0x2060, a_a);        
  68. }

  69. /******************把數據從單片機內部eeprom中讀出來*****************/
  70. void read_eeprom()
  71. {
  72.         nz_shi   = byte_read(0x2000);
  73.         nz_fen = byte_read(0x2001);
  74.         bjkg = byte_read(0x2002);
  75.         mode = byte_read(0x2003);
  76.         a_a      = byte_read(0x2060);
  77. }
  78.                                                                                                                   
  79. /**************開機自檢eeprom初始化*****************/
  80. void init_eeprom()
  81. {
  82.         read_eeprom();                //先讀
  83.         if(a_a != 1)                //新的單片機初始單片機內問eeprom
  84.         {
  85.                 nz_shi   = 12;
  86.                 nz_fen = 30;
  87.                 bjkg=0;
  88.                 mode=4;
  89.                 a_a = 1;
  90.                 write_eeprom();           //保存數據
  91.         }        

  92. }
  93. void delayms(ui x)                                        //延時x毫秒
  94. {
  95.         ui i,j;
  96.         for(i=0;i<x;i++)
  97.         for(j=0;j<110;j++);

  98. }                                                   


  99.                                                   
  100. /*****ds12c887函數*****/
  101. void write_ds12c887(uc add,uc date)        //寫入地址和數據
  102. {
  103.      
  104.     //date=((date/10)*16)+(date%10); //        十進制轉換成DCB碼(僅在887設置為BCD數據格式時使用)
  105.         ds_cs=0;
  106.         ds_as=1;
  107.         ds_ds=1;
  108.         ds_rw=1;
  109.         P0=add;
  110.     ds_as=0;
  111.         ds_rw=0;
  112.         P0=date;
  113.     ds_rw=1;
  114.         ds_as=1;
  115.         ds_cs=1;
  116. }

  117. uc read_ds12c887(uc add)  //讀數據
  118. {
  119.         uc time;
  120.         ds_as=1;
  121.         ds_ds=1;
  122.         ds_rw=1;
  123.         ds_cs=0;
  124.         P0=add;
  125.     ds_as=0;
  126.         ds_ds=0;
  127.         P0=0xff;
  128.         time=P0;
  129.     ds_as=1;
  130.         ds_ds=1;
  131.         ds_cs=1;
  132. //   time=time/16*10+time%16; //BCD轉十進制
  133.         return time;
  134. }

  135. void ds12c887()        //讀取寫入ds12c887函數
  136. {
  137.         if((tt==1)&&(set==0)) //當退出時間設定時,首先將設定的時間寫入芯片
  138.         {
  139.                 tt=0;
  140.                 write_ds12c887(0x00,miao);                //秒
  141.                 write_ds12c887(0x02,fen);                //分
  142.                 write_ds12c887(0x04,shi);                //時
  143.                 write_ds12c887(0x06,xq);                //星期
  144.                 write_ds12c887(0x07,ri);                //日
  145.                 write_ds12c887(0x08,yue);                //月
  146.                 write_ds12c887(0x09,nian);                //年
  147.                         
  148.         }
  149.         if(set==0)                        
  150.         {
  151.                  miao=read_ds12c887(0x00);
  152.              fen=read_ds12c887(0x02);
  153.                  shi=read_ds12c887(0x04);
  154.                  xq=read_ds12c887(0x06);
  155.                  ri=read_ds12c887(0x07);
  156.                  yue=read_ds12c887(0x08);
  157.                  nian=read_ds12c887(0x09);
  158.                  
  159.     }
  160.            
  161. }
  162. /*void DS12C887_init()           //887初始化,設置887寄存器初始參數,僅限初次上電使用
  163. {
  164.          write_ds12c887(10, 0x20);                //DS12CR887寄存器A功能設置,開啟時鐘振蕩器
  165.          write_ds12c887(11, 0x06);                //寄存器B功能設置,不開啟鬧鐘中斷使能,數據模式為二進制,24小時模式。
  166.         write_ds12c887(9, 22);
  167.         write_ds12c887(8, 10);
  168.         write_ds12c887(7, 6);
  169.         write_ds12c887(6, 4);
  170.         write_ds12c887(4, 12);
  171.         write_ds12c887(2, 55);
  172.         write_ds12c887(0, 58);        
  173. }                                                           */

  174. /*****按鍵函數*****/
  175. void key()
  176. {
  177.         ui out_set=0;          //退出設置時間記數
  178.         //out_clear=0;
  179.         
  180.         if(s1==0)                                  //如果s1設置鍵按下
  181.         {                                                  //
  182.                 delayms(5);                          //延時消抖 ()
  183.                 if(s1==0)                          //確認s1按下
  184.                 {
  185.                         while((s1==0)&&(set!=0))        //已確認s1按下并彈回時
  186.                         {
  187.                                 display();                                //顯示初始化數據
  188.                                 out_set++;                                //
  189.                                 if(out_set==300)        // 如果設置鍵彈開時間達300毫秒
  190.                                 {
  191.                                         set=0;
  192.                                         out_set=0;
  193.                                         tt=0;
  194.                                         fmq=0;                        //蜂鳴器短響一聲
  195.                                         delayms(20);
  196.                                         fmq=1;
  197.                                         delayms(100);
  198.                                         fmq=0;
  199.                                         delayms(20);
  200.                                         fmq=1;
  201.                                         goto x;
  202.                                 }
  203.                         }
  204.                         
  205.                         set++;                                        //進入設置方式1
  206.                         if(set<10)                                //如果設置次數小于8
  207.                         {
  208.                                 out_set=0;                        //退出設置
  209.                                 fmq=0;
  210.                                 delayms(10);
  211.                                 fmq=1;
  212.                         }
  213.                         else
  214.                         {
  215.                                 set=0;                                //設置次數歸0
  216.                                 tt=1;                                //設置完成
  217.                                 fmq=0;
  218.                                 delayms(200);
  219.                                 fmq=1;
  220.                         }

  221. x:                        while(!s1)                                //等待s1彈起
  222.                         {
  223.                                 display();
  224.                                 sec_led();
  225.                         }
  226.                 }
  227.         }
  228.         
  229.         if(set!=0)
  230.         {
  231.                 if(s2==0)                                        //如果加鍵按下
  232.                 {
  233.                         delayms(5);
  234.                         if(s2==0)
  235.                         {
  236.                                 fmq=0;
  237.                                 delayms(10);
  238.                                 fmq=1;
  239.                                 if(set==1)                        //如果設置鍵按下次數為1(菜單1,設置年)
  240.                                 {
  241.                                         nian++;                        //年增加(隨著加鍵按下)
  242.                                         if(nian==100)
  243.                                         nian=0;
  244.                                         if((dxy[yue]==2)&&(nian%4!=0)&&(ri>28)==1)//當平年二月day大于28時
  245.                                         ri=28;
  246.                                 }
  247.                                 if(set==2)                        //如果設置菜單為2(設置月)
  248.                                 {
  249.                                         yue++;                        //月增加
  250.                                         if(yue==13)
  251.                                         yue=1;
  252.                                         if((dxy[yue]==0)&&(ri>30)==1)        //當小月day大于30時
  253.                                         ri=30;
  254.                                         if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)//當平年二月day大于28時
  255.                                         ri=28;
  256.                                         if((dxy[yue]==2)&&(nian%4!=0)&&(ri>29)==1)//當閏年二月day大于29時
  257.                                         ri=29;
  258.                                 }
  259.                                 if(set==3)                        //如果設置菜單為3(設置日)
  260.                                 {
  261.                                         ri++;                        //日增加
  262.                                          
  263.                                         if((dxy[yue]==0)&&(ri==31)==1)        //當小月day被加到了31時
  264.                                         ri=1;
  265.                                         if((dxy[yue]==1)&&(ri==32)==1)        //當大月day被加到32時
  266.                                         ri=1;
  267.                                         if((dxy[yue]==2)&&(nian%4==0)&&(ri==29)==1) //當平年二月day被加到29時
  268.                                         ri=1;
  269.                                         if((dxy[yue]==2)&&(nian%4!=0)&&(ri==30)==1) //當閏年二月day被加到30時
  270.                                         ri=1;
  271.                                 }
  272.                                 if(set==4)                          //如果設置菜單為4(設置星期)
  273.                                 {
  274.                                     xq++;
  275.                                         if(xq==8)
  276.                                         xq=1;
  277.                                        
  278.                                 }
  279.                                 if(set==5)                           //如果設置菜單為5(設置時)
  280.                                 {
  281.                                     shi++;
  282.                                         if(shi==24)
  283.                                         shi=0;
  284.                                        
  285.                                 }
  286.                                 if(set==6)                           //如果設置菜單為6(設置分)
  287.                                 {
  288.                                     fen++;
  289.                                         if(fen==60)
  290.                                         fen=0;        
  291.                                 }
  292.                                 if(set==7)                           //如果設置菜單為7(設置秒)
  293.                                 {
  294.                                         miao++;
  295.                                         if(miao==60)
  296.                                         miao=0;                           
  297.                                 }
  298.                                 if(set==8)                           //如果設置菜單為8(設置鬧鐘時)
  299.                                 {
  300.                                         nz_shi++;
  301.                                         if(nz_shi==24)
  302.                                         nz_shi=0;
  303.                                         write_eeprom();         //保存數據
  304.                                 }
  305.                                 if(set==9)                                //如果設置菜單為9(設置鬧鐘分)
  306.                                 {
  307.                                         nz_fen++;
  308.                                         if(nz_fen==60)
  309.                                         nz_fen=0;
  310.                              write_eeprom();
  311.                                 }
  312.                                 while(!s2)                                        //等待加按鍵彈起
  313.                                 {display();}                                //正常顯示         
  314.                         }
  315.                 }
  316.                 if(s3==0)                                           //如果減鍵按下
  317.                 {
  318.                         delayms(5);
  319.                         if(s3==0)                                   
  320.                         {
  321.                                 fmq=0;
  322.                                 delayms(10);
  323.                                 fmq=1;
  324.                                 if(set==1)                                //如果設置菜單為1
  325.                                 {
  326.                                         nian--;                                //年減少
  327.                                         if(nian==(-1))
  328.                                         nian=99;
  329.                                         if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)
  330.                                         ri=28;
  331.                                 }
  332.                                 if(set==2)
  333.                                 {
  334.                                         yue--;
  335.                                         if(yue==0)
  336.                                         yue=12;
  337.                                         if((dxy[yue]==0)&&(ri>30)==1)
  338.                                         ri=30;
  339.                                         if((dxy[yue]==2)&&(nian%4==0)&&(ri>28)==1)
  340.                                         ri=28;
  341.                                         if((dxy[yue]==2)&&(nian%4!=0)&&(ri>29)==1)
  342.                                         ri=29;
  343.                                 }
  344.                                 if(set==3)
  345.                                 {
  346.                                         ri--;
  347.                                          
  348.                                         if((dxy[yue]==0)&&(ri==0)==1)
  349.                                         ri=30;
  350.                                         if((dxy[yue]==1)&&(ri==0)==1)
  351.                                         ri=31;
  352.                                         if((dxy[yue]==2)&&(nian%4==0)&&(ri==0)==1)
  353.                                         ri=28;
  354.                                         if((dxy[yue]==2)&&(nian%4!=0)&&(ri==0)==1)
  355.                                         ri=29;
  356.                                 }
  357.                                 if(set==4)
  358.                                 {
  359.                                 xq--;
  360.                                         if(xq==0)
  361.                                         xq=7;               
  362.                                 }
  363.                                 if(set==5)
  364.                                 {
  365.                                     shi--;
  366.                                         if(shi==(-1))
  367.                                         shi=23;
  368.                                        
  369.                                 }
  370.                                 if(set==6)
  371.                                 {
  372.                                     fen--;
  373.                                         if(fen==(-1))
  374.                                         fen=59;        
  375.                                 }
  376.                                 if(set==7)                                         //如果設置菜單為7
  377.                                 {
  378.                                         miao--;
  379.                                         if(miao==(-1))
  380.                                         miao=59;
  381.                                 }
  382.                                 if(set==8)
  383.                                 {
  384.                                         nz_shi--;
  385.                                         if(nz_shi==(-1))
  386.                                         nz_shi=23;
  387.                                         write_eeprom();                                //保存數據
  388.                                 }
  389.                                 if(set==9)
  390.                                 {
  391.                                         nz_fen--;
  392.                                         if(nz_fen==(-1))
  393.                                         nz_fen=59;
  394.                                         write_eeprom();                                //保存數據
  395.                                 }
  396.                                 while(!s3)
  397.                                 {display();}               
  398.                         }
  399.                 }
  400.         }
  401.         if(set==0)                                                                 //如果設置菜單為0,時日設置完成
  402.         {
  403.                 if(s2==0)      //如果s2按下
  404.                 {
  405.                         delayms(5);
  406.                         if(s2==0)    //如果確認s2按下,語音報時模式選擇
  407.                         {
  408.                  fmq=0;                 //蜂鳴器短鳴一聲
  409.                                  delayms(10);
  410.                                  fmq=1;
  411.                                  mode++;
  412.                              if(mode>5)
  413.                              mode=1;
  414.                              write_eeprom();                                //保存數據
  415.                         }
  416.                         while(!s2);
  417.                         {display();}
  418.         }
  419.                 if(s3==0)                        //如果s3按下,報警開關
  420.                 {
  421.                          delayms(5);                                          //延時5毫秒
  422.                          if(s3==0)
  423.                          {
  424.                   fmq=0;                 //蜂鳴器短鳴一聲
  425.                                   delayms(10);
  426.                                   fmq=1;
  427.                   bjkg=~bjkg;
  428.                           write_eeprom();
  429.              }
  430.                          while(!s4);
  431.                          {display();}
  432.                 }
  433.                 if(s4==0)
  434.                 {
  435.                    bofang(mode,disbuff);
  436.                 }
  437.                 if((s5==0)&&(bj==1))        //按鍵關閉鬧鐘
  438.                 {
  439.                    zdbj=1;
  440.                    bj=0;
  441.                    fmq=1;
  442.                 }
  443.         }                     
  444. }

  445. //=====================================================================================
  446. //=====================================================================================

  447. /*****主顯示函數*****/
  448. void display()
  449. {        //         年          月         日           時         分              溫度                 秒                  
  450.    uc  x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15;   
  451.         //農歷月農歷日 鬧鐘時鬧鐘分
  452.    uc  y1,y2,y3,y4,y5,y6,y7,y8;
  453.         
  454.     x1=nian/10;                 //年十位
  455.         x2=nian%10;                 //年個位

  456.         x3=yue/10;
  457.         x4=yue%10;

  458.         x5=ri/10;
  459.         x6=ri%10;

  460.         x7=shi/10;                   //時十位         
  461.         x8=shi%10;

  462.         x9=fen/10;                   //分十位
  463.         x10=fen%10;

  464.         x11=wendu/100;       //溫度十位
  465.         x12=(wendu%100)/10;
  466.         x13=(wendu%100)%10;

  467.         x14=miao/10;          //秒十位
  468.         x15=miao%10;

  469.     y5=nz_shi/10;    //鬧鐘時十位
  470.         y6=nz_shi%10;
  471.         y7=nz_fen/10;    //鬧鐘分十位
  472.         y8=nz_fen%10;                 

  473.          InitDis_3();

  474.     if(set!=1)                                        // 設置年數據
  475.         {
  476.                 WriteWord_3(0x07,tab[2]);
  477.                 WriteWord_3(0x08,tab[0]);
  478.                 WriteWord_3(0x01,tab[x1]);
  479.                 WriteWord_3(0x02,tab[x2]);
  480.         }                                                         
  481.         else if(set==1)                                 // 寫入年數據
  482.         {
  483.                 if(h==0)                                 // 秒燈滅時寫入
  484.                 {
  485.                         WriteWord_3(0x07,tab[2]);           //顯示2
  486.                         WriteWord_3(0x08,tab[0]);           //顯示0
  487.                         WriteWord_3(0x01,tab[x1]);   //顯示x1
  488.                         WriteWord_3(0x02,tab[x2]);   //顯示x2
  489.                 }
  490.                 else                                         // 秒燈亮時不顯示(秒燈閃爍顯示數據隨著閃爍)
  491.                 {
  492.                         WriteWord_3(0x07,tab[10]);         //不顯示  
  493.                         WriteWord_3(0x08,tab[10]);         //
  494.                         WriteWord_3(0x01,tab[10]);         //
  495.                         WriteWord_3(0x02,tab[10]);         //不顯示
  496.                 }
  497.         }
  498.         if(set!=2)                                                         // 設置月數據
  499.         {
  500.                 if(x3==0)
  501.                 {                                                 //如果月十位為0
  502.                 WriteWord_3(0x03,tab[10]);                 //不顯示
  503.                 WriteWord_3(0x04,tab[x4]);
  504.                 }                  
  505.                 else
  506.                 {                                                         //否則
  507.                 WriteWord_3(0x03,tab[x3]);                 //顯示x3
  508.                 WriteWord_3(0x04,tab[x4]);
  509.                 }                 //顯示x4
  510.         }
  511.         else if(set==2)                                                 // 寫入月數據
  512.         {
  513.                 if(h==0)
  514.                 {
  515.                         if(x3==0)
  516.                         {
  517.                         WriteWord_3(0x03,tab[10]);
  518.                         WriteWord_3(0x04,tab[x4]);
  519.                         }
  520.                         else
  521.                         {
  522.                         WriteWord_3(0x03,tab[x3]);
  523.                         WriteWord_3(0x04,tab[x4]);
  524.                         }
  525.                 }
  526.                 else
  527.                 {
  528.                         WriteWord_3(0x03,tab[10]);
  529.                         WriteWord_3(0x04,tab[10]);
  530.                 }
  531.         }
  532.         if(set!=3)                                                  // 設置日數據
  533.         {
  534.                
  535.                 if(x5==0)
  536.                 {
  537.                 WriteWord_3(0x05,tab[10]);
  538.                 WriteWord_3(0x06,tab[x6]);
  539.                 }
  540.                 else
  541.                 WriteWord_3(0x05,tab[x5]);
  542.                 WriteWord_3(0x06,tab[x6]);
  543.         }
  544.         else if(set==3)                                        // 寫入日數據
  545.         {
  546.                 WriteWord_3(0x05,tab[x5]);
  547.                 WriteWord_3(0x06,tab[x6]);
  548.                
  549.                 if(h==0)                                         
  550.                 {
  551.                         if(x5==0)
  552.                         {
  553.                         WriteWord_3(0x05,tab[10]);
  554.                         WriteWord_3(0x06,tab[x6]);
  555.                         }
  556.                         else
  557.                         WriteWord_3(0x05,tab[x5]);
  558.                         WriteWord_3(0x06,tab[x6]);
  559.                 }
  560.                 else
  561.                 {
  562.                         WriteWord_3(0x05,tab[10]);
  563.                         WriteWord_3(0x06,tab[10]);
  564.                 }
  565.         }

  566.         InitDis_2();
  567.    
  568.         if(set!=4)
  569.         {
  570.                 if(xq!=7)
  571.                 WriteWord_2(0x07,tab[xq]);
  572.                 else
  573.                 WriteWord_2(0x07,tab[(xq+1)]);
  574.         }
  575.         else if(set==4)
  576.         {
  577.                 if(h==0)
  578.                 {
  579.                         if(xq!=7)
  580.                         WriteWord_2(0x07,tab[xq]);
  581.                         else
  582.                         WriteWord_2(0x07,tab[(xq+1)]);
  583.                 }
  584.                 else
  585.                 {
  586.                         WriteWord_2(0x07,tab[10]);
  587.                 }
  588.         }

  589.         if(set!=5)                                                 //設置時數據
  590.         {
  591.                 if(x7==0)
  592.                 {                                           //如果時十位是0
  593.                 WriteWord_2(0x01,tab[10]);   //不顯示
  594.                 WriteWord_2(0x02,tab[x8]);
  595.                 }
  596.                 else                                           //否則
  597.                 WriteWord_2(0x01,tab[x7]);   //顯示時十位
  598.                 WriteWord_2(0x02,tab[x8]);   //顯示時個位
  599.         }
  600.         else if(set==5)                                       //寫入時數據
  601.         {
  602.                 if(h==0)                                  //秒燈滅寫入
  603.                 {
  604.                         if(x7==0)
  605.                         {
  606.                         WriteWord_2(0x01,tab[10]);
  607.                         WriteWord_2(0x02,tab[x8]);
  608.                         }
  609.                         else
  610.                         WriteWord_2(0x01,tab[x7]);
  611.                         WriteWord_2(0x02,tab[x8]);
  612.                 }
  613.                 else                                           //秒燈亮不顯示
  614.                 {
  615.                         WriteWord_2(0x01,tab[10]);
  616.                         WriteWord_2(0x02,tab[10]);
  617.                 }
  618.         }
  619.         if(set!=6)                                                   //設置分
  620.         {
  621.                 WriteWord_2(0x03,tab[x9]);
  622.                 WriteWord_2(0x04,tab[x10]);
  623.         }
  624.         else if(set==6)                                           //寫入分
  625.         {
  626.                 if(h==0)
  627.                 {
  628.                         WriteWord_2(0x03,tab[x9]);
  629.                         WriteWord_2(0x04,tab[x10]);
  630.                 }
  631.                 else
  632.                 {
  633.                         WriteWord_2(0x03,tab[10]);
  634.                         WriteWord_2(0x04,tab[10]);
  635.                 }
  636.         }
  637.         
  638.     if(set!=7)
  639.         {
  640.           WriteWord_2(0x05,tab[x14]);
  641.           WriteWord_2(0x06,tab[x15]);
  642.         }
  643.         else if(set==7)        
  644.         {
  645.                 if(h==0)
  646.                 {
  647.                         WriteWord_2(0x05,tab[x14]);
  648.                         WriteWord_2(0x06,tab[x15]);
  649.                 }
  650.                 else
  651.                 {
  652.                         WriteWord_2(0x05,tab[10]);
  653.                         WriteWord_2(0x06,tab[10]);
  654.                 }
  655.         
  656.         }
  657.                   
  658.           InitDis_1();

  659.         if(set==8)
  660.         {
  661.           WriteWord_1(0x05,tab[y5]);
  662.           WriteWord_1(0x06,tab[y6]);
  663.         }
  664.         if(set==9)
  665.         {
  666.           WriteWord_1(0x07,tab[y7]);
  667.           WriteWord_1(0x08,tab[y8]);
  668.         }
  669.         if(set==0)                                                          //如果時鐘走時時間設置菜單為0 ,時日設置完成
  670.         {
  671.            
  672.            SunToMoon(nian,yue,ri);         //調用農歷轉換
  673.          
  674.            y1=month_moon/10;                 //農歷月十位
  675.            y2=month_moon%10;
  676.        y3=day_moon/10;     //農歷日十位
  677.            y4=day_moon%10;
  678.        if(y1==0)
  679.            {
  680.               WriteWord_1(0x01,tab[10]);
  681.                   WriteWord_1(0x02,tab[y2]);
  682.                 }
  683.             else
  684.                 {
  685.                   WriteWord_1(0x01,tab[y1]);                //顯示農歷月
  686.                   WriteWord_1(0x02,tab[y2]);
  687.                 }                  
  688.                 if(y3==0)
  689.                 {
  690.                         WriteWord_1(0x03,tab[10]);
  691.                         WriteWord_1(0x04,tab[y4]);
  692.                 }
  693.                 else
  694.                 {        
  695.                   WriteWord_1(0x03,tab[y3]);                //顯示農歷日
  696.                   WriteWord_1(0x04,tab[y4]);
  697.                 }
  698.                 if(x11==0)
  699.                 {
  700.                    WriteWord_1(0x05,tab[10]);                //溫度十位為0不顯示
  701.                    WriteWord_1(0x06,tab1[x12]);
  702.                    WriteWord_1(0x07,tab[x13]);  
  703.                    WriteWord_1(0x08,tab[11]);        //顯示C        
  704.                 }
  705.                 else                                                        //否則
  706.                 {
  707.                    WriteWord_1(0x05,tab[x11]);        //顯示溫度
  708.                    WriteWord_1(0x06,tab1[x12]);
  709.                    WriteWord_1(0x07,tab[x13]);  
  710.                    WriteWord_1(0x08,tab[11]);        //顯示C        
  711.                 }
  712.                  if(bjkg==1)
  713.              LED1=0;     //顯示鬧鐘開
  714.                  else
  715.                  LED1=1;
  716.         

  717.   }
  718.     disbuff[0]=x1;                                   //年十位值  數組0號數據
  719.         disbuff[1]=x2;                                  //年個位值  數組1號數據
  720.         disbuff[2]=x3;                                  //月十位值  數組2號數據   
  721.          disbuff[3]=x4;                                  //月個位值  數組3號數據
  722.          disbuff[4]=x5;
  723.          disbuff[5]=x6;                                  //日個位值
  724.         disbuff[6]=xq;                              //星期  數組6號數據
  725.          disbuff[7]=x7;                                  //時十位值  數組7號數據
  726.          disbuff[8]=x8;                                  //時個位值
  727.          disbuff[9]=x9;                                  //分十位值
  728.          disbuff[10]=x10;                          //分個位值
  729.          disbuff[11]=x14;                          //秒十位值
  730.         disbuff[12]=x15;
  731.         disbuff[13]=x11;                          //溫度十位值
  732.         disbuff[14]=x12;                      //溫度個位值
  733.         disbuff[15]=x13;                          //溫度小數位值        
  734.       
  735.                                           
  736. }


  737. /*****鬧鐘函數*****/
  738. void clock_dis()
  739. {
  740.         if(zdbj==0&&bjkg==1&&set==0)
  741.         {
  742.                 if(shi==nz_shi&&fen==nz_fen)
  743.                 bj=1;
  744.                 else
  745.                 {
  746.                         fmq=1;
  747.                         bj=0;
  748.                 }
  749.         }
  750.            
  751. }                                                                              


  752. /*****語音報時函數*****/
  753. void bofang(uc broadcast,uc *str)        //兩個參數(節目,數組指針)
  754. {  

  755.         uc length,length_finish;          //根據芯片秒數聲明播放語句數(大約每句1秒)?
  756. //        length=1;
  757.         if(broadcast==1)                          //播放模式1  只報時間
  758.         {
  759.                 length=15;                                  //從第15句開始
  760.                 length_finish=26;                  //到第26句結束
  761.         }
  762.         else if(broadcast==2)                  //播放模式2  報時間和日期
  763.         {
  764.                 length=0;
  765.                 length_finish=26;
  766.         }
  767.         else if(broadcast==3)                  //播放模式3  報時間和溫度
  768.         {
  769.                 length=15;
  770.                 length_finish=33;
  771.         }
  772.         else if(broadcast==4)                   //播放模式4 報時間和日期        溫度
  773.         {                                                                                       
  774.                 length=0;                                  //從第0句開始
  775.                 length_finish=33;                  //到第33句結束
  776.         }
  777.         else                  //否則不播放 模式0
  778.         {
  779.                 length=1;          //從第1句開始
  780.                 length_finish=1;   //到第1句結束
  781.         }
  782.         
  783.         if(length<length_finish)
  784.         {
  785.                 TR0=0;                                   //關閉定時器
  786.                 //speak(25);                   //車站大廳音樂-------開機音樂  */
  787.              while(length<length_finish/*&&flag_bofang*/)        //最大32         
  788.                  {
  789.                         if(yyxp_busy==1)                                                        //
  790.                         {
  791.                                 if(length==15||length==26)                                //如果播報從15句或26句開始
  792.                                 delayms(200);                                                                //延時0.2秒
  793.                                 switch (length)
  794.                                 {                                                                                //x?
  795.                                           
  796.                         case 0:speak(25);length++;break;                         //報時音樂
  797.                                         case 1:speak(27); length++;break;                         //今天是
  798.                                         case 2:if(*str!=0) speak(*str+1); else speak(1);length++;break;                         //年十位   
  799.                                         case 3:if(*(str+1)!=0) speak(*(str+1)+1); else speak(1);length++;break;                         //年個位
  800.                                         case 4:speak(16);length++;break;                         //年           
  801.                         case 5:if(*(str+2)!=0) {speak(11);length++;} else length++; break;//月十位   為1時播報十,為0時不播報                                                                                                                                                                                                                                                                     
  802.                                     case 6:if(*(str+3)!=0) {speak(*(str+3)+1);length++;} else length++;break;                //月個位
  803.                                         case 7:speak(17);length++;break;                         //月
  804.                                         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                          
  805.                                           case 9:speak(11);length++;break;                         //十
  806.                                         case 10:if(*(str+5)!=0) {speak(*(str+5)+1);length++;} else length++;break;                         //日個位
  807.                                         case 11:speak(18);length++;break;                         //日
  808.                                         case 12:speak(19);length++;break;                         //星期
  809.                                         case 13:if(*(str+6)==7) length++; else  {speak(*(str+6)+1);length=16;}  break;        //
  810.                                         case 14:speak(18);length+=2;break;                         //日

  811.                                         case 15:speak(25);length++;break;                         //音樂1,3模式報
  812.                                         case 16:speak(22);length++;break;                         //現在時刻北京時間
  813.                     case 17:if(*(str+7)==1) length++; else if(*(str+7)>1) {speak(*(str+7)+1);length++;}else length+=2;break;  //
  814.                                         //時十位  為1時跳到case 17播報十,大于1時播報數字并跳到case 17播報十,為0十時不播報跳到case 15
  815.                                         case 18:speak(11);length++;break;                         //十
  816.                                         case 19:if(*(str+8)!=0) speak(*(str+8)+1);if(*(str+7)==0&&*(str+8)==0)speak(1);length++;break;                         //時個位
  817.                                         case 20:speak(13);length++;break;                         //點                ---此處修改speak(22為speak(13)
  818.         
  819.                                         case 21:
  820.                                                 if(*(str+9)==1)
  821.                                                 length++;
  822.                                                 else if(*(str+9)>1)
  823.                                                 {
  824.                                                         speak(*(str+9)+1);
  825.                                                         length++;
  826.                                                 }
  827.                                                 else if((*(str+9))==0&&(*(str+10))==0)
  828.                                                 {
  829.                                                         if((*(str+11))==0&&(*(str+12))==0)
  830.                                                         length=25;
  831.                                                         else
  832.                                                         length+=2;
  833.                                                 }
  834.                                                 else if((*(str+9))==0&&(*(str+10))!=0)
  835.                                                 {
  836.                                                         speak(1);length+=2;
  837.                                                 }

  838.                                                 break;
  839.                                         //分十位  為1時跳到case 10播報十,大于1時播報數字并跳到case 10播報十,為0十時不播報跳到case 19
  840.                                         case 22:speak(11);length++;break;                         //十
  841.                                         case 23:if(*(str+10)!=0)speak(*(str+10)+1); if(*(str+9)==0&&*(str+10)==0)speak(1);length++;break;                         //分個位
  842.                                         case 24:speak(14);length+=2;break;                         //分
  843.         
  844.                                         /*case 21:if(*(str+11)==1) length++;                                                         //不播報秒
  845.                                                   else if(*(str+11)>1) {speak(*(str+11)+1);length++;}
  846.                                                           else if(*(str+11)==0&&*(str+12)!=0){speak(1);length+=2;}
  847.                                                           else if(*(str+11)==0&&*(str+12)==0){length+=2;}break;
  848.                                         //秒十位  為1時跳到case 22播報十,大于1時播報數字并跳到case 22播報十,秒十位為0秒個位不為0時播報0跳到case 23,
  849.                                         //秒數據為0時不播報跳到case 23
  850.                                         //case 22:speak(11);length++;break;                         //十         
  851.                                         //case 23:if(*(str+12)!=0) speak(*(str+12)+1);if(*(str+11)==0&&*(str+12)==0)speak(1);length++;break;        //秒個位
  852.                                         //case 24:speak(15);length=26;break;                         //秒 ---此處修改speak(24)為speak(15)                                   */

  853.                                         case 25:speak(26);length++;break;                         //整 ---此處修改speak(21)為speak(26)
  854.         


  855.                                         case 26:speak(23);length++;break;                         //當前溫度        ---- 此處修改speak(15)為speak(23)
  856.         
  857.                                         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
  858.                                         case 28:speak(11);length++;break;                         //十
  859.                                         case 29:if(*(str+14)!=0) speak(*(str+14)+1);length++;break;                         //溫度個位
  860.                                         case 30:speak(13);length++;break;                         //點        ----此處修改speak(22)為speak(13)
  861.                                         case 31:if(*(str+15)!=0) speak(*(str+15)+1);else speak(1);length++;break;                         //溫度小數位
  862.                                         case 32:speak(20);length++;break;                         // 度----此處修改speak(16)為speak(20)
  863.                                          
  864.                                 }
  865.                                 yydelay(2);
  866.                         }
  867.                 }
  868.                 TR0=1;
  869.                 while(!yyxp_busy);        //等待播完
  870.                
  871.                 bs=0;
  872.                 delayms(100);
  873.         }
  874. }                                                
  875. /*****秒燈控制函數*****/
  876. void sec_led(void)
  877. {
  878.         if(set==0)
  879.         deng=h;                                //秒燈閃爍
  880.         if(set==1)
  881.         deng=1;                                //按下set鍵關秒燈

  882. }
  883.                                                                                     
  884. /*****定時器T0*****/
  885. void init()
  886. {
  887.         EA=1;
  888.         ET0=1;
  889.         TMOD=0x01;
  890.         TH0=0x3c;        //12M 50ms
  891.         TL0=0xb0;
  892.         TR0=1;



  893. }
  894.                                  
  895. /*****主函數*****/
  896. void main()
  897. {        
  898.         uc aa;
  899.         init();          //定時器初始化,啟動定時器0

  900.   //  DS12C887_init()   //        初始化ds12c887,僅限初次使用,以后不必寫入
  901. //        InitDis ();         //初始化7219
  902.          
  903.   

  904.         for(aa=0;aa<30;aa++)  //10毫秒讀取一次溫度,讀取30次
  905.         {
  906.                 ds18b20();
  907.                 delayms(10);
  908.         }
  909.         fmq=0;                                   //蜂鳴器長鳴
  910.         delayms(200);
  911.         fmq=1;
  912.         delayms(100);
  913.          init_eeprom();                   //eeprom初始化
  914.         while(1)                           //循環執行
  915.         {
  916.             key();                           //按鍵掃描
  917.                  ds12c887();            //獲取時間
  918.         ds18b20();                                  //獲取溫度
  919.             sec_led();
  920.                  display();                                 //顯示
  921.              clock_dis();         //鬧鐘輸出
  922.                 if((fen==0)&&(miao==0)&&set==0)                  // hour,min,sec
  923.                 {
  924.                         if(shi>=7&&shi<=21)         //7點到21點播報
  925.                         bs=1;
  926.                         if(bs==1)
  927.                         bofang(mode,disbuff);
  928.                 }
  929.                
  930.         /*        if(shi>=7&&shi<=21)         //白天亮度
  931.                 {
  932.                    WriteWord_1 (Intensity,11);
  933.                    WriteWord_2 (Intensity,10);
  934.                    WriteWord_3 (Intensity,11);
  935.                 }        
  936.                 else if(shi<7||shi>21)          //夜間節能模式  
  937.                 {
  938.                    WriteWord_1 (Intensity,0);
  939.                    WriteWord_2 (Intensity,0);
  940.                    WriteWord_3 (Intensity,0);
  941.                 }        */                                                        
  942.   }
  943. }
  944. void time() interrupt 1         //中斷函數
  945. {
  946.    
  947.         TH0=0x3c;        //12M 50ms
  948.         TL0=0xb0;  //定時50毫秒(晶振12M)
  949.         ee++;                //記錄溢出次數
  950.         if(ee==10)        //溢出達到10次
  951.         {
  952.                 h=~h;        //秒點每秒閃爍一次
  953.                 ee=0;
  954.                 if(bj==1)
  955.                 fmq=!fmq;           //蜂鳴器每秒短叫一次
  956.                
  957.         }
  958.          
  959. }
復制代碼

Keil代碼下載:
LED萬年歷.zip (257.94 KB, 下載次數: 49)

評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 乳色吐息在线观看 | 国产91亚洲精品 | 国产在线a | 性一交一乱一伦视频免费观看 | 成人毛片视频免费 | 色婷婷综合久久久中字幕精品久久 | 欧美日韩在线观看一区二区三区 | 瑟瑟激情 | 欧美一级小视频 | 久久久精 | 五月天综合网 | 日韩精品一区二区三区久久 | 久久青青 | 亚洲精品久久久久久一区二区 | 国产欧美精品在线观看 | 91啪影院 | 日韩免费一区 | 日干夜操 | 日本精品一区二区三区视频 | 成年人视频在线免费观看 | 成人深夜福利 | 伊人网伊人网 | 国产丝袜一区二区三区免费视频 | 亚洲国产一 | 亚洲欧美日韩在线一区二区 | 欧美成视频| 亚洲免费网址 | 国产精品久久久久久久7电影 | 亚洲综合久久久 | 99在线视频观看 | 国产成人99久久亚洲综合精品 | 国产一区二区精 | 国产不卡视频 | 日韩免费一区 | a在线视频观看 | 懂色av一区二区三区在线播放 | 电影午夜精品一区二区三区 | 日韩在线视频免费观看 | 香蕉婷婷 | 成人精品鲁一区一区二区 | 日韩欧美在线免费观看视频 |