找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 2788|回復(fù): 0
收起左側(cè)

SYN6288基于51單片機(jī)的(公交報(bào)站)程序

[復(fù)制鏈接]
ID:210588 發(fā)表于 2021-9-24 08:55 | 顯示全部樓層 |閱讀模式
單片機(jī)源程序如下:
  1. #include <reg51.h>

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

  4. //***********************************************************************
  5. //語(yǔ)音合成相關(guān)引腳及參數(shù)
  6. //***********************************************************************
  7. sbit TTS_BUSY   =      P1^0; //檢測(cè)SYN6288模塊工作狀態(tài)

  8. #define HEAD_LEN       5  //數(shù)據(jù)包頭的長(zhǎng)度
  9. #define LEN_OFFSET    2  //長(zhǎng)度字節(jié)的偏移量(本例中長(zhǎng)度不超過(guò)255字節(jié),因此只使用1字節(jié)長(zhǎng)度)
  10. #define BKM_OFFSET    4  //背景音樂(lè)命令偏移
  11. #define BKM_MAX      15         //背景音樂(lè)數(shù)量

  12. //數(shù)據(jù)包頭(0xFD + 2字節(jié)長(zhǎng)度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
  13. code uchar head[HEAD_LEN] = {0xfd,0x00,0x00,0x01,0x00};
  14. uchar nBkm = 0x00;

  15. //***********************************************************************
  16. //人機(jī)接口(僅作演示,端口和功能請(qǐng)自行修改)
  17. //***********************************************************************
  18. #define KEY         P0      //定義用來(lái)檢測(cè)按鍵的端口
  19. #define LED         P2      //用于顯示

  20. //***********************************************************************
  21. //語(yǔ)音內(nèi)容
  22. //***********************************************************************
  23. //以下內(nèi)容僅供演示,請(qǐng)自行修改
  24. code char welcome[] = {"[m10]歡迎使用追夢(mèng)實(shí)驗(yàn)室公交車語(yǔ)音報(bào)站系統(tǒng),本系統(tǒng)采用SYN6288語(yǔ)音合成模塊設(shè)計(jì)實(shí)現(xiàn)"};

  25. #define MSG_NUM     13   //消息數(shù),根據(jù)需要自行修改
  26. code uchar * msg[MSG_NUM] = {      //以下內(nèi)容請(qǐng)自行修改
  27.     {"乘客您好,歡迎乘坐"},
  28.         {"[n1]309[n0]路"},      //車次,采用單個(gè)數(shù)字變讀(1讀作幺)模式,讀后恢復(fù)正常模式
  29.     {"公交車,本路車由"},
  30.         {"開(kāi)往"},
  31.         {",前門上車,后門下車,本車無(wú)人售票,請(qǐng)自備零錢"},
  32.         {"車輛起動(dòng),請(qǐng)站穩(wěn)扶好"},
  33.         {"車輛轉(zhuǎn)彎,請(qǐng)注意安全"},
  34.         {"前方到站"},
  35.         {"下車的乘客后門請(qǐng)"},
  36.         {"車站到了,請(qǐng)您帶好隨身物品,從后門下車,謝謝您的乘坐,再見(jiàn)"},
  37.         {"始發(fā)站"},
  38.         {"終點(diǎn)站"},
  39.         {"soundk"}
  40. };

  41. #define STA_NUM      7    //車站數(shù),根據(jù)需要自行修改
  42. code uchar * sta[STA_NUM] = {
  43.         {"東城區(qū)"},
  44.         {"百貨商場(chǎng)"},
  45.         {"文化宮"},
  46.         {"眼科"},
  47.         {"廣場(chǎng)"},
  48.         {"學(xué)院"},
  49.         {"地方"}
  50. };

  51. //***********************************************************************
  52. //全局變量
  53. //***********************************************************************
  54. uchar nSta            = 0;            //當(dāng)前站點(diǎn)
  55. uchar nFirstSta       = 0;            //始發(fā)站
  56. uchar nLastSta        = STA_NUM - 1;  //終點(diǎn)站

  57. //***********************************************************************
  58. //功能函數(shù)
  59. //***********************************************************************
  60. //延時(shí)
  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時(shí),設(shè)定串口波特率為9600bit/s,方式3  
  71.         TMOD=0x20;
  72.         PCON=0x00;
  73.         TH1=0xFD;
  74.         TR1=1;        
  75. }

  76. //串口發(fā)送數(shù)據(jù)
  77. void SendChar(uchar n)
  78. {
  79.         SBUF = n;   
  80.         while(TI==0);  //發(fā)送數(shù)據(jù)   
  81.         TI=0;        
  82. }

  83. //背景音樂(lè)(參數(shù)為0表示關(guān)閉背景音樂(lè))
  84. void BkMusic(uchar num)
  85. {
  86.         num %= BKM_MAX + 1;
  87.         nBkm = num;
  88. }

  89. //發(fā)聲程序
  90. void Speech(uchar *buf)
  91. {
  92.         uchar i = 0;          //循環(huán)計(jì)數(shù)變量
  93.         uchar xor = 0x00;     //校驗(yàn)碼初始化
  94.         uchar ch = 0x00;
  95.     uchar len = 0x00;

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

  97.         //發(fā)送數(shù)據(jù)包頭(0xFD + 2字節(jié)長(zhǎng)度 + 1字節(jié)命令字 + 1字節(jié)命令參數(shù))
  98.         for(i = 0; i < HEAD_LEN; i++)
  99.         {
  100.                 if(i == BKM_OFFSET)
  101.                         ch = nBkm << 3; //寫入背景音樂(lè)
  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.         //發(fā)送文字內(nèi)容
  111.         for(i = 0; i < len; i++)
  112.         {
  113.                 xor ^= buf[i];
  114.                 SendChar(buf[i]);
  115.                 Delay(1);
  116.         }

  117.         SendChar(xor);       //發(fā)送校驗(yàn)位

  118.         Delay(10);
  119.         while(TTS_BUSY);           //等待語(yǔ)音結(jié)束
  120.         Delay(10);
  121. }

  122. //鍵掃描
  123. void keyScan(void)
  124. {
  125.     uchar k;

  126.     KEY = 0xff;            //置位鍵端口以讀取鍵值

  127.   //演示所用按鍵定義如下:
  128.     //bit0   上行始發(fā)
  129.     //bit1   上車提示
  130.     //bit2   起動(dòng)提示
  131.     //bit3   轉(zhuǎn)彎提示
  132.     //bit4   下行一站
  133.     //bit5   上行一站
  134.     //bit6   下車提示
  135.     //bit7   下行始發(fā)

  136.          //Speech(msg[n].text);   用于朗讀第n條提示信息
  137.         //Speech(sta[n].text);   用于朗讀第n個(gè)車站名

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

  142.                 if(KEY == k)       //確認(rèn)按下
  143.                 {
  144.                         LED = k;

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

  146.                         switch(k)
  147.                         {
  148.                         case 0xfe:  //bit0  上行始發(fā)站
  149.                                 nSta = 0;
  150.                                 Speech(msg[10]);      //始發(fā)站
  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   起動(dòng)提示
  163.                                 Speech(msg[5]);                                          
  164.                                 break;
  165.                         case 0xf7:  //bit3   轉(zhuǎn)彎提示
  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)  //是否終點(diǎn)站
  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)  //是否終點(diǎn)站
  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   下行始發(fā)
  203.                                 nSta = STA_NUM - 1;
  204.                                 Speech(msg[10]);      //始發(fā)站
  205.                                 Speech(sta[nSta]);  //站名
  206.                                 break;
  207.                         default:
  208. ……………………

  209. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
51hei.png
Keil代碼下載: C51(公交報(bào)站).7z (9.73 KB, 下載次數(shù): 23)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表