標(biāo)題: 一個(gè)簡(jiǎn)單的基于STC89C52單片機(jī)的排隊(duì)叫號(hào)系統(tǒng)設(shè)計(jì) [打印本頁(yè)]

作者: sanshuige    時(shí)間: 2018-6-29 13:46
標(biāo)題: 一個(gè)簡(jiǎn)單的基于STC89C52單片機(jī)的排隊(duì)叫號(hào)系統(tǒng)設(shè)計(jì)
這個(gè)是我同學(xué)搞的設(shè)計(jì),他是網(wǎng)上買的程序,本質(zhì)上就是個(gè)基于STC89C52的排隊(duì)叫號(hào),組成的東西也簡(jiǎn)單,2個(gè)STC,2個(gè)1602,蜂鳴器,一堆獨(dú)立按鍵,還有個(gè)WT588D語(yǔ)言芯片和喇叭,通信用的是有線的串口。具體實(shí)現(xiàn)的功能我會(huì)發(fā)個(gè)視頻鏈接。發(fā)出來(lái)也是為需要的人省點(diǎn)錢。具體的電氣連接參考keil程序的引腳定義就可以了,語(yǔ)言芯片要導(dǎo)入的源文件也在壓縮包里面。總體來(lái)講這個(gè)設(shè)計(jì)沒(méi)什么復(fù)雜的東西,正常的設(shè)計(jì)是不需要語(yǔ)音播報(bào)的。如果覺(jué)得獨(dú)立按鍵較多也可以自己改成矩陣鍵盤(pán),反正這東西焊獨(dú)立按鍵也是要花點(diǎn)時(shí)間的。

