|
如題,我寫了個(gè)程序,如果把獨(dú)立按鍵去掉語(yǔ)音播報(bào)就播報(bào)不了。求教各位大神如何將語(yǔ)音播報(bào)中的獨(dú)立按鍵去掉也能讓語(yǔ)音正常播報(bào)。
#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ū)的長(zhǎng)度
#define HEADLEN 5 //數(shù)據(jù)包頭的長(zhǎng)度
#define LEN_OFFSET 2 //長(zhǎng)度字節(jié)的偏移量(本例中長(zhǎng)度不超過255字節(jié),因此只使用1字節(jié)長(zhǎng)度)
//數(shù)據(jù)包頭(0xFD + 2字節(jié)長(zhǎng)度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
uchar head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x00};
//文字(中間有需要變化的內(nèi)容可在發(fā)送前修改)
uchar text[BUFLEN] = {"機(jī)油溫度 度"};
//延時(shí)1ms
void Delay1ms(uchar n)
{
uchar i=112;
while(n--)
{
while(i--);
}
}
//串口初始化
void UART_InitBaud(void)
{
SCON=0xD8 ; //晶振為11.059MHZ時(shí),設(shè)定串口波特率為9600bit/s,方式3
TMOD=0x20 ;
PCON=0x00 ;
TH1=0xFD ;
TR1=1;
}
//串口發(fā)送數(shù)據(jù)
void UART_Trans(uchar n)
{
SBUF = n;
while(TI==0); //發(fā)送數(shù)據(jù)
TI=0;
}
//發(fā)聲程序
void Speech(uchar *buf, uchar len)
{
uchar i = 0; //循環(huán)計(jì)數(shù)變量
uchar xor = 0x00; //校驗(yàn)碼初始化
head[LEN_OFFSET] = len + 3; //計(jì)算正文長(zhǎng)度(1命令字 + 1命令參數(shù) + 文字長(zhǎng)度 + 1校驗(yàn)位)
//發(fā)送數(shù)據(jù)包頭(0xFD + 2字節(jié)長(zhǎng)度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
for(i = 0; i < HEADLEN; i++)
{
xor ^= head[i];
UART_Trans(head[i]);
Delay1ms(2);
}
//發(fā)送文字內(nèi)容
for(i = 0; i < len; i++)
{
xor ^= buf[i];
UART_Trans(buf[i]);
Delay1ms(2);
}
UART_Trans(xor); //發(fā)送校驗(yàn)位
}
//主函數(shù)
void main()
{
uchar xor = 0; //校驗(yàn)碼(正文內(nèi)容的異或)
uchar i = 0; //循環(huán)計(jì)數(shù)變量
float num = 123.45; //測(cè)試值,可以由用戶程序自動(dòng)生成
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); //將浮點(diǎn)數(shù) num 轉(zhuǎn)為字符串,
//并追加到數(shù)組text[]的第6字節(jié)后
//(前6字節(jié)為字符串“當(dāng)前值”)
//參見庫(kù)函數(shù)sprintf()的用法
num -= 0.43;
Speech(text,20); //調(diào)用發(fā)聲函數(shù),讀出指定長(zhǎng)度數(shù)據(jù)
}
}
Delay1ms(100); //延時(shí)
}
}
|
|