标题:
SYN6288基于51单片机的(公交报站)程序
[打印本页]
作者:
lyh一点点
时间:
2021-9-24 08:55
标题:
SYN6288基于51单片机的(公交报站)程序
单片机源程序如下:
#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
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1