基于PM50和单片机的公交语音报站系统-辽宁大学

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

PM50语音电路
一. 实验目的
1.掌握PM50系列芯片基本控制时序和控制方法。

2.能够应用MCS-51系列单片机和语音芯片设计实现语音应用电路。

二. 实验内容
设计实现公共汽车语音报站器,配有4个按键,通过单片机控制PM50播放语音信息。

公交车设为5站,每站都有2个提示语音:
1.前方到站***请下车的乘客做好准备
2.车已启动,请站稳,下一站***
4个按键分别实现以下4个功能:
1.语音播放、2上一站、3下一站、4逆向报音
三. 实验原理
PM50 系列智能语音芯片既是语音播放电路,也是智能单片机。

其开发设计 简单度、智能控制的简单度、整体性价比等指标要远胜过ISD。

配合编程软 件可以开发出并行、串性、智能型等多种控制模式。

PM50可直接驱动0.5W 功率的扬声器,使电路更加简单。

串行模式下最大可分 128 段, K1 为数 据端, K2 为时钟端, O1 为忙信号端。

时钟上升沿时数据端有效。

语音段 的地址为 80H~FFH ,第一段的地址是 80H ,按顺序排列。

四. 电路设计
选择操作简单的串行模式,扬声器驱动选择PWM方式,连线图如下:
图1 PM50连线图

2 按键连线图

3 整体连线图
五.
图4 流程图
PM50 语音内容
80H 辽宁大学
81H 宁山路
82H 北行
83H 碧塘公园
84H 沈阳北
85H 前方到站****
86H 请下车的乘客做好准备
87H 车已启动,请站稳,下一站****
图5 语音信息表
六、具体程序如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define Pm50_START 7 // 车启动
#define Pm50_READY 6 // 准备下车
#define Pm50_STOP 5 // 车到站
sbit P_Pm50_K1=P2^1; //数据
sbit P_Pm50_K2=P2^2; //时钟
sbit P_Pm50_O1=P2^0; //忙信号
bit Pm50_Way=0; //正向
char Station=0; //站次(0~4)5站
uchar Kpnum=0; //key1按键次数
uchar Current=0; //当前站次
uchar K1num=1; //Key1键第二次按下的次数
void Delay_ulong(unsigned long z) //延时z*1us
{
while(z--);
}
void Play_Pm50(uchar adr)//Pm50放音
{
uchar i;
adr=adr+0x80;
P_Pm50_K2=1;
P_Pm50_K1=1;
P_Pm50_K1=0;
Delay_ulong(60000); //延时60ms
P_Pm50_K1=1;
for(i=0;i<8;i++)
{
P_Pm50_K2=0;
P_Pm50_K1=(bit)(adr&0x01);
adr>>=1;
P_Pm50_K2=1;
}
while(P_Pm50_O1==1); //等待方音结束,结束时忙信号拉低
}
void main(void)
{
while(1)
{
uchar tmp;
tmp=P1&0x0f;
if(tmp != 0x0f)
{
Delay_ulong(10000);
if(tmp != 0x0f)
{
switch(tmp)
{
case 0x0e:Kpnum++;
if(K1num==2)
{
K1num=1;
if(Pm50_Way==1){Station--;if(Station<0)Station=4;}
else{Station++;if(Station>4)Station=0;}
}
if(Kpnum==2)
{
Kpnum=0;Play_Pm50(Pm50_START);K1num++;
if(Pm50_Way==0)
{if(Current==4)Play_Pm50(0);
else Play_Pm50(Current+1);}
else{if(Current==0)Play_Pm50(4);else
Play_Pm50(Current-1);}
}
else
{Play_Pm50(Pm50_STOP);Play_Pm50(Station);
Current=Station;Play_Pm50(Pm50_READY);
};break;
case 0x0d:Station++;if(Station>4)Station=0;Kpnum=0;K1num=0;;break;
case 0x0b:Station--;if(Station<0)Station=4;Kpnum=0;K1num=0;;break;
case 0x07:Pm50_Way=~Pm50_Way;Kpnum=0;break;
default:break;//不止一个键按下
}
}
}
}
}。

相关文档
最新文档