Side Menu

PM50语音电路

2017-5-6 11:24| 发布者: admin| 查看: 624| 评论: 0

摘要: 一. 实验目的1.掌握 PM50 系列芯片基本控制时序和控制方法。2.能够应用 MCS-51 系列单片机和语音芯片设计实现语音应用电路。二. 实验内容设计实现公共汽车语音报站器,配有 4 个按键,通过单片机控制 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 方式,连线图如下: 

六、具体程序如下: 
 
#include<reg52.h> 
 
#define uchar unsigned char 
#define uint unsigned int 
 
#define Pm50_START 7           // 车启动 
#define Pm50_REA DY 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_O 1==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:b reak;//不止一个键按下 

}
}
}
}
}


鲜花

握手

雷人

路过

鸡蛋