代表0或1。先拉低RESET复位信号5ms,然后置高电平等待大于17ms的时间,再将数据信号拉低5ms,最后发送数据。若高电平与低电平的时间比为1:3则代表数据位0,3:1则代表数据位1,且高电平在前,低电平在后,先发数据的低位再发高位。图4-7中D0~D7表示一个地址或者命令数据,数据中的00H~DBH是地址指令,F2H是循环播放命令,FEH是停止播放命令,E0H~E7H是音量调节命令。
本设计的程序工程中WT588D模块的程序流程图如图4-8。
开始初始化接收到指令?Y发音NN完成发音?Y结束
图4-8 WT588D的程序流程图
在初始化部分中设置主控芯片与WT588D模块相连接的IO口。WT588D模块的SDA、REST设置为上拉推挽输出模式,BUSY设置为上拉输入模式。当WT588D接收到指令后调用flash内的语音进行发音。程序中利用模块的BUSY信号来判断是否完成发音。
根据WT588D模块的时序图编写写数据函数void send_dat(u8 addr)(由于该模块与主控芯片的连接为单向,所以无需编写读数据函数),具体代码如下: void send_dat(u8 addr) {
u8 i; rst=0;
delay_ms(5);
//复位信号保持低电平5ms
- XXV -
1 0 }
rst=1;
delay_ms(17); sda=0;
delay_ms(5); for(i=0;i<8;i++) {
sda=1;
//无论是1还是0 sda都是先高电平
//数据信号置于低电平5ms //复位信号保持低电平17ms
if(addr & 1) {
delay_us(600);//高电平比低电平为600us:200us,表示发送数据
}
sda=0; delay_us(200);
else {
delay_us(200);//高电平比低电平为200us:600us,表示发送数据
}
}
sda=0; delay_us(600);
addr>>=1; sda=1;
将语音合成软件合成的语音碎片通过程序组织起来,形成语音。各函数功能如下:
播报0~9999任意整数函数:void pronounce_num(u16 t); 播报小数点后三位数函数:void pronounce_point3num(u16 t);
- XXVI -
播报小数点后两位数函数:void pronounce_point2num(u8 t)。
4.2.3 HX711芯片部分
HX711是一个可编程多通道可选增益的A/D转换芯片。通过PD_SCK的脉冲个数来选择转换通道和增益,其时序如图4-9。
图4-9 HX711设置时序图
其中T1为DOUT下降沿到PD_SCK脉冲上升沿的时间,最小值为0.1us;T2为PD_SCK脉冲上升沿到DOUT数据有效的时间,最大不能超过0.1us;T3为PD_SCK正脉冲电平时间,最小为0.2us;T4为PD_SCK负脉冲电平时间,最小为0.2us。
HX711程序流程如图4-10。
开始初始化发送25个脉冲获得A/D值结束
图4-10 HX711程序流程图
在初始化程序中完成主控芯片与HX711芯片连接的IO口配置。HX711芯片的PD_SCK设置为推挽输入,DOUT设置为上拉输入。程序工程中HX711的初始化函数为void HX711_int(void)。
根据HX711芯片的时序图编写写数据函数u32 Read_HX711(void)(由于该芯
- XXVII -
片只需发数据给主控芯片,所以无需编写写入数据的函数)具体函数代码如下: u32 Read_HX711(void) { }
4.2.4 DS18B20芯片部分
DS18B20通过单总线和主控芯片连接,时序比较复杂。DS18B20部分的程序流程如图4-11。
u32 count=0; u8 i; AD_sck=0;
while(AD_dout); for(i=0;i<24;i++) { }
AD_sck=1;
count=count^0x800000; AD_sck=0; return count;
AD_sck=1;
//上升沿
//AD_dout为1时表明A/D转换器还未准备好
count=count<<1; AD_sck=0; if(AD_dout)
count++;
- XXVIII -