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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機WT588D語音報時萬年歷源碼與資料分享

  [復制鏈接]
跳轉到指定樓層
樓主
語音提示模塊設計
    語音模塊采用WT588D語音模塊,WT588D是廣州唯創與臺灣華邦合作研發的一款語音芯片(單片機)。WT588D不僅可以作為一般語音芯片,當從片發聲,而且因為I/O口多,帶控制功能和外置FLASH存儲器,所以能做FLASH單片機;最重要的是還可以按照樣品直接投掩膜,管腳完全不用改動,價錢便宜一半。WT588D性能卓越,簡單易用,與51單片機有著極為相似的性能。WT588D語音芯片是一款功能強大的可重復擦除燒寫的語音單片機芯片。配套WT588D VioceChip上位機操作軟件可隨意更換WT588D語音單片機芯片的任何一種控制模式,把信息下載到SPI-Flash上即可。軟件操作方式簡潔易懂,撮合了語音組合技術,大大減少了語音編輯的時間。 MP3控制模式下,完全迎合市場上MP3的播放/暫停、停止、上一曲、下一曲、音量+、音量-等功能; 按鍵控制模式下觸發方式靈活,可隨意設置任意按鍵為脈沖可重復觸發、脈沖不可重復觸發、無效按鍵、電平保持不循環、電平保持可循環、非電平保持可循環、單鍵向前不循環、單鍵向后不循環、單鍵向前可循環、單鍵向后可循環、音量+、音量-、播放/暫停、停止、播放/停止等15種觸發方式,最多可控制10個按鍵觸發輸出; 3×8按鍵組合控制模式下能以脈沖可重復觸發的方式觸發24個地址位語音,所觸發地址位語音可在0~219之間設置;并口控制模式最多可用8個I/O口進行控制; 一線串口控制模式可通過發碼端控制語音播放、停止、循環播放和音量大小,或者直接觸發0~219地址位的任意語音,發碼速度600us~2000us; 三線串口控制模式和三線串口控制I/O口擴展輸出模式之間可通過發碼切換,三線串口控制模式下,能控制語音播放、停止、循環播放和音量大小,或者直接觸發0~219地址位的任意語音,三線串口控制I/O口擴展輸出可以擴展輸出8位,在兩種模式下切換,能讓上一個模式的最后一種狀態保持著進入下一個模式。 PWM和DAC輸出方式,PWM輸出可直接推動0.5W/8Ω的揚聲器,DAC輸出外接功放,音質好。 應用范圍廣,幾乎可以涉及到所有的語音場所,如報站器、報警器、提醒器、鬧鐘、學習機、智能家電、治療儀、電子玩具、電訊、以及各種自動控制裝置等場所,工藝上達到工業應用的要求。  

WT588D的特性:
1.外掛2M~32M的Flash,時間從32—1054秒。掩膜為內置ROM,最長支持400秒(@6K采樣)。采樣率支持6K~22K
2.DAC輸出:13Bit,PWM輸出:12Bit
3.內置0.5W功放,可直接推動0.5W/8Ω揚聲器
4.支持加載MP3/WAV/WMA三種音頻格式
5.工作電壓:DC2.8V~5.5V
6.靜態休眠電流:<10uA
7.可通過電腦軟件,隨意組合語音,可插入靜音,插入的靜音不占用內存的容量,一個已加載語音可重復調用到多個地址,重復調用的,不占空間,這是其它芯片所不具備的
8.USB下載方式,支持在線下載/ISP下載
9.7種控制方式: MP3控制模式、按鍵控制模式、3×8矩陣控制模式、并口控制模式、一線串口控制模式、三線串口控制模式以及三線串口控制I/O口擴展輸出模式
10.掩膜后的管腳與原來一致,性能一樣,音質一樣。不用更改電路。且不用焊接FLASH
11.最多可加載500段語音;210段可控制地址位,單個地址位最多可加載128段語音,地址位內的語音組合播放;
12.插入的靜音時間范圍10ms~25min;靜音不占用存儲空間;
語音提示模塊電路圖如圖17所示


圖17




