jiangzb520 发表于 2019-7-6 22:21

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

    手头上有个DMEO板,语音IC通过一根线与MCU连接,看网上资料都是两根线,一个BSUY DATA两根线,这个单根线怎么让他发声了?请各位大神写段代码给小弟,附件图片为资料,音量最大为0X50H,第一首为0X01H,切换曲目为0X60H

xyz549040622 发表于 2019-7-6 22:55

单总线协议就是这样,按照最后一张图片的时序写就是了。一定要满足延时时间,可以参考18B20或者红外的写法,而且这种芯片一般都会给出参考例程的。

Harvard 发表于 2019-7-7 21:41

找个广州唯创的数据书册,里面有demo

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


#define Delay_1ms _delay_ms

void Delay_N10us( u08 n_us)
{
    u08 i=0;
    for(i=0;i<n_us;i++)
    {
      CLK_SysTickDelay(10);
    }
}

void Line_1A_WTN( u08 ddata)
{
    u08 S_DATA;
    u08 B_DATA;
    u08 j;
    S_DATA = ddata;
    P_DATA = 1;
    _delay_us(1);
    P_DATA = 0;
    Delay_1ms(5); //延时5ms
    B_DATA = S_DATA&0X01;
   
    for(j=0;j<8;j++)
    {
      if(B_DATA )
      {
            P_DATA = 1;
            Delay_N10us(60); //延时600us
            P_DATA = 0;
            Delay_N10us(20); //延时200us
      }
      else
      {
            P_DATA = 1;
            Delay_N10us(20); //延时200us
            P_DATA = 0;
            Delay_N10us(60); //延时600us
      }
      
      S_DATA = S_DATA>>1;
      B_DATA = S_DATA&0X01;
    }
   
    P_DATA = 1;
}
/**
* @brief    播放某个编号的声音文件
*
* @param    声音文件编号
*
* @return   None
*
* @Details   
*            
*/
void Audio_playsong( u16 song)
{
    /* 本语音芯片只有160段语音: 0-0x9F*/
    if(song<= 0x9F)
    {
      Line_1A_WTN(song);
      //_delay_ms(5);
    }
}


/* 定义0-21km/h速度对应的音量 */
u08 speed2volume_tab =
{
    40, //速度0
    40, //速度1
    40, //速度2
    39, //速度3
    38, //速度4
    37, //速度5
    36, //速度6
    35, //速度7
    34, //速度8
    33, //速度9
    32, //速度10
    30, //速度11
    29, //速度12
    28, //速度13
    27, //速度14
    26, //速度15
    25, //速度16
    24, //速度17
    23, //速度18
    22, //速度19
    20 //速度20   
};

void Audio_proc(void)
{

    /* 0- VSP处理:根据当前的速度,查表,获取到对应的频率和音量*/
    if(SYS_msg1_data5_speed<=20)
    {
      /*0.1查表获取音量 */
      SYS_msg1_data6_vol = speed2volume_tab ;
      /*0.2系统音量转化为唯创WTV600语音IC的音量
      *   系统为0-40,唯创为0-15; 因此系数为15/40,也即3/8   
      */
      SYS_vol = SYS_msg1_data6_vol *3/8 +0xE0;
      SYS_vol_last = SYS_vol -1;//产生音量刷新的条件
    }
    else
    {
      //刷新成最小音量
      SYS_vol         = 0xE0;
      SYS_vol_last    = 0xE1;
    }
   
    /* 1- 根据速度发出提示音: 在2-20km/h区间,其余静音*/
    if( SYS_msg1_data5_speed<2 )
    {
      SYS_song = SONG9_SILENT;
      SYS_song_last = SONG0_DIDIDI;
    }
    else if(SYS_msg1_data5_speed>=2 && SYS_msg1_data5_speed<=20 )
    {
      SYS_song = SONG0_DIDIDI;
      SYS_song_last = SONG9_SILENT;
      
      
    }
    else if(SYS_msg1_data5_speed>20 )
    {
      SYS_song = SONG9_SILENT;
      SYS_song_last = SONG0_DIDIDI;
    }

   //1- 传统控制思路: 有不同的控制值 ,就更新
    /* 1-声源更新处理 */
    if(SYS_song != SYS_song_last)
    {
      SYS_song_last = SYS_song;//把当前SYS_song清除
      Audio_playsong(SYS_song_last);//播放当前song,播放完
    }
    /* 2-声源频率更新处理 */
    if(SYS_tune != SYS_tune_last)
    {
      SYS_tune_last = SYS_tune;//把当前SYS_song清除
      _delay_ms(5);
      Line_1A_WTN(SYS_tune_last);//播放当前song,播放完
    }
    /* 2-声源音量更新处理 */
    if(SYS_vol != SYS_vol_last)
    {
      SYS_vol_last = SYS_vol;//把当前SYS_song清除
      _delay_ms(5);
      Line_1A_WTN(SYS_vol_last);//播放当前song,播放完
    }

//2- 定时更新策略,间隔40ms,保证芯片不在忙状态;
//    if(f40ms == true)
//    {
//      f40ms = false;
//      /* 1-依次发出声音 */
//      Audio_playsong(SYS_song);
//      _delay_ms(5);
//      /* 2-频率 */
//      Line_1A_WTN(SYS_tune);
//      _delay_ms(5);
//      /* 3-音量 */
//      Audio_playsong(SYS_vol);
//      
//    }
   
   
}


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

airwill 发表于 2019-7-7 21:45

单线 1Wire 协议,只是能支持这个协议的单片机不多见

ayb_ice 发表于 2019-7-8 09:21

説的很清楚了,按照协议写个就是了,不就是延时程序而已吗

tianqi911 发表于 2019-7-8 09:55

单线UART。我记得线路要加上拉电阻。

hobbye501 发表于 2019-7-8 15:59

最后一张图 说的很详细

coody 发表于 2019-7-8 23:51

简单时序,Very easy!

windows100 发表于 2019-7-9 14:40

问思泽远要驱动代码呀

cainiao518 发表于 2019-7-9 14:56

和DS18B20的单线协议类似

songchenping 发表于 2019-7-9 16:54

资料上已经很明确了。照着来就行了。

dirtwillfly 发表于 2019-7-12 09:19

之前用过一个音乐播放的ic,也是一根IO的通讯协议控制

语音方案黄生 发表于 2019-10-4 17:38

学习了。都是高手过招

飞鼠智能 发表于 2022-4-30 23:31

提示错误,'N us'附近的语法错误,预期')'void Delay_N10us( u08 N_us)

zwsam 发表于 2022-8-3 09:06

页: [1]
查看完整版本: 请问下语音IC与单片机只有一根线怎么写代码?