視頻的連接如下
https://pan.baidu.com/s/1vc_4T3Y6zcxwFNuki_eOEA
單片機(jī)源碼:
  1. /*************************************************************************
  2. *工程名稱: 排隊(duì)叫號(hào)系統(tǒng)----叫號(hào)模塊程序                             *
  3. *單片機(jī)型號(hào):STC89C52RC                                                  *
  4. *晶振頻率:11.0592MHz                                                                                                        *
  5. *作者:新興光電                                                          *
  6. *日期:2016-03-01                                                        *
  7. *************************************************************************/
  8. #include<reg51.h>
  9. #include <intrins.h>
  10. #include "LCD1602.h"

  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define FOSC 11059200L      //系統(tǒng)晶振頻率
  14. #define BAUD 9600           //串口波特率
  15. #define SMOD 1              //為1,加倍波特率計(jì)算
  16. #if SMOD
  17.         #define TC_VAL (256-FOSC/16/12/BAUD)
  18. //#else   #define TC_VAL (256-FOSC/32/12/BAUD)
  19. #endif
  20. /**********端口定義*******************************/
  21. sbit call_key1=P1^0;        //呼叫鍵
  22. sbit recall_key1=P1^1;  //重復(fù)呼叫鍵
  23. sbit mute_key1=P1^2;        //消音鍵
  24. sbit stop_key1=P1^3;        //暫停鍵

  25. sbit call_key2=P1^4;        //呼叫鍵
  26. sbit recall_key2=P1^5;  //重復(fù)呼叫鍵
  27. sbit mute_key2=P1^6;        //消音鍵
  28. sbit stop_key2=P1^7;        //暫停鍵

  29. sbit call_key3=P3^2;        //呼叫鍵
  30. sbit recall_key3=P3^3;  //重復(fù)呼叫鍵
  31. sbit mute_key3=P3^4;        //消音鍵
  32. sbit stop_key3=P3^5;        //暫停鍵

  33. sbit beep=P3^6;   //蜂鳴器
  34. //語(yǔ)音相關(guān)
  35. sbit RST=P2^4;                        //復(fù)位腳  在非工業(yè)場(chǎng)合下這個(gè)可以不要
  36. sbit busy=P2^3;         //WT588D忙檢測(cè)端口                無(wú)播放時(shí)輸出高電平
  37. sbit SDA=P2^2;
  38. sbit CS =P2^1;
  39. sbit SCL=P2^0;
  40. /**************************************************/
  41. /***********寄存器定義*****************************/
  42. /*
  43. uchar code TAB[12]  =  {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};
  44. //以上為共陰數(shù)碼管段碼表 0    1    2    3    4    5    6    7    8   9     -   無(wú)
  45. uchar dis_buf[9];  //顯示緩存
  46. uchar dis_cnt;     //顯示計(jì)數(shù)  */
  47. //以下為串口用到的寄存器
  48. bit uart_busy;               //串口忙檢測(cè)
  49. bit uart_R_flag=0;      //串口數(shù)據(jù)接收完畢標(biāo)志
  50. bit uart_T_flag=0;  //串口數(shù)據(jù)發(fā)送標(biāo)志
  51. //uchar uart_buf;       //串口數(shù)據(jù)寄存器         
  52. //uchar count;        
  53. uchar receive[4];         //數(shù)據(jù)接收格式  0xa5(起始位) 機(jī)器號(hào)(1~3) 呼叫號(hào)碼(0x01取號(hào)) 0x5a(結(jié)束位)
  54. uchar send_buf[4];  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 指令(0x01取號(hào)) 0x5a(結(jié)束位)
  55. uchar rec_cnt=0;
  56. //呼叫相關(guān)寄存器
  57. //uchar get_cnt=0;   //取號(hào)計(jì)數(shù)
  58. //uchar call_cnt=0;  //呼叫計(jì)數(shù)
  59. bit NO1_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  60. bit NO2_sta=0; //二號(hào)窗狀態(tài)
  61. bit NO3_sta=0; //三號(hào)窗狀態(tài)
  62. uchar NO1_number; //窗口一號(hào)碼
  63. uchar NO2_number; //窗口二號(hào)碼
  64. uchar NO3_number; //窗口三號(hào)碼

  65. //蜂鳴器相關(guān)定義
  66. bit beep_flag=0;  //蜂鳴標(biāo)志
  67. bit beep_end_flag=0;
  68. uchar beep_cnt=0;   //蜂鳴器計(jì)數(shù)
  69. uchar beep_end_cnt=0;
  70. //語(yǔ)音播放地址定義:
  71. //0--播放"0"; 1--播放"1"; 2--播放"2"; 3--播放"3"; 4--播放"4"; 5--播放"5"; 6--播放"6"; 7--播放"7";
  72. //8--播放"8"; 9--播放"9"; 10--播放"請(qǐng)"; 11--播放"號(hào)到"; 12--播放"號(hào)窗口";
  73. // 三線串口,音頻輸出PWM,忙信號(hào)輸出LOW
  74. //WT588D相關(guān)寄存器定義
  75. //一線,二線,三線有關(guān)
  76. #define         H                  1        //定義1為高電平
  77. #define         L                 0        //定義0為低電平
  78. //////////////變量/////////////////
  79. //bit         flag           = 1;
  80. bit         B_DATA;                                                //傳輸數(shù)據(jù)一位
  81. unsigned char          SB_DATA   = 0;                //一字節(jié)公用數(shù)據(jù)緩存器
  82. unsigned char          S_DATA    = 0x00;

  83. bit play_flag=0;      //播放標(biāo)志
  84. uchar play_part_sta=0; //0為一號(hào)窗口,1為二號(hào)窗口,3為三號(hào)窗口
  85. uchar play_cnt;
  86. uchar play_end_cnt=7;
  87. uchar idata sound_buf1[7];
  88. uchar idata sound_buf2[7];
  89. uchar idata sound_buf3[7];
  90. /**************************************************/
  91. /***************延時(shí)程序***************************/
  92. void Delay1ms(uint t)    //1ms延時(shí)程序
  93. {
  94.         uchar j;
  95.         while(t--)
  96.         {
  97.                 for(j=0;j<125;j++)
  98.                 { ; }
  99.         }
  100. }
  101. /**************************************************/
  102. /*************串口初始化程序***********************/
  103. void serial_init(void)
  104. {
  105.     PCON=0x80;
  106.         SCON=0x50;            //8位數(shù)據(jù)串口,波特率可變  無(wú)校驗(yàn)位
  107.         TMOD=0x21;                                  //定時(shí)器1設(shè)為8位自動(dòng)重裝
  108.         TH1=TC_VAL;        //定時(shí)初始值
  109.         TL1=TH1;
  110.         ES = 1;                 //串口中斷允許
  111.         EA = 1;                 //總中斷允許
  112.         TR1=1;
  113. }
  114. /**************************************************/
  115.   /***********串口中斷服務(wù)程序*********************/
  116. void serial() interrupt 4
  117. {
  118.     if (RI)
  119.     {
  120.         RI = 0;            //串口接收中斷完畢標(biāo)志清0
  121.             //uart_buf=SBUF;   //接收數(shù)據(jù)
  122.         //        call_cnt=SBUF;      //接收數(shù)據(jù)  獲得叫號(hào)數(shù)
  123.                 receive[rec_cnt]=SBUF;   //接收數(shù)據(jù)
  124.                 rec_cnt++;
  125.                 if(receive[0]==0xa5) //判斷起始位
  126.                 {
  127.                         if(receive[rec_cnt-1]==0x5a&&rec_cnt==4)  //數(shù)據(jù)接收完畢
  128.                         {
  129.                                 uart_R_flag=1;   //串口接收完畢標(biāo)志
  130.                         }
  131.                 }
  132.                 else rec_cnt=0;
  133.                 if(rec_cnt>=4)
  134.                         rec_cnt=0;
  135.     }
  136.     if (TI)
  137.     {
  138.         TI = 0;             //串口發(fā)送中斷完畢標(biāo)志清0
  139.         uart_busy = 0;           //串口忙標(biāo)志清0
  140.     }
  141. }
  142. /***************************************************/
  143. /*************串口發(fā)送一字節(jié)數(shù)據(jù)程序****************/
  144. void send_uart_dat(uchar dat)
  145. {
  146.     while (uart_busy);           //忙檢測(cè)標(biāo)志 等后上一字節(jié)數(shù)據(jù)發(fā)送完畢
  147.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  148.     uart_busy = 1;
  149.     SBUF = ACC;             //發(fā)送數(shù)據(jù)至串口發(fā)送緩沖寄存器
  150. }
  151. /***************************************************/
  152. /*************串口發(fā)送字符串?dāng)?shù)據(jù)程序****************
  153. void send_uart_stringdat(uchar *s)
  154. {
  155.     while (*s)              //檢查數(shù)據(jù)是否結(jié)束
  156.     {
  157.         send_uart_dat(*s++);     //發(fā)送字符串
  158.     }
  159. }
  160. /***************************************************/
  161. /********串口發(fā)送字符串?dāng)?shù)據(jù)程序*********************
  162. void send_uart_stringdat(uchar *send_dat)
  163. {
  164.     do              
  165.     {            
  166.         send_uart_dat(*send_dat);     //發(fā)送字符
  167.                 send_dat++;
  168.     }while(*send_dat!='\0');     //檢查數(shù)據(jù)是否結(jié)束   
  169. }
  170. /***************************************************/
  171. /********數(shù)據(jù)轉(zhuǎn)換用于顯示***************************
  172. void cov_dis(uchar num1,uchar num2,uchar num3)
  173. {
  174.         dis_buf[0]=TAB[num1/100];     //顯示緩存
  175.         dis_buf[1]=TAB[num1%100/10];  //顯示緩存
  176.         dis_buf[2]=TAB[num1%100%10];  //顯示緩存
  177.         
  178.         dis_buf[3]=TAB[num2/100];     //顯示緩存
  179.         dis_buf[4]=TAB[num2%100/10];  //顯示緩存
  180.         dis_buf[5]=TAB[num2%100%10];  //顯示緩存
  181.         
  182.         dis_buf[6]=TAB[num3/100];     //顯示緩存
  183.         dis_buf[7]=TAB[num3%100/10];  //顯示緩存
  184.         dis_buf[8]=TAB[num3%100%10];  //顯示緩存
  185. }
  186. /***************************************************/
  187. /*********定時(shí)器0中斷服務(wù)程序***********************/
  188. void timer0(void) interrupt 1
  189. {

  190.         TL0 = 0x00;                //設(shè)置定時(shí)初值         20ms  11.0592MHz
  191.         TH0 = 0xB8;                //設(shè)置定時(shí)初值
  192. /*        P2=0xff;  
  193.         DIG1=1;
  194.         Dport=0x00;
  195.     dis_cnt++;  //顯示計(jì)數(shù)
  196.         switch(dis_cnt)
  197.         {
  198.                 case 1: DIG1=0; Dport=dis_buf[0]; break;
  199.                 case 2: DIG2=0; Dport=dis_buf[1]; break;
  200.                 case 3: DIG3=0; Dport=dis_buf[2]; break;
  201.                 case 4: DIG4=0; Dport=dis_buf[3]; break;
  202.                 case 5: DIG5=0; Dport=dis_buf[4]; break;
  203.                 case 6: DIG6=0; Dport=dis_buf[5]; break;
  204.                 case 7: DIG7=0; Dport=dis_buf[6]; break;
  205.                 case 8: DIG8=0; Dport=dis_buf[7]; break;
  206.                 case 9: dis_cnt=0; DIG9=0; Dport=dis_buf[8]; break;
  207.         }
  208.                   */
  209.         if(beep_flag==1)  //蜂鳴標(biāo)志
  210.         {
  211.                 beep_cnt++;          //蜂鳴計(jì)數(shù)
  212.                 if(beep_cnt>=25)  //500ms計(jì)時(shí)
  213.                 {
  214.                     beep_cnt=0;
  215.                         beep=~beep;
  216.                         beep_end_cnt--;
  217.                         if(beep_end_cnt==0||beep_end_cnt==255)
  218.                         {
  219.                                 beep_flag=0;
  220.                                 beep_end_flag=1;
  221.                         }
  222.                 }
  223.         }
  224.         else
  225.         {
  226.                 beep_cnt=0;
  227.                 beep=1; //關(guān)蜂鳴器
  228.         }
  229. }
  230. /**********************************************************/
  231. /**********顯示3位數(shù)據(jù)**************************/
  232. void dis_3byte(uchar dat)
  233. {
  234.     LCD1602_Write(LCD1602_data,dat/100+0x30);
  235.         LCD1602_Write(LCD1602_data,dat%100/10+0x30);
  236.         LCD1602_Write(LCD1602_data,dat%10+0x30);
  237. }
  238. /***********************************************/
  239. /****************************************************/
  240. void Delay150us()                //@12.000MHz
  241. {
  242.         unsigned char i;

  243.         _nop_();
  244.         i = 72;
  245.         while (--i);
  246. }
  247. /*--------------------------------------
  248. ;功    能:實(shí)現(xiàn)三線單字節(jié)低位在前串口通信函數(shù)適用于WT588D
  249. ;入    參:無(wú)
  250. ;出    參:0            返回主函數(shù)
  251. ;-------------------------------------*/
  252. /*************三線串口通信程序***********************/
  253.         Send_threelines(unsigned char addr) //三線發(fā)碼子程序
  254.         {
  255.                 unsigned char i;
  256.                 RST=0;
  257.                 Delay1ms(5);
  258.                 RST=1;
  259.                 Delay1ms(20); /* 復(fù)位拉高20ms*/
  260.                 CS=0;
  261.                 Delay1ms(5); /* 片選拉低5ms */
  262.                 for(i=0;i<8;i++)
  263.                 {
  264.                         SCL=0;
  265.                         if(addr & 1)SDA=1;
  266.                         else SDA=0;
  267.                         addr>>=1;
  268.                         Delay150us(); /* 150us */
  269.                         SCL=1;
  270.                         Delay150us();
  271.                 }
  272.                 CS=1;
  273.                 Delay1ms(30);
  274.         }
  275. /***************************************************/
  276. /***********語(yǔ)音數(shù)據(jù)轉(zhuǎn)換****************************/
  277. sound_dat_cov(uchar num,uchar dat,uchar *buf)  //窗口號(hào),窗口數(shù)值 播放緩存
  278. {
  279.     uchar n=0;
  280.     *(buf+n)=10; //播放'請(qǐng)'
  281.         n++;
  282.         *(buf+n)=dat/100; //播放數(shù)值
  283.         n++;
  284.         *(buf+n)=dat%100/10; //播放數(shù)值
  285.         n++;
  286.         *(buf+n)=dat%10; //播放數(shù)值
  287.         n++;
  288.     *(buf+n)=11; //播放'號(hào)到'
  289.         n++;
  290.     *(buf+n)=num; //播放數(shù)值
  291.         n++;
  292.     *(buf+n)=12; //播放'號(hào)窗口'
  293. }
  294. /***************************************************/
  295. /***********語(yǔ)音播報(bào)數(shù)據(jù)****************************/
  296. void play_data(void)           
  297. {
  298.         if(busy) //不播放時(shí)為1,播放時(shí)為0
  299.         {
  300.                 if(play_cnt<play_end_cnt)
  301.                 {
  302.                     if(play_cnt==0)
  303.                         {
  304.                             if(NO1_sta==1||NO2_sta==1||NO3_sta==1)
  305.                                 {
  306.                                         if(beep_flag==0&&beep_end_flag==0)  //蜂鳴標(biāo)志
  307.                                         {
  308.                                             beep_flag=1;
  309.                                                 beep_end_cnt=2;         
  310.                                         }
  311.                                 }
  312.                         }
  313.                         if(beep_end_flag==1)
  314.                         {
  315.                                 switch(play_part_sta)
  316.                                 {
  317.                                         case 0:
  318.                                                 if(NO1_sta==1)
  319.                                                         {
  320.                                                                 Send_threelines(sound_buf1[play_cnt]);        //播放語(yǔ)音
  321.                                                                 play_cnt++;
  322.                                                         }
  323.                                                         else
  324.                                                                 play_cnt=7;
  325.                                                         break;
  326.                                         case 1:
  327.                                                 if(NO2_sta==1)
  328.                                                         {
  329.                                                                 Send_threelines(sound_buf2[play_cnt]);        //播放語(yǔ)音
  330.                                                                 play_cnt++;
  331.                                                         }
  332.                                                         else
  333.                                                                 play_cnt=7;
  334.                                                         break;
  335.                                         case 2:
  336.                                                 if(NO3_sta==1)
  337.                                                         {
  338.                                                                 Send_threelines(sound_buf3[play_cnt]);        //播放語(yǔ)音
  339.                                                                 play_cnt++;
  340.                                                         }
  341.                                                         else
  342.                                                                 play_cnt=7;
  343.                                                         break;
  344.                                 }
  345.                         }
  346.                 }
  347.                 else         //一段語(yǔ)音播放完畢
  348.                 {
  349.                         beep_end_flag=0;
  350.                         //播放切換
  351.                     play_part_sta++; //0為一號(hào)窗口,1為二號(hào)窗口,3為三號(hào)窗口
  352.                         if(play_part_sta>=3)
  353.                         {
  354.                                 play_part_sta=0;
  355.                         }
  356.                         if(play_part_sta==0)
  357.                         {
  358.                         if(NO1_sta==1&&NO1_number!=0)
  359.                                 {
  360.                                         play_cnt=0;
  361.                                 }
  362.                                 else play_part_sta++;
  363.                         }
  364.                         if(play_part_sta==1)
  365.                         {
  366.                         if(NO2_sta==1&&NO2_number!=0)
  367.                                 {
  368.                                         play_cnt=0;
  369.                                 }
  370.                                 else play_part_sta++;
  371.                         }
  372.                         if(play_part_sta==2)
  373.                         {
  374.                         if(NO3_sta==1&&NO3_number!=0)
  375.                                 {
  376.                                         play_cnt=0;
  377.                                 }
  378.                         }
  379.                 }
  380.         }
  381. }
  382. /****************************************************/
  383. /**************按鍵掃描程序********************************/
  384. void key_check(void)
  385. {
  386.         //一號(hào)窗
  387.         if(call_key1==0)        //呼叫鍵
  388.         {
  389.                 Delay1ms(80);
  390.                 if(call_key1==0)
  391.                 {
  392.                         send_buf[1]=1;  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 呼叫號(hào)碼(1~255) 0x5a(結(jié)束位)
  393.                         uart_T_flag=1;  //串口數(shù)據(jù)發(fā)送標(biāo)志
  394.                         while(!call_key1); //等待按鍵釋放
  395.                 }  
  396.         }
  397.         else if(recall_key1==0)  //重復(fù)呼叫鍵
  398.         {
  399.                 Delay1ms(100);
  400.             if(recall_key1==0)
  401.                 {
  402.                     if(NO1_number!=0)
  403.                         NO1_sta=1;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  404.                 }
  405.         }
  406.         else if(mute_key1==0)        //消音鍵
  407.         {
  408.                 Delay1ms(100);
  409.                 if(mute_key1==0)
  410.                 {
  411.                     NO1_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  412.                 }
  413.         }
  414.         else if(stop_key1==0)        //暫停鍵
  415.         {
  416.             Delay1ms(100);
  417.                 if(stop_key1==0)
  418.                 {
  419.                         NO1_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  420.                         NO1_number=0;
  421.                     LCD1602_Print(0,1,"---");
  422.                 }
  423.         }
  424.         //二號(hào)窗
  425.         if(call_key2==0)        //呼叫鍵
  426.         {
  427.                 Delay1ms(80);
  428.                 if(call_key2==0)
  429.                 {
  430.                         send_buf[1]=2;  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 呼叫號(hào)碼(1~255) 0x5a(結(jié)束位)
  431.                         uart_T_flag=1;  //串口數(shù)據(jù)發(fā)送標(biāo)志
  432.                         while(!call_key2); //等待按鍵釋放
  433.                 }  
  434.         }
  435.         else if(recall_key2==0)  //重復(fù)呼叫鍵
  436.         {
  437.                 Delay1ms(100);
  438.             if(recall_key2==0)
  439.                 {
  440.                     if(NO2_number!=0)
  441.                         NO2_sta=1;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  442.                 }
  443.         }
  444.         else if(mute_key2==0)        //消音鍵
  445.         {
  446.                 Delay1ms(100);
  447.                 if(mute_key2==0)
  448.                 {
  449.                     NO2_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  450.                 }
  451.         }
  452.         else if(stop_key2==0)        //暫停鍵
  453.         {
  454.             Delay1ms(100);
  455.                 if(stop_key2==0)
  456.                 {
  457.                         NO2_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  458.                         NO2_number=0;
  459.                     LCD1602_Print(6,1,"---");
  460.                 }
  461.         }
  462.         //三號(hào)窗
  463.         if(call_key3==0)        //呼叫鍵
  464.         {
  465.                 Delay1ms(80);
  466.                 if(call_key3==0)
  467.                 {
  468.                         send_buf[1]=3;  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 呼叫號(hào)碼(1~255) 0x5a(結(jié)束位)
  469.                         uart_T_flag=1;  //串口數(shù)據(jù)發(fā)送標(biāo)志
  470.                         while(!call_key3); //等待按鍵釋放
  471.                 }  
  472.         }
  473.         else if(recall_key3==0)  //重復(fù)呼叫鍵
  474.         {
  475.                 Delay1ms(100);
  476.             if(recall_key3==0)
  477.                 {
  478.                     if(NO3_number!=0)
  479.                         NO3_sta=1;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  480.                 }
  481.         }
  482.         else if(mute_key3==0)        //消音鍵
  483.         {
  484.                 Delay1ms(100);
  485.                 if(mute_key3==0)
  486.                 {
  487.                     NO3_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  488.                 }
  489.         }
  490.         else if(stop_key3==0)        //暫停鍵
  491.         {
  492.             Delay1ms(100);
  493.                 if(stop_key3==0)
  494.                 {
  495.                         NO3_sta=0;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  496.                         NO3_number=0;
  497.                     LCD1602_Print(12,1,"---");
  498.                 }
  499.         }
  500. }
  501. /**********************************************************/
  502. /**************主程序**************************************/
  503. void main(void)
  504. {
  505.     LCD1602_init(); //初始化液晶
  506.         LCD1602_Print(0,0,"NO.1  NO.2  NO.3");
  507.         LCD1602_Print(0,1,"---   ---   --- ");
  508.     serial_init();  //串口初始化程序
  509.     TMOD=0x21;      //設(shè)置定時(shí)器0為16位模式
  510.         TL0 = 0x00;                //設(shè)置定時(shí)初值         20ms  11.0592MHz
  511.         TH0 = 0xB8;                //設(shè)置定時(shí)初值
  512.         TR0=1;
  513.         ET0=1;
  514.         EA=1;

  515.         while(1)
  516.         {
  517.                 key_check();      //按鍵掃描程序         
  518.                 if(uart_R_flag==1)//串口數(shù)據(jù)接收完畢標(biāo)志
  519.                 {
  520.                     switch(receive[1])  //判斷機(jī)器號(hào)
  521.                         {
  522.                                 case 1:
  523.                                         NO1_number=receive[2]; //窗口一號(hào)碼
  524.                                                 if(receive[2]!=0)
  525.                                                 {
  526.                                                         GotoXY(0,1);
  527.                                                         dis_3byte(NO1_number);
  528.                                                         NO1_sta=1;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  529.                                                         //語(yǔ)音數(shù)據(jù)轉(zhuǎn)換
  530.                                                         sound_dat_cov(1,NO1_number,sound_buf1);  //窗口號(hào),窗口數(shù)值 播放緩存

  531.                                                 }
  532.                                                 break;
  533.                                 case 2:
  534.                                         NO2_number=receive[2]; //窗口二號(hào)碼
  535.                                                 if(receive[2]!=0)
  536.                                                 {
  537.                                                         GotoXY(6,1);
  538.                                                         dis_3byte(NO2_number);
  539.                                                         NO2_sta=1;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  540.                                                         //語(yǔ)音數(shù)據(jù)轉(zhuǎn)換
  541.                                                         sound_dat_cov(2,NO2_number,sound_buf2);  //窗口號(hào),窗口數(shù)值 播放緩存
  542.                                                 }
  543.                                                 break;
  544.                                 case 3:
  545.                                         NO3_number=receive[2]; //窗口三號(hào)碼
  546.                                                 if(receive[2]!=0)
  547.                                                 {
  548.                                                         GotoXY(12,1);
  549.                                                         dis_3byte(NO3_number);
  550.                                                         NO3_sta=1;  //一號(hào)窗狀態(tài)  0暫停呼叫,1開(kāi)始呼叫
  551.                                                         //語(yǔ)音數(shù)據(jù)轉(zhuǎn)換
  552.                                                         sound_dat_cov(3,NO3_number,sound_buf3);  //窗口號(hào),窗口數(shù)值 播放緩存
  553.                                                 }
  554.                                                 break;
  555.                         }
  556.                         uart_R_flag=0;      //串口數(shù)據(jù)接收完畢標(biāo)志
  557.                 }
  558.                 if(uart_T_flag==1)  //串口數(shù)據(jù)發(fā)送標(biāo)志
  559.                 {
  560.                         send_buf[0]=0xa5;  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 指令(0x01取號(hào)) 0x5a(結(jié)束位)
  561.                         send_buf[2]=0x01;  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 指令(0x01取號(hào)) 0x5a(結(jié)束位)
  562.                         send_buf[3]=0x5a;
  563.                         send_uart_dat(send_buf[0]); //發(fā)送數(shù)據(jù)
  564.                         send_uart_dat(send_buf[1]); //發(fā)送數(shù)據(jù)  
  565.                         send_uart_dat(send_buf[2]); //發(fā)送數(shù)據(jù)
  566.                         send_uart_dat(send_buf[3]); //發(fā)送數(shù)據(jù)
  567.                         uart_T_flag=0;  //串口數(shù)據(jù)發(fā)送標(biāo)志
  568.                 }
  569.                 //語(yǔ)音播報(bào)
  570.                 play_data(); //語(yǔ)音播報(bào)數(shù)據(jù)
  571.         }
  572. }


  573. /*************************************************************************
  574. *工程名稱: 排隊(duì)叫號(hào)系統(tǒng)----取號(hào)模塊程序                             *
  575. *單片機(jī)型號(hào):STC89C52RC                                                  *
  576. *晶振頻率:11.0592MHz                                                                                                        *
  577. *功能描述:按下取號(hào)鍵,開(kāi)始取號(hào)                                          *
  578. *作者:新興光電                                                          *
  579. *日期:2016-03-01                                                        *
  580. *************************************************************************/
  581. #include<reg51.h>
  582. #include <intrins.h>
  583. #include "LCD1602.h"

  584. #define uchar unsigned char
  585. #define uint unsigned int
  586. #define FOSC 11059200L      //系統(tǒng)晶振頻率
  587. #define BAUD 9600           //串口波特率
  588. #define SMOD 1              //為1,加倍波特率計(jì)算
  589. #if SMOD
  590.         #define TC_VAL (256-FOSC/16/12/BAUD)
  591. //#else   #define TC_VAL (256-FOSC/32/12/BAUD)
  592. #endif
  593. /**********端口定義********************************/
  594. sbit get_key=P2^0;  //取號(hào)鍵
  595. sbit clear_key=P2^1; //清0鍵
  596. /**************************************************/
  597. /***********寄存器定義*****************************/
  598. uchar dis_buf[4];
  599. //以下為串口用到的寄存器
  600. bit uart_R_flag=0;   //串口接收完畢標(biāo)志
  601. bit busy=0;               //串口忙檢測(cè)
  602. uchar receive[4];         //數(shù)據(jù)接收格式  0xa5(起始位) 機(jī)器號(hào)(1~3) 指令(0x01取號(hào)) 0x5a(結(jié)束位)
  603. uchar send_buf[4];  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 呼叫號(hào)碼(1~255) 0x5a(結(jié)束位)
  604. uchar rec_cnt=0;
  605. //呼叫取號(hào)相關(guān)寄存器
  606. uchar get_cnt=0;   //取號(hào)計(jì)數(shù)
  607. uchar call_cnt=0;  //呼叫計(jì)數(shù)
  608. /**************************************************/
  609. /***************延時(shí)程序***************************/
  610. void Delay1ms(uint t)    //1ms延時(shí)程序
  611. {
  612.         uchar j;
  613.         while(t--)
  614.         {
  615.                 for(j=0;j<125;j++)
  616.                 { ; }
  617.         }
  618. }
  619. /**************************************************/
  620. /**********轉(zhuǎn)換顯示*********************************/
  621. void cov_dis(uchar dis_dat)
  622. {
  623.         dis_buf[0]=dis_dat/100+0x30;
  624.         dis_buf[1]=dis_dat%100/10+0x30;
  625.         dis_buf[2]=dis_dat%100%10+0x30;
  626.         dis_buf[3]='\0';
  627. }
  628. /***************************************************/
  629. /*************串口初始化程序***********************/
  630. void serial_init(void)
  631. {
  632.         TMOD=0x21;                                  //定時(shí)器1設(shè)為8位自動(dòng)重裝
  633.         SCON=0x50;            //8位數(shù)據(jù)串口,波特率可變  無(wú)校驗(yàn)位
  634.         TH1=TC_VAL;        //定時(shí)初始值
  635.         TL1=TH1;
  636.         PCON=0x80;
  637.         ES = 1;                 //串口中斷充許
  638.         EA = 1;                 //總中斷允許
  639.         TR1=1;
  640. }
  641. /**************************************************/
  642. /***********串口中斷服務(wù)程序*********************/
  643. void serial() interrupt 4
  644. {
  645.     if (RI)
  646.     {
  647.         RI = 0;            //串口接收中斷完畢標(biāo)志清0
  648.             //uart_buf=SBUF;   //接收數(shù)據(jù)
  649.         //        call_cnt=SBUF;      //接收數(shù)據(jù)  獲得叫號(hào)數(shù)
  650.                 receive[rec_cnt]=SBUF;   //接收數(shù)據(jù)
  651.                 rec_cnt++;
  652.                 if(receive[0]==0xa5) //判斷起始位
  653.                 {
  654.                         if(receive[rec_cnt-1]==0x5a&&rec_cnt==4)  //數(shù)據(jù)接收完畢
  655.                         {
  656.                                 uart_R_flag=1;   //串口接收完畢標(biāo)志
  657.                             send_buf[1]=receive[1]; //獲取機(jī)器號(hào)
  658.                         }
  659.                 }
  660.                 else rec_cnt=0;
  661.                 if(rec_cnt>=4)
  662.                         rec_cnt=0;
  663.     }
  664.     if (TI)
  665.     {
  666.         TI = 0;             //串口發(fā)送中斷完畢標(biāo)志清0
  667.         busy = 0;           //串口忙標(biāo)志清0
  668.     }
  669. }
  670. /***************************************************/
  671. /*************串口發(fā)送一字節(jié)數(shù)據(jù)程序****************/
  672. void send_uart_dat(uchar dat)
  673. {
  674.     while (busy);           //忙檢測(cè)標(biāo)志 等后上一字節(jié)數(shù)據(jù)發(fā)送完畢
  675.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  676.     busy = 1;
  677.     SBUF = ACC;             //發(fā)送數(shù)據(jù)至串口發(fā)送緩沖寄存器
  678. }
  679. /***************************************************/
  680. /*************串口發(fā)送字符串?dāng)?shù)據(jù)程序****************
  681. void send_uart_stringdat(uchar *s)
  682. {
  683.     while (*s)              //檢查數(shù)據(jù)是否結(jié)束
  684.     {
  685.         send_uart_dat(*s++);     //發(fā)送字符串
  686.     }
  687. }
  688. /***************************************************/
  689. /********串口發(fā)送字符串?dāng)?shù)據(jù)程序*********************
  690. void send_uart_stringdat(uchar *send_dat)
  691. {
  692.     do              
  693.     {            
  694.         send_uart_dat(*send_dat);     //發(fā)送字符
  695.                 send_dat++;
  696.     }while(*send_dat!='\0');     //檢查數(shù)據(jù)是否結(jié)束   
  697. }
  698. /***************************************************/
  699. /**************主程序*******************************/
  700. void main(void)
  701. {
  702.     serial_init();  //串口初始化程序
  703.         LCD1602_init(); //LCD1602初始化程序
  704.         GotoXY(0,0);
  705.         Print("  number:       "); //顯示英文”排號(hào)系統(tǒng)“
  706.         GotoXY(0,1);
  707.         Print("  Waiting:      ");
  708.         get_cnt=0; //號(hào)碼計(jì)數(shù)
  709.         call_cnt=0;        //排隊(duì)號(hào)
  710.         while(1)
  711.         {
  712.                 if(get_key==0)         //取號(hào)鍵
  713.                 {
  714.                     Delay1ms(100);
  715.                         if(get_key==0)
  716.                         {
  717.                                 if(get_cnt<255)
  718.                                 {
  719.                                         get_cnt++;   //取號(hào)計(jì)數(shù)
  720.                                 }
  721.                                 else
  722.                                 {
  723.                                         get_cnt=255;
  724.                                 }
  725.                         }
  726.                 }
  727.                 if(clear_key==0) //清0鍵
  728.                 {
  729.                         Delay1ms(100);
  730.                         if(clear_key==0)
  731.                         {
  732.                                 get_cnt=0;
  733.                                 call_cnt=0;
  734.                                 while(!clear_key); //等待按鍵釋放
  735.                         }
  736.                 }
  737.                 if(uart_R_flag==1)   //串口接收完畢標(biāo)志
  738.                 {
  739.                         if(receive[2]==0x01)  //取號(hào)指令
  740.                         {
  741.                             send_buf[0]=0xa5;  //發(fā)送緩存  格式 0xa5(起始位) 機(jī)器號(hào)(1~3) 呼叫號(hào)碼(1~255) 0x5a(結(jié)束位)
  742.                                 send_buf[3]=0x5a;  
  743.                                 call_cnt++;
  744.                                 if(get_cnt!=0)
  745.                                 {
  746.                                         if(call_cnt<=get_cnt)
  747.                                                 send_buf[2]=call_cnt;  //排隊(duì)號(hào)         有人等候
  748.                                         else
  749.                                         {
  750.                                             call_cnt=call_cnt-1;
  751.                                             send_buf[2]=0;  //排隊(duì)號(hào)   無(wú)人等候,
  752.                                         }
  753.                                 }
  754.                                 else
  755.                                 {
  756.                                         send_buf[2]=0;
  757.                                         call_cnt=0;
  758.                                 }

  759.                                 send_uart_dat(send_buf[0]); //發(fā)送數(shù)據(jù)
  760.                                 send_uart_dat(send_buf[1]); //發(fā)送數(shù)據(jù)  
  761.                                 send_uart_dat(send_buf[2]); //發(fā)送數(shù)據(jù)
  762.                                 send_uart_dat(send_buf[3]); //發(fā)送數(shù)據(jù)
  763.                         }
  764.                         uart_R_flag=0;
  765.                 }
  766.                         cov_dis(get_cnt);
  767.                         LCD1602_Print(10,0,dis_buf);   //顯示取號(hào)數(shù)
  768.                         if(get_cnt!=call_cnt)
  769.                         {
  770.                                 cov_dis(get_cnt-call_cnt);
  771.                                 LCD1602_Print(11,1,dis_buf);   //顯示等候人數(shù)
  772.                         }
  773.                         else LCD1602_Print(11,1,"000");   //顯示等候人數(shù)
  774.                         
  775.                         
  776.         }
  777. }
  778. /***************************************************/
