打印
[51单片机]

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

[复制链接]
1795|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
    手头上有个DMEO板,语音IC通过一根线与MCU连接,看网上资料都是两根线,一个BSUY DATA两根线,这个单根线怎么让他发声了?请各位大神写段代码给小弟,附件图片为资料,音量最大为0X50H,第一首为0X01H,切换曲目为0X60H

QQ截图20190706221208.jpg (135.65 KB )

QQ截图20190706221208.jpg

QQ截图20190706221151.jpg (136.21 KB )

QQ截图20190706221151.jpg

QQ截图20190706192534.jpg (112.33 KB )

QQ截图20190706192534.jpg

QQ截图20190706192451.jpg (140.67 KB )

QQ截图20190706192451.jpg

使用特权

评论回复

相关帖子

沙发
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;
}
/**
* [url=home.php?mod=space&uid=247401]@brief[/url]    播放某个编号的声音文件
*
* @param    声音文件编号
*
* [url=home.php?mod=space&uid=266161]@return[/url]   None
*
* [url=home.php?mod=space&uid=1543424]@Details[/url]   
*            
*/
void Audio_playsong( u16 song)
{
    /* 本语音芯片只有160段语音: 0-0x9F*/
    if(song<= 0x9F)
    {
        Line_1A_WTN(song);
        //_delay_ms(5);
    }
}


/* 定义0-21km/h速度对应的音量 */
u08 speed2volume_tab[21] =
{
    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[20-SYS_msg1_data5_speed] ;
        /*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 协议,  只是能支持这个协议的单片机不多见

使用特权

评论回复
5
ayb_ice| | 2019-7-8 09:21 | 只看该作者
説的很清楚了,按照协议写个就是了,不就是延时程序而已吗

使用特权

评论回复
6
tianqi911| | 2019-7-8 09:55 | 只看该作者
单线UART。我记得线路要加上拉电阻。

使用特权

评论回复
7
hobbye501| | 2019-7-8 15:59 | 只看该作者
最后一张图 说的很详细

使用特权

评论回复
8
coody| | 2019-7-8 23:51 | 只看该作者
简单时序,Very easy!

使用特权

评论回复
9
windows100| | 2019-7-9 14:40 | 只看该作者
问思泽远要驱动代码呀

使用特权

评论回复
10
cainiao518| | 2019-7-9 14:56 | 只看该作者
和DS18B20的单线协议类似

使用特权

评论回复
评论
cainiao518 2022-6-20 13:53 回复TA
@gim008 :确实 
gim008 2022-6-20 13:33 回复TA
比18b20要简单多了 
11
songchenping| | 2019-7-9 16:54 | 只看该作者
资料上已经很明确了。照着来就行了。

使用特权

评论回复
12
dirtwillfly| | 2019-7-12 09:19 | 只看该作者
之前用过一个音乐播放的ic,也是一根IO的通讯协议控制

使用特权

评论回复
13
语音方案黄生| | 2019-10-4 17:38 | 只看该作者
学习了。都是高手过招

使用特权

评论回复
14
飞鼠智能| | 2022-4-30 23:31 | 只看该作者
提示错误,'N us'附近的语法错误,预期')'void Delay_N10us( u08 N_us)

使用特权

评论回复
15
zwsam| | 2022-8-3 09:06 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

186

帖子

2

粉丝