找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4134|回复: 4
收起左侧

单片机排队叫号系统Proteus仿真程序 有取号键和叫号键以及重复叫号键 有注释

  [复制链接]
ID:623220 发表于 2019-10-13 12:52 | 显示全部楼层 |阅读模式
系统组成:STC89C52RC+Lcd1602+蜂鸣器+按键

具体介绍:

Lcd1602排队叫号系统,有取号显示窗和叫号显示窗。有取号键和叫号键以及重复叫号键。可以显示你前面有几人在等候。具体看图片上面。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.PNG

单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char //宏定义
  3. #define uint unsigned int  //宏定义
  4. #define ulong unsigned long
  5. sbit k0=P3^5;  //取号用的按键
  6. sbit k1=P2^4;  //呼叫患者的按键1
  7. sbit k2=P2^5;  //呼叫患者的按键2
  8. sbit k3=P2^6;  //呼叫患者的按键3
  9. sbit k4=P2^7;  //呼叫患者的按键4
  10. sbit buzzer=P2^2;  //蜂鸣器接口
  11. sbit rs1=P2^0;
  12. sbit en1=P2^1;
  13. sbit rs2=P3^0;
  14. sbit en2=P3^1;

  15. sbit p1=P3^2;
  16. sbit p2=P3^3;
  17. sbit p3=P3^6;
  18. sbit p4=P3^7;//重新呼叫按键

  19. uint num;//来访者所领取的号码
  20. uint num1;//控制人所呼叫的号码
  21. uint num2_1,num2_2,num2_3,num2_4;//为重新呼叫保留号码
  22. uchar windown;//诊室号
  23. uchar i,t0;
  24. uchar code table2[]="0123456789";

  25. uchar code table1_1[]="NO.0000 come to";
  26. uchar code table1_2[]="0.window,please!";//用于液晶1初始化显示
  27. uchar code table2_1[]="Now waiting:";
  28. uchar code table2_2[]="Your number:";//用于液晶2初始化显示


  29. void keyscan();//按键检测
  30. void write_order1(uchar order);//写指令函数         液晶1
  31. void write_dat1(uchar dat);//写数据函数         液晶1
  32. void init_lcd1();//液晶1初始化
  33. void write_add1(uchar address,uchar dat);//指定地址写入数据
  34. void display_lcd1(uint num,uchar );//液晶1显示
  35. void write_order2(uchar order);//写指令函数         液晶2
  36. void write_dat2(uchar dat);//写数据函数         液晶2
  37. void init_lcd2();//液晶2初始化
  38. void write_add2(uchar address,uchar dat);//指定地址写入数据
  39. void display_lcd2(uint num);//液晶2显示
  40. void delay(uchar z)  //延时函数
  41. {
  42.         uchar i,j;
  43.         for(i=z;i>0;i--)
  44.                 for(j=110;j>0;j--);
  45. }
  46. bi(ulong t)
  47. {
  48.         ulong c;
  49.         uint n;
  50.         for(c=0;c<t;c++)
  51.         {
  52.                 for(n=0;n<50;n++);        //延时
  53.                 buzzer=~buzzer;                    //取反输出到喇叭的信号
  54.         }
  55. }
  56. void init()//初始化
  57. {
  58.         t0=0;
  59.         windown=0;
  60.         num=0;
  61.         buzzer=1;
  62.         TMOD=0x01;
  63.         TH0=(65536-50000)/256;
  64.         TL0=(65536-50000)%256;
  65.         EA=1;
  66.         ET0=1;
  67.         TR0=0;//定时器0        
  68.         init_lcd2();
  69.         init_lcd1();               
  70. }

  71. void main()
  72. {
  73.         init();
  74.           while(1)
  75.           {
  76.                   keyscan();
  77.                 display_lcd2(num);
  78.           }
  79. }
  80. void keyscan()//按键检测
  81. {
  82.         if(k0==0)//患者叫号按键检测
  83.         {
  84.                 delay(10);//延时消抖
  85.                 if(k0==0)
  86.                         num++;//号码数加1
  87.                 while(!k0);
  88.                 delay(10);//延时消抖
  89.                 while(!k0);//按键松手检测
  90.         }
  91.         if(k1==0)//一号诊室呼叫
  92.         {
  93.                 delay(10);
  94.                 if(k1==0)
  95.                 {
  96.                         if(num1<num)
  97.                         {
  98.                                 windown=1;
  99.                                 num1++;
  100.                                 TR0=1;
  101.                                 num2_1=num1;
  102.                                 display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
  103.                         }        
  104.                 }
  105.                 while(!k1);
  106.                 delay(10);//延时消抖
  107.                 while(!k1);//按键松手检测
  108.         }
  109.         if(k2==0)//二号诊室呼叫
  110.         {
  111.                 delay(10);
  112.                 if(k2==0)
  113.                 {
  114.                         if(num1<num)
  115.                         {
  116.                                 windown=2;
  117.                                 num1++;
  118.                                 TR0=1;
  119.                                 num2_2=num1;
  120.                                 display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
  121.                         }        
  122.                 }
  123.                 while(!k2);
  124.                 delay(10);//延时消抖
  125.                 while(!k2);//按键松手检测
  126.         }
  127.         if(k3==0)//三号诊室呼叫
  128.         {
  129.                 delay(10);
  130.                 if(k3==0)
  131.                 {
  132.                         if(num1<num)
  133.                         {
  134.                                 windown=3;
  135.                                 num1++;
  136.                                 TR0=1;
  137.                                 num2_3=num1;
  138.                                 display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
  139.                         }        
  140.                 }
  141.                 while(!k3);
  142.                 delay(10);//延时消抖
  143.                 while(!k3);//按键松手检测
  144.         }
  145.         if(k4==0)//四号诊室呼叫
  146.         {
  147.                 delay(10);
  148.                 if(k4==0)
  149.                 {
  150.                         if(num1<num)
  151.                         {
  152.                                 windown=4;
  153.                                 num1++;
  154.                                 TR0=1;
  155.                                 num2_4=num1;
  156.                                 display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
  157.                         }        
  158.                 }
  159.                 while(!k4);
  160.                 delay(10);//延时消抖
  161.                 while(!k4);//按键松手检测
  162.         }
  163.         if(p1==0)//一号诊室重新呼叫
  164.         {
  165.                 delay(10);
  166.                 if(p1==0)
  167.                 {
  168.                         TR0=1;
  169.                         display_lcd1(num2_1,1);                        
  170.                 }
  171.                 while(!p1);
  172.                 delay(10);//延时消抖
  173.                 while(!p1);//按键松手检测
  174.         }
  175.         if(p2==0)//二号诊室重新呼叫
  176.         {
  177.                 delay(10);
  178.                 if(p2==0)
  179.                 {
  180.                         TR0=1;
  181.                         display_lcd1(num2_2,2);                        
  182.                 }
  183.                 while(!p2);
  184.                 delay(10);//延时消抖
  185.                 while(!p2);//按键松手检测
  186.         }
  187.         if(p3==0)//三号诊室重新呼叫
  188.         {
  189.                 delay(10);
  190.                 if(p3==0)
  191.                 {
  192.                         TR0=1;
  193.                         display_lcd1(num2_3,3);                        
  194.                 }
  195.                 while(!p3);
  196.                 delay(10);//延时消抖
  197.                 while(!p3);//按键松手检测
  198.         }
  199.         if(p4==0)//四号诊室重新呼叫
  200.         {
  201.                 delay(10);
  202.                 if(p4==0)
  203.                 {
  204.                         TR0=1;
  205.                         display_lcd1(num2_4,4);                        
  206.                 }
  207.                 while(!p4);
  208.                 delay(10);//延时消抖
  209.                 while(!p4);//按键松手检测
  210.         }                                       
  211. }

  212. void write_order1(uchar order)//写指令函数         液晶1
  213. {
  214.         rs1=0;
  215.         en1=0;
  216.         P0=order;
  217.         delay(1);
  218.         en1=1;
  219.         delay(1);
  220.         en1=0;        
  221. }
  222. void write_dat1(uchar dat)//写数据函数         液晶1
  223. {
  224.         rs1=1;
  225.         en1=0;
  226.         P0=dat;
  227.         delay(1);
  228.         en1=1;
  229.         delay(1);
  230.         en1=0;        
  231. }

  232. void init_lcd1()//液晶1初始化
  233. {
  234.         write_order1(0x38);
  235.         write_order1(0x0c);
  236.         write_order1(0x06);
  237.         write_order1(0x80+1);
  238. //        write_order1(0x01);//液晶必备的一些初始化
  239.         for(i=0;i<16;i++)
  240.                 write_dat1(table1_1[i]);
  241.         write_order1(0x80+0x40); //液晶显示换行
  242.         for(i=0;i<16;i++)
  243.                 write_dat1(table1_2[i]);        
  244. }

  245. void write_add1(uchar address,uchar dat)//指定地址写入数据
  246. {
  247.         write_order1(0x80+address);
  248.         write_dat1(dat);
  249. }

  250. void display_lcd1(uint num1,uchar windown)//液晶1显示
  251. {
  252.         uchar a,b,c,d;//用于液晶
  253.         a=num1/1000;
  254.         b=num1%1000/100;
  255.         c=num1%1000%100/10;
  256.         d=num1%10;
  257.         write_add1(4,table2[a]);
  258.         write_add1(5,table2[b]);
  259.         write_add1(6,table2[c]);
  260.         write_add1(7,table2[d]);
  261.         write_add1(0x40,table2[windown]);               
  262. }
  263. void write_order2(uchar order)//写指令函数         液晶2
  264. {
  265.         rs2=0;
  266.         en2=0;
  267.         P1=order;
  268.         delay(1);
  269.         en2=1;
  270.         delay(1);
  271.         en2=0;        
  272. }
  273. void write_dat2(uchar dat)//写数据函数         液晶2
  274. {
  275.         rs2=1;
  276.         en2=0;
  277.         P1=dat;
  278.         delay(1);
  279.         en2=1;
  280.         delay(1);
  281.         en2=0;        
  282. }

  283. void init_lcd2()//液晶2初始化
  284. {
  285.         write_order2(0x38);
  286.         write_order2(0x0c);
  287.         write_order2(0x06);
  288.         write_order2(0x80);
  289.         write_order2(0x00);
  290.         for(i=0;i<12;i++)
  291.                 write_dat2(table2_2[i]);
  292.         write_order2(0x80+0x40); //液晶显示换行
  293.         for(i=0;i<12;i++)
  294.                 write_dat2(table2_1[i]);        
  295. }

  296. void write_add2(uchar address,uchar dat)//指定地址写入数据
  297. {
  298.         write_order2(0x80+address);
  299.         write_dat2(dat);
  300. }
  301. void write_add3(uchar address,uchar dat)//指定地址写入数据
  302. {
  303.         write_order2(0x80+0x40+address);
  304.         write_dat2(dat);
  305. }
  306. void display_lcd2(uint num)//液晶2显示
  307. {
  308.         uchar a,b,c,d;//用于液晶
  309.         uchar e,f,g,h;//显示等待人数
  310.         a=num/1000;
  311.         b=num%1000/100;
  312.         c=num%1000%100/10;
  313.         d=num%10;
  314.         write_add2(12,table2[a]);
  315.         write_add2(13,table2[b]);
  316.         write_add2(14,table2[c]);
  317.         write_add2(15,table2[d]);
  318.         if(num!=num1)        //显示前面等待的人数
  319.         {
  320.                 e=(num-num1-1)/1000;
  321.                 f=(num-num1-1)%1000/100;
  322.                 g=(num-num1-1)%1000%100/10;
  323.                 h=(num-num1-1)%10;
  324.         }
  325.         else
  326.         {
  327.                 e=(num-num1)/1000;
  328.                 f=(num-num1)%1000/100;
  329.                 g=(num-num1)%1000%100/10;
  330.                 h=(num-num1)%10;        
  331.         }
  332.         write_add3(12,table2[e]);
  333.         write_add3(13,table2[f]);
  334.         write_add3(14,table2[g]);
  335.         write_add3(15,table2[h]);        
  336. }

  337. void timer0() interrupt 1
  338. {
  339.         TH0=(65536-50000)/256;
  340.         TL0=(65536-50000)%256;
  341.         t0++;
  342.         bi(100);
  343.         if(t0>20)
  344.         {
  345.                 TR0=0;
  346.                 t0=0;
  347.                 buzzer=1;
  348.         }        
  349. }
复制代码

所有资料51hei提供下载:
Lcd1602排队叫号系统 取号排队机 仿真C.7z (28.4 KB, 下载次数: 190)

评分

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

查看全部评分

回复

使用道具 举报

ID:713210 发表于 2020-3-22 09:10 | 显示全部楼层
很实用
回复

使用道具 举报

ID:714130 发表于 2020-3-23 17:58 | 显示全部楼层
很强,值得学习
回复

使用道具 举报

ID:702359 发表于 2020-3-24 13:46 | 显示全部楼层
打算试试,感谢楼主分享
回复

使用道具 举报

ID:992563 发表于 2021-12-15 09:17 | 显示全部楼层
楼主有文档吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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