[51单片机] 请问下语音IC与单片机只有一根线怎么写代码?

[复制链接]
334|11
 楼主 | 2019-7-6 22:21 | 显示全部楼层 |阅读模式
    手头上有个DMEO板,语音IC通过一根线与MCU连接,看网上资料都是两根线,一个BSUY DATA两根线,这个单根线怎么让他发声了?请各位大神写段代码给小弟,附件图片为资料,音量最大为0X50H,第一首为0X01H,切换曲目为0X60H
QQ截图20190706221208.jpg
QQ截图20190706221151.jpg
QQ截图20190706192534.jpg
QQ截图20190706192451.jpg

使用特权

评论回复
| 2019-7-6 22:55 | 显示全部楼层
单总线协议就是这样,按照最后一张图片的时序写就是了。一定要满足延时时间,可以参考18B20或者红外的写法,而且这种芯片一般都会给出参考例程的。

使用特权

评论回复
| 2019-7-7 21:41 | 显示全部楼层
找个广州唯创的数据书册,里面有demo

  1. /*--------------------------------------
  2. ;模块名称:Line_1A_WT(u08 SB_DATA)
  3. ;功能:实现一线串口通信函数
  4. ;入参: SB_DATA 为发送数据
  5. ;出参:
  6. ;P_DATA 为数据口
  7. ;-------------------------------------*/


  8. #define Delay_1ms _delay_ms

  9. void Delay_N10us( u08 n_us)
  10. {
  11.     u08 i=0;
  12.     for(i=0;i<n_us;i++)
  13.     {
  14.         CLK_SysTickDelay(10);
  15.     }
  16. }

  17. void Line_1A_WTN( u08 ddata)
  18. {
  19.     u08 S_DATA;
  20.     u08 B_DATA;
  21.     u08 j;
  22.     S_DATA = ddata;
  23.     P_DATA = 1;
  24.     _delay_us(1);
  25.     P_DATA = 0;
  26.     Delay_1ms(5); //延时5ms
  27.     B_DATA = S_DATA&0X01;
  28.    
  29.     for(j=0;j<8;j++)
  30.     {
  31.         if(B_DATA )
  32.         {
  33.             P_DATA = 1;
  34.             Delay_N10us(60); //延时600us
  35.             P_DATA = 0;
  36.             Delay_N10us(20); //延时200us
  37.         }
  38.         else
  39.         {
  40.             P_DATA = 1;
  41.             Delay_N10us(20); //延时200us
  42.             P_DATA = 0;
  43.             Delay_N10us(60); //延时600us
  44.         }
  45.         
  46.         S_DATA = S_DATA>>1;
  47.         B_DATA = S_DATA&0X01;
  48.     }
  49.    
  50.     P_DATA = 1;
  51. }
  52. /**
  53. * [url=home.php?mod=space&uid=247401]@brief[/url]    播放某个编号的声音文件
  54. *
  55. * @param    声音文件编号
  56. *
  57. * [url=home.php?mod=space&uid=266161]@return[/url]   None
  58. *
  59. * [url=home.php?mod=space&uid=1543424]@Details[/url]   
  60. *            
  61. */
  62. void Audio_playsong( u16 song)
  63. {
  64.     /* 本语音芯片只有160段语音: 0-0x9F*/
  65.     if(song<= 0x9F)
  66.     {
  67.         Line_1A_WTN(song);
  68.         //_delay_ms(5);
  69.     }
  70. }


  71. /* 定义0-21km/h速度对应的音量 */
  72. u08 speed2volume_tab[21] =
  73. {
  74.     40, //速度0
  75.     40, //速度1
  76.     40, //速度2
  77.     39, //速度3
  78.     38, //速度4
  79.     37, //速度5
  80.     36, //速度6
  81.     35, //速度7
  82.     34, //速度8
  83.     33, //速度9
  84.     32, //速度10
  85.     30, //速度11
  86.     29, //速度12
  87.     28, //速度13
  88.     27, //速度14
  89.     26, //速度15
  90.     25, //速度16
  91.     24, //速度17
  92.     23, //速度18
  93.     22, //速度19
  94.     20 //速度20   
  95. };

  96. void Audio_proc(void)
  97. {

  98.     /* 0- VSP处理:根据当前的速度,查表,获取到对应的频率和音量  */
  99.     if(SYS_msg1_data5_speed<=20)
  100.     {
  101.         /*0.1查表获取音量 */
  102.         SYS_msg1_data6_vol = speed2volume_tab[20-SYS_msg1_data5_speed] ;
  103.         /*0.2系统音量转化为唯创WTV600语音IC的音量
  104.         *     系统为0-40,唯创为0-15; 因此系数为15/40,也即3/8   
  105.         */
  106.         SYS_vol = SYS_msg1_data6_vol *3/8 +0xE0;
  107.         SYS_vol_last = SYS_vol -1;//产生音量刷新的条件
  108.     }
  109.     else
  110.     {
  111.         //刷新成最小音量
  112.         SYS_vol         = 0xE0;
  113.         SYS_vol_last    = 0xE1;
  114.     }
  115.    
  116.     /* 1- 根据速度发出提示音: 在2-20km/h区间,其余静音*/
  117.     if( SYS_msg1_data5_speed<2 )
  118.     {
  119.         SYS_song = SONG9_SILENT;
  120.         SYS_song_last = SONG0_DIDIDI;
  121.     }
  122.     else if(SYS_msg1_data5_speed>=2 && SYS_msg1_data5_speed<=20 )
  123.     {
  124.         SYS_song = SONG0_DIDIDI;
  125.         SYS_song_last = SONG9_SILENT;
  126.         
  127.         
  128.     }
  129.     else if(SYS_msg1_data5_speed>20 )
  130.     {
  131.         SYS_song = SONG9_SILENT;
  132.         SYS_song_last = SONG0_DIDIDI;
  133.     }

  134.      //1- 传统控制思路: 有不同的控制值 ,就更新
  135.     /* 1-声源更新处理 */
  136.     if(SYS_song != SYS_song_last)
  137.     {
  138.         SYS_song_last = SYS_song;//把当前SYS_song清除
  139.         Audio_playsong(SYS_song_last);//播放当前song,播放完
  140.     }
  141.     /* 2-声源频率更新处理 */
  142.     if(SYS_tune != SYS_tune_last)
  143.     {
  144.         SYS_tune_last = SYS_tune;//把当前SYS_song清除
  145.         _delay_ms(5);
  146.         Line_1A_WTN(SYS_tune_last);//播放当前song,播放完
  147.     }
  148.     /* 2-声源音量更新处理 */
  149.     if(SYS_vol != SYS_vol_last)
  150.     {
  151.         SYS_vol_last = SYS_vol;//把当前SYS_song清除
  152.         _delay_ms(5);
  153.         Line_1A_WTN(SYS_vol_last);//播放当前song,播放完
  154.     }

  155. //2- 定时更新策略,间隔40ms,保证芯片不在忙状态;
  156. //    if(f40ms == true)
  157. //    {
  158. //        f40ms = false;
  159. //        /* 1-依次发出声音 */
  160. //        Audio_playsong(SYS_song);
  161. //        _delay_ms(5);
  162. //        /* 2-频率 */
  163. //        Line_1A_WTN(SYS_tune);
  164. //        _delay_ms(5);
  165. //        /* 3-音量 */
  166. //        Audio_playsong(SYS_vol);
  167. //        
  168. //    }
  169.    
  170.    
  171. }
