系统组成:STC89C52RC+Lcd1602+蜂鸣器+按键
具体介绍:
Lcd1602排队叫号系统,有取号显示窗和叫号显示窗。有取号键和叫号键以及重复叫号键。可以显示你前面有几人在等候。具体看图片上面。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg52.h>
- #define uchar unsigned char //宏定义
- #define uint unsigned int //宏定义
- #define ulong unsigned long
- sbit k0=P3^5; //取号用的按键
- sbit k1=P2^4; //呼叫患者的按键1
- sbit k2=P2^5; //呼叫患者的按键2
- sbit k3=P2^6; //呼叫患者的按键3
- sbit k4=P2^7; //呼叫患者的按键4
- sbit buzzer=P2^2; //蜂鸣器接口
- sbit rs1=P2^0;
- sbit en1=P2^1;
- sbit rs2=P3^0;
- sbit en2=P3^1;
- sbit p1=P3^2;
- sbit p2=P3^3;
- sbit p3=P3^6;
- sbit p4=P3^7;//重新呼叫按键
- uint num;//来访者所领取的号码
- uint num1;//控制人所呼叫的号码
- uint num2_1,num2_2,num2_3,num2_4;//为重新呼叫保留号码
- uchar windown;//诊室号
- uchar i,t0;
- uchar code table2[]="0123456789";
- uchar code table1_1[]="NO.0000 come to";
- uchar code table1_2[]="0.window,please!";//用于液晶1初始化显示
- uchar code table2_1[]="Now waiting:";
- uchar code table2_2[]="Your number:";//用于液晶2初始化显示
- void keyscan();//按键检测
- void write_order1(uchar order);//写指令函数 液晶1
- void write_dat1(uchar dat);//写数据函数 液晶1
- void init_lcd1();//液晶1初始化
- void write_add1(uchar address,uchar dat);//指定地址写入数据
- void display_lcd1(uint num,uchar );//液晶1显示
- void write_order2(uchar order);//写指令函数 液晶2
- void write_dat2(uchar dat);//写数据函数 液晶2
- void init_lcd2();//液晶2初始化
- void write_add2(uchar address,uchar dat);//指定地址写入数据
- void display_lcd2(uint num);//液晶2显示
- void delay(uchar z) //延时函数
- {
- uchar i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- bi(ulong t)
- {
- ulong c;
- uint n;
- for(c=0;c<t;c++)
- {
- for(n=0;n<50;n++); //延时
- buzzer=~buzzer; //取反输出到喇叭的信号
- }
- }
- void init()//初始化
- {
- t0=0;
- windown=0;
- num=0;
- buzzer=1;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=0;//定时器0
- init_lcd2();
- init_lcd1();
- }
- void main()
- {
- init();
- while(1)
- {
- keyscan();
- display_lcd2(num);
- }
- }
- void keyscan()//按键检测
- {
- if(k0==0)//患者叫号按键检测
- {
- delay(10);//延时消抖
- if(k0==0)
- num++;//号码数加1
- while(!k0);
- delay(10);//延时消抖
- while(!k0);//按键松手检测
- }
- if(k1==0)//一号诊室呼叫
- {
- delay(10);
- if(k1==0)
- {
- if(num1<num)
- {
- windown=1;
- num1++;
- TR0=1;
- num2_1=num1;
- display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
- }
- }
- while(!k1);
- delay(10);//延时消抖
- while(!k1);//按键松手检测
- }
- if(k2==0)//二号诊室呼叫
- {
- delay(10);
- if(k2==0)
- {
- if(num1<num)
- {
- windown=2;
- num1++;
- TR0=1;
- num2_2=num1;
- display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
- }
- }
- while(!k2);
- delay(10);//延时消抖
- while(!k2);//按键松手检测
- }
- if(k3==0)//三号诊室呼叫
- {
- delay(10);
- if(k3==0)
- {
- if(num1<num)
- {
- windown=3;
- num1++;
- TR0=1;
- num2_3=num1;
- display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
- }
- }
- while(!k3);
- delay(10);//延时消抖
- while(!k3);//按键松手检测
- }
- if(k4==0)//四号诊室呼叫
- {
- delay(10);
- if(k4==0)
- {
- if(num1<num)
- {
- windown=4;
- num1++;
- TR0=1;
- num2_4=num1;
- display_lcd1(num1,windown);//液晶一显示当前呼叫的号码
- }
- }
- while(!k4);
- delay(10);//延时消抖
- while(!k4);//按键松手检测
- }
- if(p1==0)//一号诊室重新呼叫
- {
- delay(10);
- if(p1==0)
- {
- TR0=1;
- display_lcd1(num2_1,1);
- }
- while(!p1);
- delay(10);//延时消抖
- while(!p1);//按键松手检测
- }
- if(p2==0)//二号诊室重新呼叫
- {
- delay(10);
- if(p2==0)
- {
- TR0=1;
- display_lcd1(num2_2,2);
- }
- while(!p2);
- delay(10);//延时消抖
- while(!p2);//按键松手检测
- }
- if(p3==0)//三号诊室重新呼叫
- {
- delay(10);
- if(p3==0)
- {
- TR0=1;
- display_lcd1(num2_3,3);
- }
- while(!p3);
- delay(10);//延时消抖
- while(!p3);//按键松手检测
- }
- if(p4==0)//四号诊室重新呼叫
- {
- delay(10);
- if(p4==0)
- {
- TR0=1;
- display_lcd1(num2_4,4);
- }
- while(!p4);
- delay(10);//延时消抖
- while(!p4);//按键松手检测
- }
- }
- void write_order1(uchar order)//写指令函数 液晶1
- {
- rs1=0;
- en1=0;
- P0=order;
- delay(1);
- en1=1;
- delay(1);
- en1=0;
- }
- void write_dat1(uchar dat)//写数据函数 液晶1
- {
- rs1=1;
- en1=0;
- P0=dat;
- delay(1);
- en1=1;
- delay(1);
- en1=0;
- }
- void init_lcd1()//液晶1初始化
- {
- write_order1(0x38);
- write_order1(0x0c);
- write_order1(0x06);
- write_order1(0x80+1);
- // write_order1(0x01);//液晶必备的一些初始化
- for(i=0;i<16;i++)
- write_dat1(table1_1[i]);
- write_order1(0x80+0x40); //液晶显示换行
- for(i=0;i<16;i++)
- write_dat1(table1_2[i]);
- }
- void write_add1(uchar address,uchar dat)//指定地址写入数据
- {
- write_order1(0x80+address);
- write_dat1(dat);
- }
- void display_lcd1(uint num1,uchar windown)//液晶1显示
- {
- uchar a,b,c,d;//用于液晶
- a=num1/1000;
- b=num1%1000/100;
- c=num1%1000%100/10;
- d=num1%10;
- write_add1(4,table2[a]);
- write_add1(5,table2[b]);
- write_add1(6,table2[c]);
- write_add1(7,table2[d]);
- write_add1(0x40,table2[windown]);
- }
- void write_order2(uchar order)//写指令函数 液晶2
- {
- rs2=0;
- en2=0;
- P1=order;
- delay(1);
- en2=1;
- delay(1);
- en2=0;
- }
- void write_dat2(uchar dat)//写数据函数 液晶2
- {
- rs2=1;
- en2=0;
- P1=dat;
- delay(1);
- en2=1;
- delay(1);
- en2=0;
- }
- void init_lcd2()//液晶2初始化
- {
- write_order2(0x38);
- write_order2(0x0c);
- write_order2(0x06);
- write_order2(0x80);
- write_order2(0x00);
- for(i=0;i<12;i++)
- write_dat2(table2_2[i]);
- write_order2(0x80+0x40); //液晶显示换行
- for(i=0;i<12;i++)
- write_dat2(table2_1[i]);
- }
- void write_add2(uchar address,uchar dat)//指定地址写入数据
- {
- write_order2(0x80+address);
- write_dat2(dat);
- }
- void write_add3(uchar address,uchar dat)//指定地址写入数据
- {
- write_order2(0x80+0x40+address);
- write_dat2(dat);
- }
- void display_lcd2(uint num)//液晶2显示
- {
- uchar a,b,c,d;//用于液晶
- uchar e,f,g,h;//显示等待人数
- a=num/1000;
- b=num%1000/100;
- c=num%1000%100/10;
- d=num%10;
- write_add2(12,table2[a]);
- write_add2(13,table2[b]);
- write_add2(14,table2[c]);
- write_add2(15,table2[d]);
- if(num!=num1) //显示前面等待的人数
- {
- e=(num-num1-1)/1000;
- f=(num-num1-1)%1000/100;
- g=(num-num1-1)%1000%100/10;
- h=(num-num1-1)%10;
- }
- else
- {
- e=(num-num1)/1000;
- f=(num-num1)%1000/100;
- g=(num-num1)%1000%100/10;
- h=(num-num1)%10;
- }
- write_add3(12,table2[e]);
- write_add3(13,table2[f]);
- write_add3(14,table2[g]);
- write_add3(15,table2[h]);
- }
- void timer0() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- t0++;
- bi(100);
- if(t0>20)
- {
- TR0=0;
- t0=0;
- buzzer=1;
- }
- }
复制代码
所有资料51hei提供下载:
Lcd1602排队叫号系统 取号排队机 仿真C.7z
(28.4 KB, 下载次数: 204)
|