|
如题,我写了个程序,如果把独立按键去掉语音播报就播报不了。求教各位大神如何将语音播报中的独立按键去掉也能让语音正常播报。
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY P0 //P1用于键扫描
#define BUFLEN 32 //文字缓冲区的长度
#define HEADLEN 5 //数据包头的长度
#define LEN_OFFSET 2 //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)
//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};
//文字(中间有需要变化的内容可在发送前修改)
uchar text[BUFLEN] = {"机油温度 度"};
//延时1ms
void Delay1ms(uchar n)
{
uchar i=112;
while(n--)
{
while(i--);
}
}
//串口初始化
void UART_InitBaud(void)
{
SCON=0xD8 ; //晶振为11.059MHZ时,设定串口波特率为9600bit/s,方式3
TMOD=0x20 ;
PCON=0x00 ;
TH1=0xFD ;
TR1=1;
}
//串口发送数据
void UART_Trans(uchar n)
{
SBUF = n;
while(TI==0); //发送数据
TI=0;
}
//发声程序
void Speech(uchar *buf, uchar len)
{
uchar i = 0; //循环计数变量
uchar xor = 0x00; //校验码初始化
head[LEN_OFFSET] = len + 3; //计算正文长度(1命令字 + 1命令参数 + 文字长度 + 1校验位)
//发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
for(i = 0; i < HEADLEN; i++)
{
xor ^= head[i];
UART_Trans(head[i]);
Delay1ms(2);
}
//发送文字内容
for(i = 0; i < len; i++)
{
xor ^= buf[i];
UART_Trans(buf[i]);
Delay1ms(2);
}
UART_Trans(xor); //发送校验位
}
//主函数
void main()
{
uchar xor = 0; //校验码(正文内容的异或)
uchar i = 0; //循环计数变量
float num = 123.45; //测试值,可以由用户程序自动生成
uchar numbuf[10];
memset(numbuf,0,sizeof numbuf);
UART_InitBaud(); //初始化串口为 9600bps
while(1)
{
if(KEY != 0xff)
{
Delay1ms(10);
if(KEY != 0xff)
{
sprintf(text + 10,"%6.2f",num); //将浮点数 num 转为字符串,
//并追加到数组text[]的第6字节后
//(前6字节为字符串“当前值”)
//参见库函数sprintf()的用法
num -= 0.43;
Speech(text,20); //调用发声函数,读出指定长度数据
}
}
Delay1ms(100); //延时
}
}
|
|