找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2178|回复: 0
收起左侧

SYN6288基于51单片机的(公交报站)程序

[复制链接]
ID:210588 发表于 2021-9-24 08:55 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include <reg51.h>

  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. //***********************************************************************
  5. //语音合成相关引脚及参数
  6. //***********************************************************************
  7. sbit TTS_BUSY   =      P1^0; //检测SYN6288模块工作状态

  8. #define HEAD_LEN       5  //数据包头的长度
  9. #define LEN_OFFSET    2  //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)
  10. #define BKM_OFFSET    4  //背景音乐命令偏移
  11. #define BKM_MAX      15         //背景音乐数量

  12. //数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
  13. code uchar head[HEAD_LEN] = {0xfd,0x00,0x00,0x01,0x00};
  14. uchar nBkm = 0x00;

  15. //***********************************************************************
  16. //人机接口(仅作演示,端口和功能请自行修改)
  17. //***********************************************************************
  18. #define KEY         P0      //定义用来检测按键的端口
  19. #define LED         P2      //用于显示

  20. //***********************************************************************
  21. //语音内容
  22. //***********************************************************************
  23. //以下内容仅供演示,请自行修改
  24. code char welcome[] = {"[m10]欢迎使用追梦实验室公交车语音报站系统,本系统采用SYN6288语音合成模块设计实现"};

  25. #define MSG_NUM     13   //消息数,根据需要自行修改
  26. code uchar * msg[MSG_NUM] = {      //以下内容请自行修改
  27.     {"乘客您好,欢迎乘坐"},
  28.         {"[n1]309[n0]路"},      //车次,采用单个数字变读(1读作幺)模式,读后恢复正常模式
  29.     {"公交车,本路车由"},
  30.         {"开往"},
  31.         {",前门上车,后门下车,本车无人售票,请自备零钱"},
  32.         {"车辆起动,请站稳扶好"},
  33.         {"车辆转弯,请注意安全"},
  34.         {"前方到站"},
  35.         {"下车的乘客后门请"},
  36.         {"车站到了,请您带好随身物品,从后门下车,谢谢您的乘坐,再见"},
  37.         {"始发站"},
  38.         {"终点站"},
  39.         {"soundk"}
  40. };

  41. #define STA_NUM      7    //车站数,根据需要自行修改
  42. code uchar * sta[STA_NUM] = {
  43.         {"东城区"},
  44.         {"百货商场"},
  45.         {"文化宫"},
  46.         {"眼科"},
  47.         {"广场"},
  48.         {"学院"},
  49.         {"地方"}
  50. };

  51. //***********************************************************************
  52. //全局变量
  53. //***********************************************************************
  54. uchar nSta            = 0;            //当前站点
  55. uchar nFirstSta       = 0;            //始发站
  56. uchar nLastSta        = STA_NUM - 1;  //终点站

  57. //***********************************************************************
  58. //功能函数
  59. //***********************************************************************
  60. //延时
  61. void Delay(uint n)
  62. {
  63.     uchar i=112;

  64.         while(n--)
  65.                 while(i--);
  66. }

  67. //串口初始化
  68. void UART_InitBaud(void)
  69. {
  70.         SCON=0xD8;  //晶振为11.059MHZ时,设定串口波特率为9600bit/s,方式3  
  71.         TMOD=0x20;
  72.         PCON=0x00;
  73.         TH1=0xFD;
  74.         TR1=1;        
  75. }

  76. //串口发送数据
  77. void SendChar(uchar n)
  78. {
  79.         SBUF = n;   
  80.         while(TI==0);  //发送数据   
  81.         TI=0;        
  82. }

  83. //背景音乐(参数为0表示关闭背景音乐)
  84. void BkMusic(uchar num)
  85. {
  86.         num %= BKM_MAX + 1;
  87.         nBkm = num;
  88. }

  89. //发声程序
  90. void Speech(uchar *buf)
  91. {
  92.         uchar i = 0;          //循环计数变量
  93.         uchar xor = 0x00;     //校验码初始化
  94.         uchar ch = 0x00;
  95.     uchar len = 0x00;

  96.     while(buf[len++]);

  97.         //发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
  98.         for(i = 0; i < HEAD_LEN; i++)
  99.         {
  100.                 if(i == BKM_OFFSET)
  101.                         ch = nBkm << 3; //写入背景音乐
  102.                 else if(i == LEN_OFFSET)
  103.                         ch = len + 3;
  104.                 else
  105.                         ch = head[i];

  106.                 xor ^= ch;
  107.                 SendChar(ch);
  108.                 Delay(1);
  109.            }

  110.         //发送文字内容
  111.         for(i = 0; i < len; i++)
  112.         {
  113.                 xor ^= buf[i];
  114.                 SendChar(buf[i]);
  115.                 Delay(1);
  116.         }

  117.         SendChar(xor);       //发送校验位

  118.         Delay(10);
  119.         while(TTS_BUSY);           //等待语音结束
  120.         Delay(10);
  121. }

  122. //键扫描
  123. void keyScan(void)
  124. {
  125.     uchar k;

  126.     KEY = 0xff;            //置位键端口以读取键值

  127.   //演示所用按键定义如下:
  128.     //bit0   上行始发
  129.     //bit1   上车提示
  130.     //bit2   起动提示
  131.     //bit3   转弯提示
  132.     //bit4   下行一站
  133.     //bit5   上行一站
  134.     //bit6   下车提示
  135.     //bit7   下行始发

  136.          //Speech(msg[n].text);   用于朗读第n条提示信息
  137.         //Speech(sta[n].text);   用于朗读第n个车站名

  138.         if(KEY != 0xff)        //如果有键按下
  139.         {
  140.                 k = KEY;           //取键值
  141.                 Delay(1);          //消抖

  142.                 if(KEY == k)       //确认按下
  143.                 {
  144.                         LED = k;

  145.                         Speech(msg[12]);      //提示音

  146.                         switch(k)
  147.                         {
  148.                         case 0xfe:  //bit0  上行始发站
  149.                                 nSta = 0;
  150.                                 Speech(msg[10]);      //始发站
  151.                                 Speech(sta[nSta]);  //站名
  152.                                 break;
  153.                         case 0xfd:  //bit1   上车提示
  154.                                 Speech(msg[0]);
  155.                                 Speech(msg[1]);
  156.                                 Speech(msg[2]);
  157.                                 Speech(sta[nFirstSta]);
  158.                                 Speech(msg[3]);
  159.                              Speech(sta[nLastSta]);
  160.                                 Speech(msg[4]);
  161.                                 break;
  162.                         case 0xfb:  //bit2   起动提示
  163.                                 Speech(msg[5]);                                          
  164.                                 break;
  165.                         case 0xf7:  //bit3   转弯提示
  166.                                 Speech(msg[6]);
  167.                                 break;
  168.                         case 0xef:  //bit4   下行一站
  169.                                 nFirstSta = 0;
  170.                                 nLastSta  = STA_NUM - 1;

  171.                                 if(nSta < STA_NUM-1) //下行一站
  172.                                 {
  173.                                         nSta++;
  174.                                 }

  175.                                 Speech(msg[7]); //前方到站

  176.                                 if(nSta == STA_NUM - 1)  //是否终点站
  177.                                 {
  178.                                         Speech(msg[11]);
  179.                                 }

  180.                                 Speech(sta[nSta]); //站名
  181.                                 Speech(msg[8]); //到站提示
  182.                                 break;

  183.                         case 0xdf:  //bit5   上行一站
  184.                                 nFirstSta = STA_NUM - 1;
  185.                                 nLastSta  = 0;

  186.                                 if(nSta > 0) //上行一站
  187.                                 {
  188.                                         nSta--;
  189.                                 }

  190.                                 Speech(msg[7]); //前方到站

  191.                                 if(nSta == 0)  //是否终点站
  192.                                 {
  193.                                         Speech(msg[11]);
  194.                                 }

  195.                                 Speech(sta[nSta]); //站名
  196.                                 Speech(msg[8]); //到站提示
  197.                                 break;

  198.                         case 0xbf:  //bit6   下车提示
  199.                                 Speech(sta[nSta]); //站名
  200.                                 Speech(msg[9]); //到站提示

  201.                                 break;

  202.                         case 0x7f:  //bit7   下行始发
  203.                                 nSta = STA_NUM - 1;
  204.                                 Speech(msg[10]);      //始发站
  205.                                 Speech(sta[nSta]);  //站名
  206.                                 break;
  207.                         default:
  208. ……………………

  209. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
Keil代码下载: C51(公交报站).7z (9.73 KB, 下载次数: 23)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表