单片机源程序如下:- #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黑下载附件…………
复制代码
Keil代码下载:
C51(公交报站).7z
(9.73 KB, 下载次数: 23)
|