找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11381|回复: 17
收起左侧

基于51单片机的排队叫号系统仿真与程序源码设计

  [复制链接]
ID:312765 发表于 2018-4-20 23:08 | 显示全部楼层 |阅读模式
基于51单片机的排队叫号系统设计,电路和程序比较简单,附件是proteus仿真电路图和源程序,供初学者学习参考。
排队叫号系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
0.png 0.jpg

单片机源程序如下:
  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, 下载次数: 476)

评分

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

查看全部评分

回复

使用道具 举报

ID:331335 发表于 2018-5-16 15:35 | 显示全部楼层
不错,感谢分享
回复

使用道具 举报

ID:426970 发表于 2018-11-15 12:02 来自手机 | 显示全部楼层
还有汉字备注,很舒服,谢谢
回复

使用道具 举报

ID:444439 发表于 2018-12-11 21:07 | 显示全部楼层
学习了 感谢分享
回复

使用道具 举报

ID:444602 发表于 2018-12-12 09:21 | 显示全部楼层
感觉还不错啊
回复

使用道具 举报

ID:460754 发表于 2019-1-6 13:18 | 显示全部楼层
有原理图码
回复

使用道具 举报

ID:461451 发表于 2019-1-12 13:23 | 显示全部楼层
这个不会显示等待的人数,请问楼主有添加人数等待的资源吗?谢谢
回复

使用道具 举报

ID:182535 发表于 2019-2-28 11:23 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:507398 发表于 2019-4-9 18:26 | 显示全部楼层
我已下载你的文件,只是在复位电路山有些不明白,请指教一下
回复

使用道具 举报

ID:557590 发表于 2019-6-8 10:22 | 显示全部楼层
学习了 感谢分享,很好的东西呀
回复

使用道具 举报

ID:557590 发表于 2019-6-8 10:27 | 显示全部楼层
需要需要需要
回复

使用道具 举报

ID:528932 发表于 2019-6-15 13:39 | 显示全部楼层
东西不错,谢谢分享~
回复

使用道具 举报

ID:563863 发表于 2019-6-16 19:30 | 显示全部楼层
ck1655 发表于 2019-6-15 13:39
东西不错,谢谢分享~

叫号端有几个啊?
回复

使用道具 举报

ID:567110 发表于 2019-6-19 19:57 来自手机 | 显示全部楼层
BBOX 发表于 2019-1-12 13:23
这个不会显示等待的人数,请问楼主有添加人数等待的资源吗?谢谢

你好,请问你这个显示等待人数的做好了吗。我也在做这个,求助求助
回复

使用道具 举报

ID:576373 发表于 2019-7-3 17:19 来自手机 | 显示全部楼层
这个叫号和取号还是基于一个单片机的是吧
回复

使用道具 举报

ID:610923 发表于 2019-9-16 11:07 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:641005 发表于 2019-11-27 10:54 | 显示全部楼层
能问一下你的仿真图里面的25630901RP2,TC646B和TC648B应该放在哪啊
回复

使用道具 举报

ID:769233 发表于 2020-6-14 09:09 | 显示全部楼层
很有帮助,谢谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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