系統(tǒng)組成:STC89C52RC+Lcd1602+蜂鳴器+按鍵
具體介紹:
Lcd1602排隊叫號系統(tǒng),有取號顯示窗和叫號顯示窗。有取號鍵和叫號鍵以及重復(fù)叫號鍵?梢燥@示你前面有幾人在等候。具體看圖片上面。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1.PNG (47.61 KB, 下載次數(shù): 64)
下載附件
2019-10-13 12:51 上傳
單片機源程序如下:
- #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;//來訪者所領(lǐng)取的號碼
- 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);//寫指令函數(shù) 液晶1
- void write_dat1(uchar dat);//寫數(shù)據(jù)函數(shù) 液晶1
- void init_lcd1();//液晶1初始化
- void write_add1(uchar address,uchar dat);//指定地址寫入數(shù)據(jù)
- void display_lcd1(uint num,uchar );//液晶1顯示
- void write_order2(uchar order);//寫指令函數(shù) 液晶2
- void write_dat2(uchar dat);//寫數(shù)據(jù)函數(shù) 液晶2
- void init_lcd2();//液晶2初始化
- void write_add2(uchar address,uchar dat);//指定地址寫入數(shù)據(jù)
- void display_lcd2(uint num);//液晶2顯示
- void delay(uchar z) //延時函數(shù)
- {
- 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++;//號碼數(shù)加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)//寫指令函數(shù) 液晶1
- {
- rs1=0;
- en1=0;
- P0=order;
- delay(1);
- en1=1;
- delay(1);
- en1=0;
- }
- void write_dat1(uchar dat)//寫數(shù)據(jù)函數(shù) 液晶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)//指定地址寫入數(shù)據(jù)
- {
- 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)//寫指令函數(shù) 液晶2
- {
- rs2=0;
- en2=0;
- P1=order;
- delay(1);
- en2=1;
- delay(1);
- en2=0;
- }
- void write_dat2(uchar dat)//寫數(shù)據(jù)函數(shù) 液晶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)//指定地址寫入數(shù)據(jù)
- {
- write_order2(0x80+address);
- write_dat2(dat);
- }
- void write_add3(uchar address,uchar dat)//指定地址寫入數(shù)據(jù)
- {
- write_order2(0x80+0x40+address);
- write_dat2(dat);
- }
- void display_lcd2(uint num)//液晶2顯示
- {
- uchar a,b,c,d;//用于液晶
- uchar e,f,g,h;//顯示等待人數(shù)
- 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) //顯示前面等待的人數(shù)
- {
- 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;
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
Lcd1602排隊叫號系統(tǒng) 取號排隊機 仿真C.7z
(28.4 KB, 下載次數(shù): 204)
2019-10-13 18:44 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|