復(fù)制代碼



源程序.rar

427.69 KB, 下載次數(shù): 115, 下載積分: 黑幣 -5


作者: holtek    時(shí)間: 2018-10-19 09:55
學(xué)習(xí)了,謝謝
作者: 15237149770    時(shí)間: 2018-11-15 12:05
有文字備注,很不錯(cuò),謝謝
作者: 松鼠丿    時(shí)間: 2018-11-29 08:20
謝謝樓主分享,謝謝嘍
作者: louis619    時(shí)間: 2019-3-5 11:46
謝謝樓主分享,謝謝嘍
作者: meilidianzhi    時(shí)間: 2019-3-5 13:19
太牛了吧。!
作者: 快樂(lè)眼淚    時(shí)間: 2019-3-5 19:20
這個(gè)真不錯(cuò)!
作者: 黑白世界的默片    時(shí)間: 2019-6-19 20:15
你好,請(qǐng)問(wèn)有proteus的仿真圖嗎

作者: langerdory    時(shí)間: 2019-6-21 08:39
很有用吖吖
作者: 黑白世界的默片    時(shí)間: 2019-6-22 14:32
langerdory 發(fā)表于 2019-6-21 08:39
很有用吖吖

請(qǐng)問(wèn)你做過(guò)排隊(duì)叫號(hào)系統(tǒng)的設(shè)計(jì)嗎
作者: zlj20181110    時(shí)間: 2020-2-19 18:19
謝謝樓主分享,謝謝嘍
作者: faridzled    時(shí)間: 2020-2-22 09:05
thanks for sharing
作者: zzhsdzf    時(shí)間: 2020-5-27 11:39
太厲害啦




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1