标题: 基于51单片机的排队叫号系统仿真与程序源码设计 [打印本页]

作者: oymartin    时间: 2018-4-20 23:08
标题: 基于51单片机的排队叫号系统仿真与程序源码设计
基于51单片机的排队叫号系统设计,电路和程序比较简单,附件是proteus仿真电路图和源程序,供初学者学习参考。
排队叫号系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)



单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P2^0;
  5. sbit rw=P2^1;
  6. sbit e=P2^2;
  7. sbit key1=P1^0;
  8. sbit key2=P1^1;
  9. sbit key3=P1^2;
  10. sbit sounder=P3^7;

  11. uchar prompt1[]="Your No.is 00!";   
  12. uchar prompt2[]="No.00 Go To Win.0";  
  13. uchar prompt3[]="Queue is full ";      
  14. uchar prompt4[]="Queue is empty !";  

  15. uint num_count=0;                  //排队叫的号码
  16. uint rank_number[20]={0};          //排队叫号存储的数组
  17. uint num=0;                        //窗口消的号码
  18. int RankFlag=0;                    //叫号的标志
  19. int ClearNumFlag=0;                //消号的标志
  20. uint LengthFlag=0;                 //队列长度 叫一次号时+1,消一次号时-1

  21. /*延时函数*/
  22. void delay(uint n)
  23. {
  24.    while (n--);
  25. }

  26. /*****************************************
  27. LCD1602 *显示屏命令写入函数*
  28. *****************************************/
  29. void LCD_write_com(uchar com)
  30. {  
  31.    e=0;
  32.    rs=0;
  33.    rw=0;
  34.    P0= com;
  35.    delay(1000);
  36.    e=1;
  37.    delay(1000);
  38.    e=0;
  39. }
  40. /*****************************************
  41. LCD1602 *显示屏数据写入函数*
  42. *****************************************/
  43. void LCD_write_data(uchar dat)
  44. {
  45.    e=0;
  46.    rs=1;
  47.    rw=0;
  48.    P0 = dat;
  49.    delay(1000);
  50.    e=1;
  51.    delay(1000);
  52.    e=0;
  53. }
  54. /*****************************************
  55. LCD1602 *显示屏清空显示*
  56. *****************************************/
  57. void LCD_clear(void)
  58. {
  59.    LCD_write_com(0x01);
  60.    delay(1000);
  61. }
  62. /*****************************************
  63. LCD1602 显示屏初始化函数
  64. *****************************************/
  65. void LCD_init(void)
  66. {
  67.   // LCD_write_com(0x38);    /*显示模式设置*/
  68.    //delay(100);
  69.   // LCD_write_com(0x38);
  70.   // delay(100);
  71.    LCD_write_com(0x38);
  72.    delay(100);
  73.    //LCD_write_com(0x38);  
  74.    LCD_write_com(0x08);    /*显示关闭*/
  75.    LCD_write_com(0x01);    /*显示清屏*/
  76.    LCD_write_com(0x06);    /*显示光标移动设置*/
  77.    delay(100);
  78.    LCD_write_com(0x0C);    /*显示开及光标设置*/
  79. }
  80. /*简单的蜂鸣器提示音*/
  81. void sound()
  82. { uint a;
  83. for(a=0;a<500;a++)
  84. {
  85.         delay(61);
  86.         sounder=~sounder;
  87. }
  88. }
  89. /*获取键值函数*/
  90. uint sweep_key()
  91. {  
  92.    uint jianzhi;                    
  93.    if(key1==0)
  94.         {        
  95.                 delay(1000);
  96.                 if(key1==0)
  97.                 jianzhi=1;
  98.                 RankFlag=1;
  99.         }
  100.         if(key2==0||key3==0)
  101.         {   
  102.                 delay(1000);
  103.                 if(key2==0)
  104.                 jianzhi=2;
  105.                 if(key3==0)
  106.                 jianzhi=3;
  107.                 ClearNumFlag=1;
  108.         }
  109.         return (jianzhi);
  110. }
  111. /*****************************************
  112. 叫号机 按一次一号键变量+1,最大为20                        
  113. *****************************************/
  114. void QueueNumProcess()
  115. {
  116.   
  117.    if(RankFlag==1)             //判断叫号标志是否有效
  118.    {
  119.       if ( LengthFlag<20)
  120.       {   
  121.                  num_count++;
  122.              rank_number[LengthFlag] = num_count;
  123.       }
  124.       LengthFlag++;
  125.    }
  126. }
  127. /*****************************************
  128. 窗口消号处理函数
  129. *****************************************/
  130. void ClearNumProcess()
  131. {
  132.    uint i;
  133.    if (ClearNumFlag==1)     //判断消号标志是否有效
  134.    {
  135.       num=rank_number[0];   //把消的号赋给全局变量num
  136.       for(i=0;i<19;i++)     //让数组整体左移一个存储单元,即把消得号删除
  137.       {
  138.              rank_number[i]=rank_number[i+1];
  139.       }
  140.       LengthFlag--;
  141.    }
  142. }
  143. /*****************************************
  144. 检测到按键后,检测函数处理及LCD显示处理
  145. *****************************************/
  146. void CheckButtonProcess(uint m)  //m代表检测到的键值
  147. {
  148.    uint jz,i;
  149.    jz=m;
  150.    if((jz==1) && (RankFlag==1))
  151.    {  
  152.            // 当队列人数达到20时,提示
  153.           // Queue is full
  154.           if( LengthFlag>=20 )               
  155.           {
  156.              LCD_clear();
  157.              LCD_write_com(0x80+0x02);
  158.          delay(100);
  159.          for(i=0;i<16;i++)
  160.          {
  161.             LCD_write_data(prompt3[i]);
  162.                 delay(100);
  163.          }
  164.           }
  165.           else
  166.           {
  167.              QueueNumProcess();
  168.                         
  169.              prompt1[11]=(num_count)/10+'0';
  170.              prompt1[12]=(num_count)%10+'0';
  171.          
  172.              LCD_clear();
  173.              LCD_write_com(0x80+02);
  174.          delay(100);
  175.          for(i=0;i<15;i++)
  176.          {
  177.             LCD_write_data(prompt1[i]);  //"Your No.is 00!";
  178.                 delay(100);
  179.          }
  180.          RankFlag=0;
  181.           }
  182.    }
  183.    
  184.    if((jz==2||jz==3) && ClearNumFlag==1)
  185.    {        
  186.           if(LengthFlag==0)
  187.           {
  188.              LCD_clear();
  189.              LCD_write_com(0x80+0);
  190.          delay(1000);
  191.          for(i=0;i<16;i++)
  192.          {
  193.             LCD_write_data(prompt4[i]);//"Queue is empty ";
  194.                 delay(100);
  195.          }
  196.                         delay(65535);                                //无人排队时屏幕自动清屏,计数归零
  197.                         LCD_clear();
  198.                         num_count=0;
  199.           }
  200.           else
  201.           {
  202.              ClearNumProcess();       //消号处理,营业员操作
  203.                     sound();
  204.              prompt2[3]=num/10+'0';
  205.              prompt2[4]=num%10+'0';
  206.                  prompt2[15]=(jz-1)+'0';
  207.              LCD_clear();
  208.              LCD_write_com(0x80+0);
  209.          delay(100);
  210.          for(i=0;i<16;i++)
  211.          {
  212.             LCD_write_data(prompt2[i]); //"No.00 come to No.0";
  213.             delay(100);
  214.          }
  215.              ClearNumFlag=0;
  216.           }
  217.    }  
  218. }
  219. /*****************************************
  220. main 函数
  221. *****************************************/
  222. void main()
  223. {
  224.    uint Kvalue;
  225.    LCD_init();
  226.    while(1)
  227.    {        
  228.       Kvalue=sweep_key();       //获取键值
  229.           if (RankFlag==1 || ClearNumFlag==1)//判断叫号标志和消号标志是否有效
  230.               CheckButtonProcess(Kvalue);
  231.           delay(200);
  232.           RankFlag=0;             //使叫号标志无效
  233.           ClearNumFlag=0;         //使消号标志无效
  234.           Kvalue=0;               //键值清0
  235. ……………………

  236. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
排队叫号系统只有Proteus7.5才能打开.7z (30.36 KB, 下载次数: 483)



作者: 小小白0329    时间: 2018-5-16 15:35
不错,感谢分享
作者: 15237149770    时间: 2018-11-15 12:02
还有汉字备注,很舒服,谢谢
作者: 小兴兴兴兴    时间: 2018-12-11 21:07
学习了 感谢分享
作者: 演绎那些年    时间: 2018-12-12 09:21
感觉还不错啊
作者: 569873492hh    时间: 2019-1-6 13:18
有原理图码

作者: BBOX    时间: 2019-1-12 13:23
这个不会显示等待的人数,请问楼主有添加人数等待的资源吗?谢谢
作者: vistayi    时间: 2019-2-28 11:23
学习学习
作者: 15947409248    时间: 2019-4-9 18:26
我已下载你的文件,只是在复位电路山有些不明白,请指教一下

作者: 咸菜咸菜    时间: 2019-6-8 10:22
学习了 感谢分享,很好的东西呀
作者: 咸菜咸菜    时间: 2019-6-8 10:27
需要需要需要
作者: ck1655    时间: 2019-6-15 13:39
东西不错,谢谢分享~
作者: 翩翩中少年    时间: 2019-6-16 19:30
ck1655 发表于 2019-6-15 13:39
东西不错,谢谢分享~

叫号端有几个啊?

作者: 黑白世界的默片    时间: 2019-6-19 19:57
BBOX 发表于 2019-1-12 13:23
这个不会显示等待的人数,请问楼主有添加人数等待的资源吗?谢谢

你好,请问你这个显示等待人数的做好了吗。我也在做这个,求助求助
作者: Sherlock521    时间: 2019-7-3 17:19
这个叫号和取号还是基于一个单片机的是吧
作者: a1026395095    时间: 2019-9-16 11:07
厉害了
作者: 想见到你    时间: 2019-11-27 10:54
能问一下你的仿真图里面的25630901RP2,TC646B和TC648B应该放在哪啊

作者: liujing0716    时间: 2020-6-14 09:09
很有帮助,谢谢分享




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1