|
如題,我寫了個程序,如果把獨立按鍵去掉語音播報就播報不了。求教各位大神如何將語音播報中的獨立按鍵去掉也能讓語音正常播報。
#include <reg51.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY P0 //P1用于鍵掃描
#define BUFLEN 32 //文字緩沖區(qū)的長度
#define HEADLEN 5 //數(shù)據包頭的長度
#define LEN_OFFSET 2 //長度字節(jié)的偏移量(本例中長度不超過255字節(jié),因此只使用1字節(jié)長度)
//數(shù)據包頭(0xFD + 2字節(jié)長度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};
//文字(中間有需要變化的內容可在發(fā)送前修改)
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;
}
//串口發(fā)送數(shù)據
void UART_Trans(uchar n)
{
SBUF = n;
while(TI==0); //發(fā)送數(shù)據
TI=0;
}
//發(fā)聲程序
void Speech(uchar *buf, uchar len)
{
uchar i = 0; //循環(huán)計數(shù)變量
uchar xor = 0x00; //校驗碼初始化
head[LEN_OFFSET] = len + 3; //計算正文長度(1命令字 + 1命令參數(shù) + 文字長度 + 1校驗位)
//發(fā)送數(shù)據包頭(0xFD + 2字節(jié)長度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
for(i = 0; i < HEADLEN; i++)
{
xor ^= head[i];
UART_Trans(head[i]);
Delay1ms(2);
}
//發(fā)送文字內容
for(i = 0; i < len; i++)
{
xor ^= buf[i];
UART_Trans(buf[i]);
Delay1ms(2);
}
UART_Trans(xor); //發(fā)送校驗位
}
//主函數(shù)
void main()
{
uchar xor = 0; //校驗碼(正文內容的異或)
uchar i = 0; //循環(huán)計數(shù)變量
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); //將浮點數(shù) num 轉為字符串,
//并追加到數(shù)組text[]的第6字節(jié)后
//(前6字節(jié)為字符串“當前值”)
//參見庫函數(shù)sprintf()的用法
num -= 0.43;
Speech(text,20); //調用發(fā)聲函數(shù),讀出指定長度數(shù)據
}
}
Delay1ms(100); //延時
}
}
|
|