單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535
  4. #include "nongli.h"

  5. bit flag_200ms ;
  6. bit flag_100ms ;
  7. sbit beep = P3^7;          //蜂鳴器定義
  8. bit flag_beep_en;
  9. uint clock_value;     //用作鬧鐘用的

  10. void yunyin_boshi();         //語音報時程序

  11. sbit dq   = P3^2;          //18b20 IO口的定義

  12. /***********************語音模塊控制IO口的定義************************/
  13. sbit  VRST = P2^4;
  14. sbit  VBUSY= P2^0;       
  15. sbit  VSDA = P2^1;
  16. sbit  VCS  = P2^2;  
  17. sbit  VSCL = P2^3;
  18. uchar yujing[3];




  19. uint temperature ;    //溫度變量
  20. uchar flag_nl;        //農歷 陽歷顯示標志位


  21. uchar menu_1,menu_2;

  22. uchar key_time,flag_value;      //用做連加的中間變量
  23. bit key_500ms  ;
  24. uchar n_nian,n_yue,n_ri;                //農歷顯示的函數

  25. #include "ds1302.h"
  26. #include "lcd1602.h"

  27. /***********100us的延時函數***12M晶振**************/
  28. void delay_100us(uchar z)
  29. {                                //12M
  30.    uchar x,y;
  31.    for(x=0;x<z;x++)
  32.      for(y=0;y<30;y++);
  33. }



  34. /***********************18b20初始化函數*****************************/
  35. void init_18b20()
  36. {
  37.         bit q;
  38.         dq = 1;                                //把總線拿高
  39.         delay_uint(1);            //15us
  40.         dq = 0;                                //給復位脈沖
  41.         delay_uint(80);                //750us
  42.         dq = 1;                                //把總線拿高 等待
  43.         delay_uint(10);                //110us
  44.         q = dq;                                //讀取18b20初始化信號
  45.         delay_uint(20);                //200us
  46.         dq = 1;                                //把總線拿高 釋放總線
  47. }

  48. /*************寫18b20內的數據***************/
  49. void write_18b20(uchar dat)
  50. {
  51.         uchar i;
  52.         for(i=0;i<8;i++)
  53.         {                                         //寫數據是低位開始
  54.                 dq = 0;                         //把總線拿低寫時間隙開始
  55.                 dq = dat & 0x01; //向18b20總線寫數據了
  56.                 delay_uint(5);         // 60us
  57.                 dq = 1;                         //釋放總線
  58.                 dat >>= 1;
  59.         }       
  60. }

  61. /*************讀取18b20內的數據***************/
  62. uchar read_18b20()
  63. {
  64.         uchar i,value;
  65.         for(i=0;i<8;i++)
  66.         {
  67.                 dq = 0;                         //把總線拿低讀時間隙開始
  68.                 value >>= 1;         //讀數據是低位開始
  69.                 dq = 1;                         //釋放總線
  70.                 if(dq == 1)                 //開始讀寫數據
  71.                         value |= 0x80;
  72.                 delay_uint(5);         //60us        讀一個時間隙最少要保持60us的時間
  73.         }
  74.         return value;                 //返回數據
  75. }

  76. /*************讀取溫度的值 讀出來的是小數***************/
  77. uint read_temp()
  78. {
  79.         uint value;
  80.         uchar low;                           //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
  81.         init_18b20();                   //初始化18b20
  82.         write_18b20(0xcc);           //跳過64位ROM
  83.         write_18b20(0x44);           //啟動一次溫度轉換命令
  84.         delay_uint(50);                   //500us

  85.         init_18b20();                   //初始化18b20
  86.        
  87.         write_18b20(0xcc);           //跳過64位ROM
  88.         write_18b20(0xbe);           //發出讀取暫存器命令
  89.        
  90.         EA = 0;
  91.         low = read_18b20();           //讀溫度低字節
  92.         value = read_18b20();  //讀溫度高字節
  93.         EA = 1;
  94.         value <<= 8;                   //把溫度的高位左移8位
  95.         value |= low;                   //把讀出的溫度低位放到value的低八位中
  96.         value *= 0.625;               //轉換到溫度值 小數
  97.         return value;                   //返回讀出的溫度 帶小數
  98. }



  99. /******************1ms 延時函數*******************/
  100. void delay_1ms(uint q)
  101. {
  102.         uint i,j;
  103.         for(i=0;i<q;i++)
  104.                 for(j=0;j<120;j++);
  105. }

  106. /******************寫星期函數*******************/
  107. void write_week(uchar hang,uchar add,uchar week)//寫星期函數
  108. {
  109.         if(hang==1)   
  110.                 write_com(0x80+add);
  111.         else
  112.                 write_com(0x80+0x40+add);          
  113.         switch(week)
  114.         {
  115.                 case 1:write_data('M');//星期數為1時,顯示
  116.                            write_data('O');
  117.                            write_data('N');
  118.                            break;
  119.           
  120.                 case 2:write_data('T');//星期數據為2時顯示
  121.                            write_data('U');
  122.                            write_data('E');
  123.                            break;
  124.                
  125.                 case 3:write_data('W');//星期數據為3時顯示
  126.                            write_data('E');
  127.                            write_data('D');
  128.                            break;
  129.                
  130.                 case 4:write_data('T');//星期數據為4是顯示
  131.                            write_data('H');
  132.                            write_data('U');
  133.                            break;
  134.                
  135.                 case 5:write_data('F');//星期數據為5時顯示
  136.                            write_data('R');
  137.                            write_data('I');
  138.                            break;
  139.                
  140.                 case 6:write_data('S');//星期數據為6時顯示
  141.                            write_data('T');
  142.                            write_data('A');
  143.                            break;
  144.                
  145.                 case 7:write_data('S');//星期數據為7時顯示
  146.                            write_data('U');
  147.                            write_data('N');
  148.                            break;
  149.         }
  150. }

  151. /*************時鐘顯示***************/
  152. void init_1602_ds1302()
  153. {
  154.         write_sfm2_ds1302(1,2,shi);                   //顯示時
  155.         write_sfm2_ds1302(1,5,fen);                   //顯示分
  156.         write_sfm2_ds1302(1,8,miao);           //顯示秒
  157.         write_week(2,12,week);
  158. //        write_sfm1(1,14,week);                           //顯示星期
  159.         write_sfm3_18B20(1,11,temperature);           //顯示溫度
  160.         if(flag_nl == 0)  //顯示陽歷
  161.         {
  162.                 write_sfm2_ds1302(2,2,nian);   //顯示年
  163.                 write_sfm2_ds1302(2,5,yue);           //顯示月       
  164.                 write_sfm2_ds1302(2,8,ri);           //顯示日        
  165.         }
  166.         else                          //顯示農歷
  167.         {
  168.                 write_sfm2_ds1302(2,2,n_nian);        //顯示年
  169.                 write_sfm2_ds1302(2,5,n_yue);        //顯示月       
  170.                 write_sfm2_ds1302(2,8,n_ri);        //顯示日
  171.                
  172.         }
  173.        

  174.        
  175.                
  176. }                                                                          

  177. /*************定時器0初始化程序***************/
  178. void init_time0()          
  179. {
  180.         EA   = 1;                   //開總中斷
  181.         TMOD = 0X01;          //定時器0、工作方式1
  182.         ET0  = 1;                  //開定時器0中斷
  183.         TR0  = 1;                  //允許定時器0定時
  184. }

  185. /*************鬧鐘報警函數***************/
  186. void menu_dis()
  187. {
  188.         static uchar mm,value;
  189.         if(flag_100ms == 1)                  //100ms執行一次
  190.         {
  191.                 flag_100ms = 0;
  192.                 if(open1 == 1)        //如果鬧鐘打開
  193.                 {
  194.                         if((miao == 0) && (fen == fen1) && (shi == shi1))
  195.                         {               
  196.                                 flag_beep_en = 1;        //有報警 打開蜂鳴器響的標志位                               
  197.                         }               
  198.                         if(flag_beep_en == 1)        //鬧鐘以被打開
  199.                         {
  200.                                 clock_value++;
  201.                                 if(clock_value <= 30)         
  202.                                         beep = ~beep;           //蜂鳴器叫3秒
  203.                                 else if(clock_value > 30)
  204.                                 {
  205.                                         beep = 1;                    //蜂鳴器停1秒
  206.                                         if(clock_value > 40)
  207.                                         {
  208.                                                 clock_value = 0;

  209.                                         }
  210.                                 }
  211.                                 //  1 分鐘后自動關閉鬧鐘
  212.                                 value ++;
  213.                                 if(value >= 10)
  214.                                 {
  215.                                         value = 0;
  216.                                         mm++;
  217.                                         if(mm >= 60)
  218.                                         {
  219.                                                 mm = 0;
  220.                                                 flag_beep_en = 0;
  221.                                                 beep = 1;       
  222.                                         }
  223.                                 }                                       
  224.                         }
  225.                 }       
  226.         }
  227. }


  228. /********************獨立按鍵程序*****************/
  229. uchar key_can;         //按鍵值

  230. void key()         //獨立按鍵程序
  231. {
  232.         static uchar key_new;
  233.         key_can = 20;                   //按鍵值還原
  234.         P3 |= 0x78;                     //對應的按鍵IO口輸出為1
  235.         if((P3 & 0x78) != 0x78)                //按鍵按下
  236.         {
  237.                 delay_1ms(1);                     //按鍵消抖動
  238.                 if(((P3 & 0x78) != 0x78) && (key_new == 1))
  239.                 {                                                //確認是按鍵按下
  240.                         key_new = 0;
  241.                         switch(P3 & 0x78)
  242.                         {
  243.                                 case 0x70:  key_can = 4;  break;         //得到按鍵值
  244.                                 case 0x68:  key_can = 3;  break;         //得到按鍵值
  245.                                 case 0x58:  key_can = 2;  break;         //得到按鍵值
  246.                                 case 0x38:  key_can = 1;  break;         //得到按鍵值
  247.                         }
  248. //                        write_sfm2(1,0,key_can);                                 //顯示按鍵值
  249.                 }                       
  250.         }
  251.         else
  252.                 key_new = 1;       
  253. }


  254. /**********************設置函數************************/
  255. void key_with()
  256. {
  257.         if(key_can == 1)        //設置鍵
  258.         {
  259.                 menu_1++;
  260.                 if(menu_1 == 1)          //設置時間
  261.                 {
  262.                         menu_2 = 1;
  263.                         write_string(1,0,"    -  -    W:  ");                       
  264.                         write_string(2,0," 20  -  -       ");       
  265.                 }
  266.                 if(menu_1 == 2)          //設置鬧鐘
  267.                 {
  268.                         menu_2 = 1;
  269.                         write_string(1,0,"   set clock    ");                       
  270.                         write_string(2,0,"    Y  00:00      ");       
  271.                 }
  272.                 if(menu_1 > 2)    //回到正常顯示
  273.                 {
  274.                         menu_1 = 0;
  275.                         write_guanbiao(1,2,0);         //關閉光標
  276.                         init_1602_dis_csf();      //初始化液晶顯示               
  277.                 }
  278.         }
  279.         if(key_can == 2)        //選擇鍵
  280.         {
  281.                 flag_200ms = 1;
  282.                 if(menu_1 == 1)                  //設置時間
  283.                 {
  284.                         menu_2 ++;
  285.                         if(menu_2 > 7)
  286.                                 menu_2 = 1;
  287.                 }
  288.                 if(menu_1 == 2)                 //設置鬧鐘
  289.                 {
  290.                         menu_2 ++;
  291.                         if(menu_2 > 3)
  292.                                 menu_2 = 1;                               
  293.                 }
  294.         }
  295.         if(menu_1 == 1)
  296.         {
  297.                 if(menu_2 == 1)                  //設置時
  298.                 {
  299.                         if(key_can == 3)        //加
  300.                         {
  301.                                 shi+=0x01;
  302.                                 if((shi & 0x0f) >= 0x0a)
  303.                                         shi = (shi & 0xf0) + 0x10;
  304.                                 if(shi >= 0x24)
  305.                                         shi = 0;
  306.                         }               
  307.                         if(key_can == 4)        //減
  308.                         {
  309.                                 if(shi == 0x00)
  310.                                         shi = 0x24;
  311.                                 if((shi & 0x0f) == 0x00)
  312.                                         shi = (shi | 0x0a) - 0x10;
  313.                                 shi -- ;
  314.                         }                                         
  315.                 }
  316.                 if(menu_2 == 2)                  //設置分
  317.                 {
  318.                         if(key_can == 3)        //加
  319.                         {
  320.                                 fen+=0x01;
  321.                                 if((fen & 0x0f) >= 0x0a)
  322.                                         fen = (fen & 0xf0) + 0x10;
  323.                                 if(fen >= 0x60)
  324.                                         fen = 0;
  325.                         }               
  326.                         if(key_can == 4)        //減          
  327.                         {
  328.                                 if(fen == 0x00)
  329.                                         fen = 0x5a;
  330.                                 if((fen & 0x0f) == 0x00)
  331.                                         fen = (fen | 0x0a) - 0x10;
  332.                                 fen -- ;
  333.                         }       
  334.                 }
  335.                 if(menu_2 == 3)                  //設置秒
  336.                 {
  337.                         if(key_can == 3)        //加
  338.                         {
  339.                                 miao+=0x01;
  340.                                 if((miao & 0x0f) >= 0x0a)
  341.                                         miao = (miao & 0xf0) + 0x10;
  342.                                 if(miao >= 0x60)
  343.                                         miao = 0;
  344.                         }       
  345.                         if(key_can == 4)        //減          
  346.                         {
  347.                                 if(miao == 0x00)
  348.                                         miao = 0x5a;
  349.                                 if((miao & 0x0f) == 0x00)
  350.                                         miao = (miao | 0x0a) - 0x10;
  351.                                 miao -- ;                       
  352.                         }
  353.                 }
  354.                 if(menu_2 == 4)                  //設置星期
  355.                 {
  356.                         if(key_can == 3)        //加
  357.                         {
  358.                             week+=0x01;
  359.                                 if((week & 0x0f) >= 0x0a)
  360.                                         week = (week & 0xf0) + 0x10;
  361.                                 if(week >= 0x08)
  362.                                         week = 1;
  363.                         }               
  364.                         if(key_can == 4)        //減          
  365.                         {
  366.                                 if(week == 0x01)
  367.                                         week = 0x08;
  368.                                 if((week & 0x0f) == 0x00)
  369.                                         week = (week | 0x0a) - 0x10;
  370.                                 week -- ;
  371.                         }       
  372.                 }
  373.                 if(menu_2 == 5)                  //設置年
  374.                 {
  375.                         if(key_can == 3)        //加
  376.                         {
  377.                             nian+=0x01;
  378.                                 if((nian & 0x0f) >= 0x0a)
  379.                                         nian = (nian & 0xf0) + 0x10;
  380.                                 if(nian >= 0x9a)
  381.                                         nian = 1;
  382.                         }               
  383.                         if(key_can == 4)        //減          
  384.                         {
  385.                                 if(nian == 0x01)
  386.                                         nian = 0x9a;
  387.                                 if((nian & 0x0f) == 0x00)
  388.                                         nian = (nian | 0x0a) - 0x10;
  389.                                 nian -- ;               
  390.                         }       
  391.                 }
  392.                 if(menu_2 == 6)                  //設置月
  393.                 {
  394.                         if(key_can == 3)        //加
  395.                         {
  396.                             yue+=0x01;
  397.                                 if((yue & 0x0f) >= 0x0a)
  398.                                         yue = (yue & 0xf0) + 0x10;
  399.                                 if(yue >= 0x13)
  400.                                         yue = 1;
  401.                         }               
  402.                         if(key_can == 4)        //減          
  403.                         {
  404.                                 if(yue == 0x01)
  405.                                         yue = 0x13;
  406.                                 if((yue & 0x0f) == 0x00)
  407.                                         yue = (yue | 0x0a) - 0x10;
  408.                                 yue -- ;                                       
  409.                         }       
  410.                 }
  411.                 if(menu_2 == 7)                  //設置日
  412.                 {
  413.                         if(key_can == 3)        //加
  414.                         {
  415.                     ri+=0x01;
  416.                         if((ri & 0x0f) >= 0x0a)
  417.                                 ri = (ri & 0xf0) + 0x10;
  418.                         if(ri >= 0x32)
  419.                                 ri = 0;                       
  420.                         }               
  421.                         if(key_can == 4)        //減          
  422.                         {
  423.                                 if(ri == 0x01)
  424.                                         ri = 0x32;
  425.                                 if((ri & 0x0f) == 0x00)
  426.                                         ri = (ri | 0x0a) - 0x10;
  427.                                 ri -- ;                       
  428.                         }       
  429.                 }
  430.                 write_sfm2_ds1302(1,2,shi);           //顯示時
  431.                 write_sfm2_ds1302(1,5,fen);           //顯示分
  432.                 write_sfm2_ds1302(1,8,miao);           //顯示秒
  433.                 write_sfm1(1,14,week);           //顯示星期                                       
  434.                 write_sfm2_ds1302(2,3,nian);           //顯示年
  435.                 write_sfm2_ds1302(2,6,yue);           //顯示月
  436.                 write_sfm2_ds1302(2,9,ri);           //顯示日
  437.                 switch(menu_2)           // 光標顯示
  438.                 {
  439.                         case 1:  write_guanbiao(1,2,1);  break;
  440.                         case 2:  write_guanbiao(1,5,1);  break;
  441.                         case 3:  write_guanbiao(1,8,1);  break;
  442.                         case 4:  write_guanbiao(1,14,1);  break;
  443.                         case 5:  write_guanbiao(2,3,1);  break;
  444.                         case 6:  write_guanbiao(2,6,1);  break;
  445.                         case 7:  write_guanbiao(2,9,1);  break;
  446.                 }
  447.                 write_time();           //把時間寫進去
  448.         }       
  449. /***************設置鬧鐘*********************/
  450.         if(menu_1 == 2)
  451.         {
  452.                 if(menu_2 == 1)                  //設置鬧鐘開關
  453.                 {
  454.                         if(key_can == 3)       
  455.                         {
  456.                                 open1 = 1;          //鬧鐘開
  457.                         }               
  458.                         if(key_can == 4)       
  459.                         {
  460.                                 open1 = 0;          //鬧鐘關
  461.                         }                                         
  462.                 }
  463.                 if(menu_2 == 2)                  //設置鬧鐘時
  464.                 {
  465.                         if(key_can == 3)        //加
  466.                         {
  467.                             shi1+=0x01;
  468.                                 if((shi1 & 0x0f) >= 0x0a)
  469.                                         shi1 = (shi1 & 0xf0) + 0x10;
  470.                                 if(shi1 >= 0x24)
  471.                                         shi1 = 0;
  472.                         }               
  473.                         if(key_can == 4)        //減          
  474.                         {
  475.                                 if(shi1 == 0x00)
  476.                                         shi1 = 0x5a;
  477.                                 if((shi1 & 0x0f) == 0x00)
  478.                                         shi1 = (shi1 | 0x0a) - 0x10;
  479.                                 shi1 -- ;
  480.                         }       
  481.                 }
  482.                 if(menu_2 == 3)                  //設置秒
  483.                 {
  484.                         if(key_can == 3)        //加
  485.                         {
  486.                             fen1+=0x01;
  487.                                 if((fen1 & 0x0f) >= 0x0a)
  488.                                         fen1 = (fen1 & 0xf0) + 0x10;
  489.                                 if(fen1 >= 0x60)
  490.                                         fen1 = 0;
  491.                         }       
  492.                         if(key_can == 4)        //減          
  493.                         {
  494.                                 if(fen1 == 0x00)
  495.                                         fen1 = 0x5a;
  496.                                 if((fen1 & 0x0f) == 0x00)
  497.                                         fen1 = (fen1 | 0x0a) - 0x10;
  498.                                 fen1 -- ;                       
  499.                         }
  500.                 }
  501.                 if(open1 == 1)
  502.                         write_string(2,4,"Y");       
  503.                 else
  504.                         write_string(2,4,"N");       
  505.                 write_sfm2_ds1302(2,7,shi1);           //顯示鬧鐘時
  506.                 write_sfm2_ds1302(2,10,fen1);           //顯示鬧鐘分
  507.                 switch(menu_2)           // 光標顯示
  508.                 {
  509.                         case 1:  write_guanbiao(2,4,1);  break;
  510.                         case 2:  write_guanbiao(2,7,1);  break;
  511.                         case 3:  write_guanbiao(2,10,1);  break;
  512.                 }       
  513.         }                       
  514. }

  515. /***********************小延時函數**************************/
  516. void  delay_us (unsigned int us)
  517. {

  518.         while(us--)
  519.         {
  520.                 _nop_();
  521.         }
  522. }


  523. /***********************三線發碼子程序************************/
  524. void Send_threelines(unsigned char addr,uchar dat)
  525. {
  526.    unsigned char i;
  527.         VRST=0;
  528.         delay_1ms(5);
  529.         VRST=1;
  530.         delay_1ms(20); /* 復位拉高20ms*/
  531.         VCS=0;
  532.         delay_1ms(5);  /* 片選拉低5ms */
  533.     for(i=0;i<8;i++)
  534.         {
  535.                 VSCL=0;
  536.                 if(addr&0x01)
  537.                 {
  538.                         VSDA=1;
  539.                 }                                                                  
  540.                 else
  541.                         VSDA=0;
  542.                 addr>>=1;
  543.                 delay_us(150); /* 150us */
  544.                 VSCL=1;
  545.                 delay_us(150); /* 150us */
  546.         }
  547.         VCS=1;
  548.         delay_1ms(30);
  549.         if(dat == 1)
  550.                 while(VBUSY == 0);          //忙等待
  551. }

  552. /*****************語音報時程序*******************/
  553. void yunyin_boshi()         //語音報時程序
  554. {
  555.          Send_threelines(0x17,1) ;      //語音北京時間               
  556.          if(shi >= 0x10)
  557.          {                                                                 
  558.                  Send_threelines(shi / 16,1) ;      //語音                                                                 
  559.                  Send_threelines(0x0a,1) ;          //10                                                                                 
  560.          }
  561.          Send_threelines(shi % 16,1) ;      //語音       
  562.          Send_threelines(0x0b,1) ;          //點       
  563.                                                                                   
  564.          if(fen >= 0x10)
  565.          {                                                                 
  566.                  Send_threelines(fen / 16,1) ;      //語音                                                                 
  567.                  Send_threelines(0x0a,1) ;          //10                                                                                 
  568.          }
  569.          Send_threelines(fen % 16,1) ;      //語音       
  570.          Send_threelines(0x14,1) ;          //分       
  571.          
  572.                                                                                   
  573.          if(miao >= 0x10)
  574.          {                                                                 
  575.                  Send_threelines(miao / 16,1) ;      //語音                                                                 
  576.                  Send_threelines(0x0a,1) ;          //10                                                                                 
  577.          }
  578.          Send_threelines(miao % 16,1) ;      //語音       
  579.          Send_threelines(0x15,1) ;          //秒       

  580.          delay_1ms(300);
  581.          Send_threelines(0x16,1) ;          //星期       
  582.          Send_threelines(week,1) ;          //星期       

  583. /******************年***********************/
  584.          Send_threelines(2,1) ;          //       
  585.          Send_threelines(0,1) ;          //       
  586.          if(nian >= 0x10)
  587.          {                                                                 
  588.                  Send_threelines(nian / 16,1) ;      //語音                                                                 
  589.          }
  590.          Send_threelines(nian % 16,1) ;      //語音       
  591.          Send_threelines(0x10,1) ;          //年       

  592. /******************月***********************/
  593.          if(yue >= 0x10)
  594.          {                                                                 
  595.                  Send_threelines(yue / 16,1) ;      //語音       
  596.                  Send_threelines(0x0a,1) ;          //10                                                                                 
  597.          }
  598.          Send_threelines(yue % 16,1) ;      //語音       
  599.          Send_threelines(0x11,1) ;          //月       

  600. /******************日***********************/
  601.          if(ri >= 0x10)
  602.          {                                                                 
  603.                  Send_threelines(ri / 16,1) ;      //語音       
  604.                  Send_threelines(0x0a,1) ;          //10                                                                                 
  605.          }
  606.          Send_threelines(ri % 16,1) ;      //語音       
  607.          Send_threelines(0x12,1) ;          //日       
  608.          delay_1ms(200);

  609. /******************溫度***********************/
  610.          Send_threelines(0x20,1) ;          //度       
  611.          if(temperature >= 100)
  612.          {                                                                 
  613.                  Send_threelines(temperature / 100 % 10,1) ;      //語音       
  614.                  Send_threelines(0x0a,1) ;          //10                                                                                 
  615.          }
  616.          if(temperature >= 10)
  617.          {                                                                 
  618.                  Send_threelines(temperature / 10 % 10,1) ;      //語音       
  619.                  Send_threelines(0x0b,1) ;          //10                                                                                 
  620.          }
  621.          Send_threelines(temperature % 10,1) ;      //語音       
  622.          Send_threelines(0x21,1) ;          //度       
  623. ……………………

  624. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
## 單片機萬年歷1602顯示 發送資料 語音.rar (10.57 MB, 下載次數: 398)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:218308 發表于 2018-9-26 00:17 | 只看該作者
樓主能加下qq嘛 最近在做這個 想請教一下 我qq 993254861
回復

使用道具 舉報

板凳
ID:425666 發表于 2018-11-23 13:40 來自手機 | 只看該作者
您好,請問下在哪里下載附件呢
回復

使用道具 舉報

地板
ID:110736 發表于 2019-3-20 23:43 | 只看該作者
謝謝分享,正在做這個項目
回復

使用道具 舉報

5#
ID:438858 發表于 2020-2-25 14:53 | 只看該作者
這個能直接播報,任意時刻的時間嗎?
回復

使用道具 舉報

6#
ID:697350 發表于 2020-2-26 16:10 | 只看該作者
十分感謝!
回復

使用道具 舉報

7#
ID:698723 發表于 2020-2-26 19:59 來自手機 | 只看該作者
非常有用,謝謝分享
回復

使用道具 舉報

8#
ID:1047454 發表于 2024-2-20 15:11 | 只看該作者
想了解一下語音報時的程序,已下載來學習學習,謝謝樓主分享!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费观看一级毛片 | 国产成人在线免费 | 国产丝袜一区二区三区免费视频 | 二区中文 | 无人区国产成人久久三区 | 久国产 | 91精品国产色综合久久不卡蜜臀 | 中文字幕一区二区三区精彩视频 | 黄色一级毛片免费看 | 超碰97在线免费 | 一级毛片中国 | 久久成人一区 | 国产98色在线 | 日韩 | 在线免费观看一区二区 | 伊人伊成久久人综合网站 | 日韩精品三区 | 涩涩操| 国户精品久久久久久久久久久不卡 | 午夜在线视频 | 欧美一区2区三区4区公司 | 国产福利91精品 | 亚洲国产成人精品久久 | 国产精品资源在线 | 久久久久久九九九九 | 成人小视频在线观看 | 精品久久久久久亚洲精品 | 亚洲午夜一区二区 | 国产日韩欧美在线观看 | 婷婷五月色综合香五月 | 欧美激情va永久在线播放 | aaaaaa大片免费看最大的 | 久久91 | 97人澡人人添人人爽欧美 | 精品欧美 | 亚洲国产一区二区三区 | 欧美成人精品一区二区男人看 | 天天操妹子 | 国产999精品久久久影片官网 | 亚洲一区二区在线播放 | 久久精品国产99国产精品 | 免费日本视频 |