基于STM32电子秤系统的设计与实现 下载本文

代表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 -