复制代码


送上一个新唐M0的代码 ,将就看下吧.

使用特权

评论回复
| 2019-7-7 21:45 | 显示全部楼层
单线 1Wire 协议,  只是能支持这个协议的单片机不多见

使用特权

评论回复
| 2019-7-8 09:21 | 显示全部楼层
説的很清楚了,按照协议写个就是了,不就是延时程序而已吗

使用特权

评论回复
| 2019-7-8 09:55 | 显示全部楼层
单线UART。我记得线路要加上拉电阻。

使用特权

评论回复
| 2019-7-8 15:59 | 显示全部楼层
最后一张图 说的很详细

使用特权

评论回复
| 2019-7-8 23:51 | 显示全部楼层
简单时序,Very easy!

使用特权

评论回复
| 2019-7-9 14:40 | 显示全部楼层
问思泽远要驱动代码呀

使用特权

评论回复
| 2019-7-9 14:56 | 显示全部楼层
和DS18B20的单线协议类似

使用特权

评论回复
| 2019-7-9 16:54 | 显示全部楼层
资料上已经很明确了。照着来就行了。

使用特权

评论回复
| 2019-7-12 09:19 | 显示全部楼层
之前用过一个音乐播放的ic,也是一根IO的通讯协议控制

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /6 下一条

在线客服 快速回复 返回顶部 返回列表