久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8385|回復: 12
打印 上一主題 下一主題
收起左側

一個簡單的基于STC89C52單片機的排隊叫號系統設計

  [復制鏈接]
跳轉到指定樓層
樓主
ID:284943 發表于 2018-6-29 13:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這個是我同學搞的設計,他是網上買的程序,本質上就是個基于STC89C52的排隊叫號,組成的東西也簡單,2個STC,2個1602,蜂鳴器,一堆獨立按鍵,還有個WT588D語言芯片和喇叭,通信用的是有線的串口。具體實現的功能我會發個視頻鏈接。發出來也是為需要的人省點錢。具體的電氣連接參考keil程序的引腳定義就可以了,語言芯片要導入的源文件也在壓縮包里面。總體來講這個設計沒什么復雜的東西,正常的設計是不需要語音播報的。如果覺得獨立按鍵較多也可以自己改成矩陣鍵盤,反正這東西焊獨立按鍵也是要花點時間的。

視頻的連接如下
https://pan.baidu.com/s/1vc_4T3Y6zcxwFNuki_eOEA
單片機源碼:
  1. /*************************************************************************
  2. *工程名稱: 排隊叫號系統----叫號模塊程序                             *
  3. *單片機型號: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      //系統晶振頻率
  14. #define BAUD 9600           //串口波特率
  15. #define SMOD 1              //為1,加倍波特率計算
  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;  //重復呼叫鍵
  23. sbit mute_key1=P1^2;        //消音鍵
  24. sbit stop_key1=P1^3;        //暫停鍵

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

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

  33. sbit beep=P3^6;   //蜂鳴器
  34. //語音相關
  35. sbit RST=P2^4;                        //復位腳  在非工業場合下這個可以不要
  36. sbit busy=P2^3;         //WT588D忙檢測端口                無播放時輸出高電平
  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. //以上為共陰數碼管段碼表 0    1    2    3    4    5    6    7    8   9     -   無
  45. uchar dis_buf[9];  //顯示緩存
  46. uchar dis_cnt;     //顯示計數  */
  47. //以下為串口用到的寄存器
  48. bit uart_busy;               //串口忙檢測
  49. bit uart_R_flag=0;      //串口數據接收完畢標志
  50. bit uart_T_flag=0;  //串口數據發送標志
  51. //uchar uart_buf;       //串口數據寄存器         
  52. //uchar count;        
  53. uchar receive[4];         //數據接收格式  0xa5(起始位) 機器號(1~3) 呼叫號碼(0x01取號) 0x5a(結束位)
  54. uchar send_buf[4];  //發送緩存  格式 0xa5(起始位) 機器號(1~3) 指令(0x01取號) 0x5a(結束位)
  55. uchar rec_cnt=0;
  56. //呼叫相關寄存器
  57. //uchar get_cnt=0;   //取號計數
  58. //uchar call_cnt=0;  //呼叫計數
  59. bit NO1_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  60. bit NO2_sta=0; //二號窗狀態
  61. bit NO3_sta=0; //三號窗狀態
  62. uchar NO1_number; //窗口一號碼
  63. uchar NO2_number; //窗口二號碼
  64. uchar NO3_number; //窗口三號碼

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

  83. bit play_flag=0;      //播放標志
  84. uchar play_part_sta=0; //0為一號窗口,1為二號窗口,3為三號窗口
  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. /***************延時程序***************************/
  92. void Delay1ms(uint t)    //1ms延時程序
  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位數據串口,波特率可變  無校驗位
  107.         TMOD=0x21;                                  //定時器1設為8位自動重裝
  108.         TH1=TC_VAL;        //定時初始值
  109.         TL1=TH1;
  110.         ES = 1;                 //串口中斷允許
  111.         EA = 1;                 //總中斷允許
  112.         TR1=1;
  113. }
  114. /**************************************************/
  115.   /***********串口中斷服務程序*********************/
  116. void serial() interrupt 4
  117. {
  118.     if (RI)
  119.     {
  120.         RI = 0;            //串口接收中斷完畢標志清0
  121.             //uart_buf=SBUF;   //接收數據
  122.         //        call_cnt=SBUF;      //接收數據  獲得叫號數
  123.                 receive[rec_cnt]=SBUF;   //接收數據
  124.                 rec_cnt++;
  125.                 if(receive[0]==0xa5) //判斷起始位
  126.                 {
  127.                         if(receive[rec_cnt-1]==0x5a&&rec_cnt==4)  //數據接收完畢
  128.                         {
  129.                                 uart_R_flag=1;   //串口接收完畢標志
  130.                         }
  131.                 }
  132.                 else rec_cnt=0;
  133.                 if(rec_cnt>=4)
  134.                         rec_cnt=0;
  135.     }
  136.     if (TI)
  137.     {
  138.         TI = 0;             //串口發送中斷完畢標志清0
  139.         uart_busy = 0;           //串口忙標志清0
  140.     }
  141. }
  142. /***************************************************/
  143. /*************串口發送一字節數據程序****************/
  144. void send_uart_dat(uchar dat)
  145. {
  146.     while (uart_busy);           //忙檢測標志 等后上一字節數據發送完畢
  147.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  148.     uart_busy = 1;
  149.     SBUF = ACC;             //發送數據至串口發送緩沖寄存器
  150. }
  151. /***************************************************/
  152. /*************串口發送字符串數據程序****************
  153. void send_uart_stringdat(uchar *s)
  154. {
  155.     while (*s)              //檢查數據是否結束
  156.     {
  157.         send_uart_dat(*s++);     //發送字符串
  158.     }
  159. }
  160. /***************************************************/
  161. /********串口發送字符串數據程序*********************
  162. void send_uart_stringdat(uchar *send_dat)
  163. {
  164.     do              
  165.     {            
  166.         send_uart_dat(*send_dat);     //發送字符
  167.                 send_dat++;
  168.     }while(*send_dat!='\0');     //檢查數據是否結束   
  169. }
  170. /***************************************************/
  171. /********數據轉換用于顯示***************************
  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. /*********定時器0中斷服務程序***********************/
  188. void timer0(void) interrupt 1
  189. {

  190.         TL0 = 0x00;                //設置定時初值         20ms  11.0592MHz
  191.         TH0 = 0xB8;                //設置定時初值
  192. /*        P2=0xff;  
  193.         DIG1=1;
  194.         Dport=0x00;
  195.     dis_cnt++;  //顯示計數
  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)  //蜂鳴標志
  210.         {
  211.                 beep_cnt++;          //蜂鳴計數
  212.                 if(beep_cnt>=25)  //500ms計時
  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; //關蜂鳴器
  228.         }
  229. }
  230. /**********************************************************/
  231. /**********顯示3位數據**************************/
  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. ;功    能:實現三線單字節低位在前串口通信函數適用于WT588D
  249. ;入    參:無
  250. ;出    參:0            返回主函數
  251. ;-------------------------------------*/
  252. /*************三線串口通信程序***********************/
  253.         Send_threelines(unsigned char addr) //三線發碼子程序
  254.         {
  255.                 unsigned char i;
  256.                 RST=0;
  257.                 Delay1ms(5);
  258.                 RST=1;
  259.                 Delay1ms(20); /* 復位拉高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. /***********語音數據轉換****************************/
  277. sound_dat_cov(uchar num,uchar dat,uchar *buf)  //窗口號,窗口數值 播放緩存
  278. {
  279.     uchar n=0;
  280.     *(buf+n)=10; //播放'請'
  281.         n++;
  282.         *(buf+n)=dat/100; //播放數值
  283.         n++;
  284.         *(buf+n)=dat%100/10; //播放數值
  285.         n++;
  286.         *(buf+n)=dat%10; //播放數值
  287.         n++;
  288.     *(buf+n)=11; //播放'號到'
  289.         n++;
  290.     *(buf+n)=num; //播放數值
  291.         n++;
  292.     *(buf+n)=12; //播放'號窗口'
  293. }
  294. /***************************************************/
  295. /***********語音播報數據****************************/
  296. void play_data(void)           
  297. {
  298.         if(busy) //不播放時為1,播放時為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)  //蜂鳴標志
  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]);        //播放語音
  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]);        //播放語音
  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]);        //播放語音
  339.                                                                 play_cnt++;
  340.                                                         }
  341.                                                         else
  342.                                                                 play_cnt=7;
  343.                                                         break;
  344.                                 }
  345.                         }
  346.                 }
  347.                 else         //一段語音播放完畢
  348.                 {
  349.                         beep_end_flag=0;
  350.                         //播放切換
  351.                     play_part_sta++; //0為一號窗口,1為二號窗口,3為三號窗口
  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.         //一號窗
  387.         if(call_key1==0)        //呼叫鍵
  388.         {
  389.                 Delay1ms(80);
  390.                 if(call_key1==0)
  391.                 {
  392.                         send_buf[1]=1;  //發送緩存  格式 0xa5(起始位) 機器號(1~3) 呼叫號碼(1~255) 0x5a(結束位)
  393.                         uart_T_flag=1;  //串口數據發送標志
  394.                         while(!call_key1); //等待按鍵釋放
  395.                 }  
  396.         }
  397.         else if(recall_key1==0)  //重復呼叫鍵
  398.         {
  399.                 Delay1ms(100);
  400.             if(recall_key1==0)
  401.                 {
  402.                     if(NO1_number!=0)
  403.                         NO1_sta=1;  //一號窗狀態  0暫停呼叫,1開始呼叫
  404.                 }
  405.         }
  406.         else if(mute_key1==0)        //消音鍵
  407.         {
  408.                 Delay1ms(100);
  409.                 if(mute_key1==0)
  410.                 {
  411.                     NO1_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  412.                 }
  413.         }
  414.         else if(stop_key1==0)        //暫停鍵
  415.         {
  416.             Delay1ms(100);
  417.                 if(stop_key1==0)
  418.                 {
  419.                         NO1_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  420.                         NO1_number=0;
  421.                     LCD1602_Print(0,1,"---");
  422.                 }
  423.         }
  424.         //二號窗
  425.         if(call_key2==0)        //呼叫鍵
  426.         {
  427.                 Delay1ms(80);
  428.                 if(call_key2==0)
  429.                 {
  430.                         send_buf[1]=2;  //發送緩存  格式 0xa5(起始位) 機器號(1~3) 呼叫號碼(1~255) 0x5a(結束位)
  431.                         uart_T_flag=1;  //串口數據發送標志
  432.                         while(!call_key2); //等待按鍵釋放
  433.                 }  
  434.         }
  435.         else if(recall_key2==0)  //重復呼叫鍵
  436.         {
  437.                 Delay1ms(100);
  438.             if(recall_key2==0)
  439.                 {
  440.                     if(NO2_number!=0)
  441.                         NO2_sta=1;  //一號窗狀態  0暫停呼叫,1開始呼叫
  442.                 }
  443.         }
  444.         else if(mute_key2==0)        //消音鍵
  445.         {
  446.                 Delay1ms(100);
  447.                 if(mute_key2==0)
  448.                 {
  449.                     NO2_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  450.                 }
  451.         }
  452.         else if(stop_key2==0)        //暫停鍵
  453.         {
  454.             Delay1ms(100);
  455.                 if(stop_key2==0)
  456.                 {
  457.                         NO2_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  458.                         NO2_number=0;
  459.                     LCD1602_Print(6,1,"---");
  460.                 }
  461.         }
  462.         //三號窗
  463.         if(call_key3==0)        //呼叫鍵
  464.         {
  465.                 Delay1ms(80);
  466.                 if(call_key3==0)
  467.                 {
  468.                         send_buf[1]=3;  //發送緩存  格式 0xa5(起始位) 機器號(1~3) 呼叫號碼(1~255) 0x5a(結束位)
  469.                         uart_T_flag=1;  //串口數據發送標志
  470.                         while(!call_key3); //等待按鍵釋放
  471.                 }  
  472.         }
  473.         else if(recall_key3==0)  //重復呼叫鍵
  474.         {
  475.                 Delay1ms(100);
  476.             if(recall_key3==0)
  477.                 {
  478.                     if(NO3_number!=0)
  479.                         NO3_sta=1;  //一號窗狀態  0暫停呼叫,1開始呼叫
  480.                 }
  481.         }
  482.         else if(mute_key3==0)        //消音鍵
  483.         {
  484.                 Delay1ms(100);
  485.                 if(mute_key3==0)
  486.                 {
  487.                     NO3_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  488.                 }
  489.         }
  490.         else if(stop_key3==0)        //暫停鍵
  491.         {
  492.             Delay1ms(100);
  493.                 if(stop_key3==0)
  494.                 {
  495.                         NO3_sta=0;  //一號窗狀態  0暫停呼叫,1開始呼叫
  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;      //設置定時器0為16位模式
  510.         TL0 = 0x00;                //設置定時初值         20ms  11.0592MHz
  511.         TH0 = 0xB8;                //設置定時初值
  512.         TR0=1;
  513.         ET0=1;
  514.         EA=1;

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

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


  573. /*************************************************************************
  574. *工程名稱: 排隊叫號系統----取號模塊程序                             *
  575. *單片機型號:STC89C52RC                                                  *
  576. *晶振頻率:11.0592MHz                                                                                                        *
  577. *功能描述:按下取號鍵,開始取號                                          *
  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      //系統晶振頻率
  587. #define BAUD 9600           //串口波特率
  588. #define SMOD 1              //為1,加倍波特率計算
  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;  //取號鍵
  595. sbit clear_key=P2^1; //清0鍵
  596. /**************************************************/
  597. /***********寄存器定義*****************************/
  598. uchar dis_buf[4];
  599. //以下為串口用到的寄存器
  600. bit uart_R_flag=0;   //串口接收完畢標志
  601. bit busy=0;               //串口忙檢測
  602. uchar receive[4];         //數據接收格式  0xa5(起始位) 機器號(1~3) 指令(0x01取號) 0x5a(結束位)
  603. uchar send_buf[4];  //發送緩存  格式 0xa5(起始位) 機器號(1~3) 呼叫號碼(1~255) 0x5a(結束位)
  604. uchar rec_cnt=0;
  605. //呼叫取號相關寄存器
  606. uchar get_cnt=0;   //取號計數
  607. uchar call_cnt=0;  //呼叫計數
  608. /**************************************************/
  609. /***************延時程序***************************/
  610. void Delay1ms(uint t)    //1ms延時程序
  611. {
  612.         uchar j;
  613.         while(t--)
  614.         {
  615.                 for(j=0;j<125;j++)
  616.                 { ; }
  617.         }
  618. }
  619. /**************************************************/
  620. /**********轉換顯示*********************************/
  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;                                  //定時器1設為8位自動重裝
  633.         SCON=0x50;            //8位數據串口,波特率可變  無校驗位
  634.         TH1=TC_VAL;        //定時初始值
  635.         TL1=TH1;
  636.         PCON=0x80;
  637.         ES = 1;                 //串口中斷充許
  638.         EA = 1;                 //總中斷允許
  639.         TR1=1;
  640. }
  641. /**************************************************/
  642. /***********串口中斷服務程序*********************/
  643. void serial() interrupt 4
  644. {
  645.     if (RI)
  646.     {
  647.         RI = 0;            //串口接收中斷完畢標志清0
  648.             //uart_buf=SBUF;   //接收數據
  649.         //        call_cnt=SBUF;      //接收數據  獲得叫號數
  650.                 receive[rec_cnt]=SBUF;   //接收數據
  651.                 rec_cnt++;
  652.                 if(receive[0]==0xa5) //判斷起始位
  653.                 {
  654.                         if(receive[rec_cnt-1]==0x5a&&rec_cnt==4)  //數據接收完畢
  655.                         {
  656.                                 uart_R_flag=1;   //串口接收完畢標志
  657.                             send_buf[1]=receive[1]; //獲取機器號
  658.                         }
  659.                 }
  660.                 else rec_cnt=0;
  661.                 if(rec_cnt>=4)
  662.                         rec_cnt=0;
  663.     }
  664.     if (TI)
  665.     {
  666.         TI = 0;             //串口發送中斷完畢標志清0
  667.         busy = 0;           //串口忙標志清0
  668.     }
  669. }
  670. /***************************************************/
  671. /*************串口發送一字節數據程序****************/
  672. void send_uart_dat(uchar dat)
  673. {
  674.     while (busy);           //忙檢測標志 等后上一字節數據發送完畢
  675.     ACC = dat;              //Calculate the even parity bit P (PSW.0)
  676.     busy = 1;
  677.     SBUF = ACC;             //發送數據至串口發送緩沖寄存器
  678. }
  679. /***************************************************/
  680. /*************串口發送字符串數據程序****************
  681. void send_uart_stringdat(uchar *s)
  682. {
  683.     while (*s)              //檢查數據是否結束
  684.     {
  685.         send_uart_dat(*s++);     //發送字符串
  686.     }
  687. }
  688. /***************************************************/
  689. /********串口發送字符串數據程序*********************
  690. void send_uart_stringdat(uchar *send_dat)
  691. {
  692.     do              
  693.     {            
  694.         send_uart_dat(*send_dat);     //發送字符
  695.                 send_dat++;
  696.     }while(*send_dat!='\0');     //檢查數據是否結束   
  697. }
  698. /***************************************************/
  699. /**************主程序*******************************/
  700. void main(void)
  701. {
  702.     serial_init();  //串口初始化程序
  703.         LCD1602_init(); //LCD1602初始化程序
  704.         GotoXY(0,0);
  705.         Print("  number:       "); //顯示英文”排號系統“
  706.         GotoXY(0,1);
  707.         Print("  Waiting:      ");
  708.         get_cnt=0; //號碼計數
  709.         call_cnt=0;        //排隊號
  710.         while(1)
  711.         {
  712.                 if(get_key==0)         //取號鍵
  713.                 {
  714.                     Delay1ms(100);
  715.                         if(get_key==0)
  716.                         {
  717.                                 if(get_cnt<255)
  718.                                 {
  719.                                         get_cnt++;   //取號計數
  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)   //串口接收完畢標志
  738.                 {
  739.                         if(receive[2]==0x01)  //取號指令
  740.                         {
  741.                             send_buf[0]=0xa5;  //發送緩存  格式 0xa5(起始位) 機器號(1~3) 呼叫號碼(1~255) 0x5a(結束位)
  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;  //排隊號         有人等候
  748.                                         else
  749.                                         {
  750.                                             call_cnt=call_cnt-1;
  751.                                             send_buf[2]=0;  //排隊號   無人等候,
  752.                                         }
  753.                                 }
  754.                                 else
  755.                                 {
  756.                                         send_buf[2]=0;
  757.                                         call_cnt=0;
  758.                                 }

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



源程序.rar

427.69 KB, 下載次數: 115, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏8 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:347892 發表于 2018-10-19 09:55 | 只看該作者
學習了,謝謝
回復

使用道具 舉報

板凳
ID:426970 發表于 2018-11-15 12:05 來自觸屏版 | 只看該作者
有文字備注,很不錯,謝謝
回復

使用道具 舉報

地板
ID:431034 發表于 2018-11-29 08:20 | 只看該作者
謝謝樓主分享,謝謝嘍
回復

使用道具 舉報

5#
ID:478351 發表于 2019-3-5 11:46 | 只看該作者
謝謝樓主分享,謝謝嘍
回復

使用道具 舉報

6#
ID:48413 發表于 2019-3-5 13:19 | 只看該作者
太牛了吧!!!
回復

使用道具 舉報

7#
ID:399179 發表于 2019-3-5 19:20 來自觸屏版 | 只看該作者
這個真不錯!
回復

使用道具 舉報

8#
ID:567110 發表于 2019-6-19 20:15 | 只看該作者
你好,請問有proteus的仿真圖嗎
回復

使用道具 舉報

9#
ID:564496 發表于 2019-6-21 08:39 | 只看該作者
很有用吖吖
回復

使用道具 舉報

10#
ID:567110 發表于 2019-6-22 14:32 | 只看該作者

請問你做過排隊叫號系統的設計嗎
回復

使用道具 舉報

11#
ID:423911 發表于 2020-2-19 18:19 | 只看該作者
謝謝樓主分享,謝謝嘍
回復

使用道具 舉報

12#
ID:89286 發表于 2020-2-22 09:05 | 只看該作者
thanks for sharing
回復

使用道具 舉報

13#
ID:248073 發表于 2020-5-27 11:39 | 只看該作者
太厲害啦
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91免费在线看 | 超碰av免费 | 久久精品视频播放 | 亚洲精色 | 国产视频一区二区 | 中文字幕日韩专区 | 午夜精品久久久久久久久久久久 | 91中文字幕在线 | 91色在线 | 久久99国产精一区二区三区 | 精品国产综合 | 欧美群妇大交群中文字幕 | 精品久久久久久久久久久院品网 | 日韩精品一区二区三区在线播放 | 久久日韩精品 | 99视频在线免费观看 | 久久国产免费 | 欧美一级片 | 久久久www成人免费精品张筱雨 | 国产成人精品福利 | 黄a免费网络| 久久久91精品国产一区二区三区 | 成年人黄色一级毛片 | 国产农村妇女精品一区 | 色综久久| a级免费观看视频 | 黄视频网站免费观看 | 欧美美女一区二区 | 国产精品久久久久久久久久久新郎 | 狠狠操狠狠操 | 亚洲美女在线视频 | 亚洲精品在线视频 | 亚洲精品乱码久久久久久按摩 | 色吊丝2288sds中文字幕 | 成人综合伊人 | 国产亚洲精品美女久久久久久久久久 | 欧美视频一区二区三区 | 特级特黄特色的免费大片 | 国产精品久久亚洲 | 91精品国产777在线观看 | 国产重口老太伦 |