|
單片機(jī)源程序如下:- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- //***********************************************************************
- //語(yǔ)音合成相關(guān)引腳及參數(shù)
- //***********************************************************************
- sbit TTS_BUSY = P1^0; //檢測(cè)SYN6288模塊工作狀態(tài)
- #define HEAD_LEN 5 //數(shù)據(jù)包頭的長(zhǎng)度
- #define LEN_OFFSET 2 //長(zhǎng)度字節(jié)的偏移量(本例中長(zhǎng)度不超過(guò)255字節(jié),因此只使用1字節(jié)長(zhǎng)度)
- #define BKM_OFFSET 4 //背景音樂(lè)命令偏移
- #define BKM_MAX 15 //背景音樂(lè)數(shù)量
- //數(shù)據(jù)包頭(0xFD + 2字節(jié)長(zhǎng)度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
- code uchar head[HEAD_LEN] = {0xfd,0x00,0x00,0x01,0x00};
- uchar nBkm = 0x00;
- //***********************************************************************
- //人機(jī)接口(僅作演示,端口和功能請(qǐng)自行修改)
- //***********************************************************************
- #define KEY P0 //定義用來(lái)檢測(cè)按鍵的端口
- #define LED P2 //用于顯示
- //***********************************************************************
- //語(yǔ)音內(nèi)容
- //***********************************************************************
- //以下內(nèi)容僅供演示,請(qǐng)自行修改
- code char welcome[] = {"[m10]歡迎使用追夢(mèng)實(shí)驗(yàn)室公交車語(yǔ)音報(bào)站系統(tǒng),本系統(tǒng)采用SYN6288語(yǔ)音合成模塊設(shè)計(jì)實(shí)現(xiàn)"};
- #define MSG_NUM 13 //消息數(shù),根據(jù)需要自行修改
- code uchar * msg[MSG_NUM] = { //以下內(nèi)容請(qǐng)自行修改
- {"乘客您好,歡迎乘坐"},
- {"[n1]309[n0]路"}, //車次,采用單個(gè)數(shù)字變讀(1讀作幺)模式,讀后恢復(fù)正常模式
- {"公交車,本路車由"},
- {"開(kāi)往"},
- {",前門上車,后門下車,本車無(wú)人售票,請(qǐng)自備零錢"},
- {"車輛起動(dòng),請(qǐng)站穩(wěn)扶好"},
- {"車輛轉(zhuǎn)彎,請(qǐng)注意安全"},
- {"前方到站"},
- {"下車的乘客后門請(qǐng)"},
- {"車站到了,請(qǐng)您帶好隨身物品,從后門下車,謝謝您的乘坐,再見(jiàn)"},
- {"始發(fā)站"},
- {"終點(diǎn)站"},
- {"soundk"}
- };
- #define STA_NUM 7 //車站數(shù),根據(jù)需要自行修改
- code uchar * sta[STA_NUM] = {
- {"東城區(qū)"},
- {"百貨商場(chǎng)"},
- {"文化宮"},
- {"眼科"},
- {"廣場(chǎng)"},
- {"學(xué)院"},
- {"地方"}
- };
- //***********************************************************************
- //全局變量
- //***********************************************************************
- uchar nSta = 0; //當(dāng)前站點(diǎn)
- uchar nFirstSta = 0; //始發(fā)站
- uchar nLastSta = STA_NUM - 1; //終點(diǎn)站
- //***********************************************************************
- //功能函數(shù)
- //***********************************************************************
- //延時(shí)
- void Delay(uint 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 SendChar(uchar n)
- {
- SBUF = n;
- while(TI==0); //發(fā)送數(shù)據(jù)
- TI=0;
- }
- //背景音樂(lè)(參數(shù)為0表示關(guān)閉背景音樂(lè))
- void BkMusic(uchar num)
- {
- num %= BKM_MAX + 1;
- nBkm = num;
- }
- //發(fā)聲程序
- void Speech(uchar *buf)
- {
- uchar i = 0; //循環(huán)計(jì)數(shù)變量
- uchar xor = 0x00; //校驗(yàn)碼初始化
- uchar ch = 0x00;
- uchar len = 0x00;
- while(buf[len++]);
- //發(fā)送數(shù)據(jù)包頭(0xFD + 2字節(jié)長(zhǎng)度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
- for(i = 0; i < HEAD_LEN; i++)
- {
- if(i == BKM_OFFSET)
- ch = nBkm << 3; //寫入背景音樂(lè)
- else if(i == LEN_OFFSET)
- ch = len + 3;
- else
- ch = head[i];
- xor ^= ch;
- SendChar(ch);
- Delay(1);
- }
- //發(fā)送文字內(nèi)容
- for(i = 0; i < len; i++)
- {
- xor ^= buf[i];
- SendChar(buf[i]);
- Delay(1);
- }
- SendChar(xor); //發(fā)送校驗(yàn)位
- Delay(10);
- while(TTS_BUSY); //等待語(yǔ)音結(jié)束
- Delay(10);
- }
- //鍵掃描
- void keyScan(void)
- {
- uchar k;
- KEY = 0xff; //置位鍵端口以讀取鍵值
- //演示所用按鍵定義如下:
- //bit0 上行始發(fā)
- //bit1 上車提示
- //bit2 起動(dòng)提示
- //bit3 轉(zhuǎn)彎提示
- //bit4 下行一站
- //bit5 上行一站
- //bit6 下車提示
- //bit7 下行始發(fā)
- //Speech(msg[n].text); 用于朗讀第n條提示信息
- //Speech(sta[n].text); 用于朗讀第n個(gè)車站名
- if(KEY != 0xff) //如果有鍵按下
- {
- k = KEY; //取鍵值
- Delay(1); //消抖
- if(KEY == k) //確認(rèn)按下
- {
- LED = k;
- Speech(msg[12]); //提示音
- switch(k)
- {
- case 0xfe: //bit0 上行始發(fā)站
- nSta = 0;
- Speech(msg[10]); //始發(fā)站
- Speech(sta[nSta]); //站名
- break;
- case 0xfd: //bit1 上車提示
- Speech(msg[0]);
- Speech(msg[1]);
- Speech(msg[2]);
- Speech(sta[nFirstSta]);
- Speech(msg[3]);
- Speech(sta[nLastSta]);
- Speech(msg[4]);
- break;
- case 0xfb: //bit2 起動(dòng)提示
- Speech(msg[5]);
- break;
- case 0xf7: //bit3 轉(zhuǎn)彎提示
- Speech(msg[6]);
- break;
- case 0xef: //bit4 下行一站
- nFirstSta = 0;
- nLastSta = STA_NUM - 1;
- if(nSta < STA_NUM-1) //下行一站
- {
- nSta++;
- }
- Speech(msg[7]); //前方到站
- if(nSta == STA_NUM - 1) //是否終點(diǎn)站
- {
- Speech(msg[11]);
- }
- Speech(sta[nSta]); //站名
- Speech(msg[8]); //到站提示
- break;
- case 0xdf: //bit5 上行一站
- nFirstSta = STA_NUM - 1;
- nLastSta = 0;
- if(nSta > 0) //上行一站
- {
- nSta--;
- }
- Speech(msg[7]); //前方到站
- if(nSta == 0) //是否終點(diǎn)站
- {
- Speech(msg[11]);
- }
- Speech(sta[nSta]); //站名
- Speech(msg[8]); //到站提示
- break;
- case 0xbf: //bit6 下車提示
- Speech(sta[nSta]); //站名
- Speech(msg[9]); //到站提示
- break;
- case 0x7f: //bit7 下行始發(fā)
- nSta = STA_NUM - 1;
- Speech(msg[10]); //始發(fā)站
- Speech(sta[nSta]); //站名
- break;
- default:
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
Keil代碼下載:
C51(公交報(bào)站).7z
(9.73 KB, 下載次數(shù): 23)
2021-9-24 16:25 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|