请问下语音IC与单片机只有一根线怎么写代码?
手头上有个DMEO板,语音IC通过一根线与MCU连接,看网上资料都是两根线,一个BSUY DATA两根线,这个单根线怎么让他发声了?请各位大神写段代码给小弟,附件图片为资料,音量最大为0X50H,第一首为0X01H,切换曲目为0X60H 单总线协议就是这样,按照最后一张图片的时序写就是了。一定要满足延时时间,可以参考18B20或者红外的写法,而且这种芯片一般都会给出参考例程的。 找个广州唯创的数据书册,里面有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的代码 ,将就看下吧.
单线 1Wire 协议,只是能支持这个协议的单片机不多见 説的很清楚了,按照协议写个就是了,不就是延时程序而已吗 单线UART。我记得线路要加上拉电阻。 最后一张图 说的很详细 简单时序,Very easy! 问思泽远要驱动代码呀 和DS18B20的单线协议类似 资料上已经很明确了。照着来就行了。 之前用过一个音乐播放的ic,也是一根IO的通讯协议控制 学习了。都是高手过招 提示错误,'N us'附近的语法错误,预期')'void Delay_N10us( u08 N_us)
页:
[1]