找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10473|回复: 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, 下载次数: 392)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
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 单片机教程网

快速回复 返回顶部 返回列表