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