自动排队叫号系统C51源程序及调试
- 格式:doc
- 大小:241.50 KB
- 文档页数:9
这里设计得出自动排队叫号系统,实现以下功能:(1)领号功能:在允许的情况下,当顾客前来领号时系统便显示出一个能唯一识别的号码,作为所领的号码;(2)叫号功能:当前等待的人数显示给工作人员,在可以受理业务且有人正在等待的情况下,工作人员可以通知等待的人当中最先领号的人前去指定的业务办理点;(3)报警功能:同一时刻等待的人数(用wp表示)不得超过20,否则便发出警报通知工作人员,工作人员做相应处理,告知前来领号的人,并使领号活动停止。
直到等待的人数少于20的时候再继续领号;(4)统计客流量功能:工作人员随时可以知道到目前为止已领号的总人数。
C51源程序:#include<reg52.h> //C51程序包含的头文件#define uchar unsigned char#define uint unsigned int//以下定义要用到的字符串数组uchar code t0[]="Welcome!";uchar code t1[]="wp"; //wp意为正在等待的人数uchar code t2[]="Y our No.is";uchar code t3[]="No. come to";uchar code t33[]="No. window!";uchar code t4[]="Queue is full,";uchar code t44[]="come later.";uchar code t5[]="Nobody is";uchar code t55[]="waiting!";uchar code t6[]="Now the total wp";uchar code t66[]="number is ";uchar num,waiting,count; //num为所领号码,waiting为正在等待的人数sbit lcden=P2^7; //液晶使能端sbit lcdrw=P2^5; //“读”或“写”选择端,要置低sbit lcdrs=P2^6; //写命令或数据选择端:置0写命令,置1写数据sbit s0=P3^4; //领号键sbit s1=P3^1; //窗口1的叫号键sbit s2=P3^2; //窗口2的叫号键sbit s3=P3^3; //停止领号键sbit add=P3^5; //统计客流量sbit bee=P1^5; //蜂鸣器端口//函数声明void delay(uint); //延时void di(); //蜂鸣void write_com(uchar); //向液晶写入命令void write_data(uchar); //向液晶写入数据void go(uchar,uchar); //移动光标void shownum(uchar); //显示数字void showstr(uchar *); //显示字符串void clear(); //清空动态显示void init(); //初始化void keyscan(); //键盘扫描//函数定义void delay(uint n){uint i,j;for(i=n;i>0;i--) //不够精确地延时1msfor(j=110;j>0;j--);}void di(){bee=0;delay(100);bee=1;}void write_com(uchar com){lcdrs=0; //选择写命令lcdrw=0; //“读写”选择写P0=com; //液晶输入端接单片机P1口lcden=1; //产生上升沿delay(3);lcden=0;}void write_data(uchar dat){lcdrs=1; //选择写数据lcdrw=0;P0=dat;lcden=1;delay(3);lcden=0;}void go(uchar x,uchar y){if(x==1)write_com(0x80+y); //从液晶第一行左端开始写入数据elsewrite_com(0x80+0x40+y); //从液晶第二行左端开始写入数据}void shownum(uchar dat){uchar code t[]=" ";uchar shi,ge;shi=dat/10; //分离十位ge=dat%10; //分离个位if(shi>0)write_data(0x30+shi); //显示个位elsewrite_data(t[0]);write_data(0x30+ge); //显示十位}void showstr(uchar *t){while(*t){write_data(*t); //向液晶读入字符串t++;}}void clear(){write_com(0x01); //清空屏幕go(1,14); //光标定位到1行14列showstr(t1);go(2,14); //光标定位到2行15列shownum(waiting);}void init(){lcden=0;write_com(0x38); //设置点阵显示和数据接口write_com(0x0c); //打开显示,不显示光标write_com(0x06); //写一个字符指针加一write_com(0x01); //显示清零、数据指针清零go(1,4);showstr(t0);}void keyscan(){uchar a;if(waiting<20){if(s0==0&&(s1!=0)&&(s2!=0)&&(s3!=0)) //在工作人员的操作键未按下的情况下才能领号{delay(5);if(s0==0&&(s1!=0)&&(s2!=0)&&(s3!=0)) //确认领号键被按下{while(!s0); //等待按键释放di(); //蜂鸣器响一下clear();num++;waiting++;go(1,0); //光标定位到1行1列showstr(t2);go(2,0); //光标定位到2行1列shownum(num); //显示所领的号码go(2,14);shownum(waiting); //显示等待的人数}}if(s1==0){delay(5); //窗口1的叫号键被按下if(s1==0){while(!s1);di();if(waiting==0) //如果没人在等待{write_com(0x01);go(1,3);showstr(t5);go(2,3);showstr(t55);}else{clear();waiting--;go(1,0);showstr(t3);go(2,0);showstr(t33);go(1,3);shownum(num-waiting);go(2,3);shownum(1);go(2,14);shownum(waiting);}}}if(s2==0) //窗口2的叫号键被按下{delay(5);if(s2==0){while(!s2);di();if(waiting==0) //如果没人在等待{write_com(0x01); //清屏go(1,3);showstr(t5);go(2,3);showstr(t55);}else{clear();waiting--;go(1,0);showstr(t3);go(2,0);showstr(t33);go(1,3);shownum(num-waiting);go(2,3);shownum(2);go(2,14);shownum(waiting);}}}}else if(waiting==20) //如果等待的人数达到上限{if(!a)di(); //报警if(s3==0) //领号停止键被按下{delay(5);if(s3==0){while(!s3);di();a=1;write_com(0x01);go(1,0);showstr(t4);go(2,0);showstr(t44);}}if(a==1){if(s1==0) //继续叫号{delay(5);if(s1==0){while(!s1);di();clear();waiting--;go(1,0);showstr(t3);go(2,0);showstr(t33);go(1,3);shownum(num-waiting);go(2,3);shownum(1);go(2,14);shownum(waiting);a=0;}}if(s2==0) //继续叫号{delay(5);if(s2==0){while(!s2);di();clear();waiting--;go(1,0);showstr(t3);go(2,0);showstr(t33);go(1,3);shownum(num-waiting);go(2,3);shownum(2);go(2,14);shownum(waiting);a=0;}}}}if((add==0)&&(s0!=0)&&(s1!=0)&&(s2!=0)&&(s3!=0)) //在其他按键未按下的情况下才能统计客流量{delay(add==0);if((add==0)&&(s0!=0)&&(s1!=0)&&(s2!=0)&&(s3!=0)){while(!add);di();write_com(0x01);go(1,0);showstr(t6);go(2,0);showstr(t66);shownum(num);go(2,14);shownum(waiting);}}}main() //主程序{init();while(1)keyscan();}程序调试结果。