历史上的今天
今天是:2025年02月20日(星期四)
2020年02月20日 | 基于51单片机的排队叫号系统仿真与程序源码设计
2020-02-20 来源:51hei
基于51单片机的排队叫号系统设计,电路和程序比较简单,附件是proteus仿真电路图和源程序,供初学者学习参考。
排队叫号系统仿真原理图如下
单片机源程序如下:
#include #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; sbit rw=P2^1; sbit e=P2^2; sbit key1=P1^0; sbit key2=P1^1; sbit key3=P1^2; sbit sounder=P3^7; uchar prompt1[]="Your No.is 00!"; uchar prompt2[]="No.00 Go To Win.0"; uchar prompt3[]="Queue is full "; uchar prompt4[]="Queue is empty !"; uint num_count=0; //排队叫的号码 uint rank_number[20]={0}; //排队叫号存储的数组 uint num=0; //窗口消的号码 int RankFlag=0; //叫号的标志 int ClearNumFlag=0; //消号的标志 uint LengthFlag=0; //队列长度 叫一次号时+1,消一次号时-1 /*延时函数*/ void delay(uint n) { while (n--); } /***************************************** LCD1602 *显示屏命令写入函数* *****************************************/ void LCD_write_com(uchar com) { e=0; rs=0; rw=0; P0= com; delay(1000); e=1; delay(1000); e=0; } /***************************************** LCD1602 *显示屏数据写入函数* *****************************************/ void LCD_write_data(uchar dat) { e=0; rs=1; rw=0; P0 = dat; delay(1000); e=1; delay(1000); e=0; } /***************************************** LCD1602 *显示屏清空显示* *****************************************/ void LCD_clear(void) { LCD_write_com(0x01); delay(1000); } /***************************************** LCD1602 显示屏初始化函数 *****************************************/ void LCD_init(void) { // LCD_write_com(0x38); /*显示模式设置*/ //delay(100); // LCD_write_com(0x38); // delay(100); LCD_write_com(0x38); delay(100); //LCD_write_com(0x38); LCD_write_com(0x08); /*显示关闭*/ LCD_write_com(0x01); /*显示清屏*/ LCD_write_com(0x06); /*显示光标移动设置*/ delay(100); LCD_write_com(0x0C); /*显示开及光标设置*/ } /*简单的蜂鸣器提示音*/ void sound() { uint a; for(a=0;a<500;a++) { delay(61); sounder=~sounder; } } /*获取键值函数*/ uint sweep_key() { uint jianzhi; if(key1==0) { delay(1000); if(key1==0) jianzhi=1; RankFlag=1; } if(key2==0||key3==0) { delay(1000); if(key2==0) jianzhi=2; if(key3==0) jianzhi=3; ClearNumFlag=1; } return (jianzhi); } /***************************************** 叫号机 按一次一号键变量+1,最大为20 *****************************************/ void QueueNumProcess() { if(RankFlag==1) //判断叫号标志是否有效 { if ( LengthFlag<20) { num_count++; rank_number[LengthFlag] = num_count; } LengthFlag++; } } /***************************************** 窗口消号处理函数 *****************************************/ void ClearNumProcess() { uint i; if (ClearNumFlag==1) //判断消号标志是否有效 { num=rank_number[0]; //把消的号赋给全局变量num for(i=0;i<19;i++) //让数组整体左移一个存储单元,即把消得号删除 { rank_number[i]=rank_number[i+1]; } LengthFlag--; } } /***************************************** 检测到按键后,检测函数处理及LCD显示处理 *****************************************/ void CheckButtonProcess(uint m) //m代表检测到的键值 { uint jz,i; jz=m; if((jz==1) && (RankFlag==1)) { // 当队列人数达到20时,提示 // Queue is full if( LengthFlag>=20 ) { LCD_clear(); LCD_write_com(0x80+0x02); delay(100); for(i=0;i<16;i++) { LCD_write_data(prompt3[i]); delay(100); } } else { QueueNumProcess(); prompt1[11]=(num_count)/10+'0'; prompt1[12]=(num_count)%10+'0'; LCD_clear(); LCD_write_com(0x80+02); delay(100); for(i=0;i<15;i++) { LCD_write_data(prompt1[i]); //"Your No.is 00!"; delay(100); } RankFlag=0; } } if((jz==2||jz==3) && ClearNumFlag==1) { if(LengthFlag==0) { LCD_clear(); LCD_write_com(0x80+0); delay(1000); for(i=0;i<16;i++) { LCD_write_data(prompt4[i]);//"Queue is empty "; delay(100); } delay(65535); //无人排队时屏幕自动清屏,计数归零 LCD_clear(); num_count=0; } else { ClearNumProcess(); //消号处理,营业员操作 sound(); prompt2[3]=num/10+'0'; prompt2[4]=num%10+'0'; prompt2[15]=(jz-1)+'0'; LCD_clear(); LCD_write_com(0x80+0); delay(100); for(i=0;i<16;i++) { LCD_write_data(prompt2[i]); //"No.00 come to No.0"; delay(100); } ClearNumFlag=0; } } } /***************************************** main 函数 *****************************************/ void main() { uint Kvalue; LCD_init(); while(1) { Kvalue=sweep_key(); //获取键值 if (RankFlag==1 || ClearNumFlag==1)//判断叫号标志和消号标志是否有效 CheckButtonProcess(Kvalue); delay(200); RankFlag=0; //使叫号标志无效 ClearNumFlag=0; //使消号标志无效
史海拾趣
|
比如说在什么场合用什么样的调制,有什么优缺点,就比如GSM为什么要用GMSK等,也可以谈谈星座映射方面的知识,这样大家可以共同学习,共同进步,也可以说说你用过哪种调制技术等… 查看全部问答> |
|
1.W-CDMA协议概观(25.201) 2.传输信道和物理信道映射(25.211) 3.信道复用与信道编码(25.212) 4.扩频与调制模式(25.213) 5.物理层处理机制(25.214) 6.物理层测试规范(25.215) … 查看全部问答> |
|
本人第一次写USB 程序,网上很多都是USB设备(模拟一个USB设备),但任务是USB主机驱动,即驱动开发板驱动一个USB设备,先期是HID类 有哪位高手给一个资源,给点指导郁闷很长时间了。(1.JUNGO的USBWare要钱,很贵,有免费的吗) nxp LPC 24xx 以 ...… 查看全部问答> |
|
新建了一个群,主要想招揽高级别的开发者,一起分享开发经验。 虽然不一定能解决各自问题,至少能开阔眼界。 本群的特点: 1.新股,有潜力。 2.股东有实力。 3.年底分红。 4.稳赚不赔。 要求至少3年以上项目经验。对几个常见系统之一 WinCE/W ...… 查看全部问答> |
|
猎头职位:北京世界五百强诚聘symbian高级研发-c++ 有相应的具体JD 客户是世界五百强外资,做智能手机symbian系统的研发 一般要求硕士5年经验以上,具体看个人资质 请有意者速速联系 msn:jessi.wang@hotmail.com e-mail:weiyangwj@sina.com ...… 查看全部问答> |
|
因为最近在编写一个网络文件传输方面的应用程序,该应用程序需要实现windows XP和vxWorks之间的文件传输。因为在这方面我是一个初学者,所以遇到不少的问题,问题如下 ,希望大家可以详细的帮我解答一下。 因为现在我 ...… 查看全部问答> |
|
BOOL ret; ret = EnumPrinterDrivers(NULL, NULL, 1, NULL, 0, &dwNeeded, &dwReturned); 返回值是1,但是dwNeeded却为0,dwReturned也为0 & ...… 查看全部问答> |
|
STM8编译时报错,如下, 这要怎么解决 #error clnk Debug\\tim1pwm.lkf:1 segments .text (0x8083-0x82e2) and .const (0x8000-0x8084) overlap… 查看全部问答> |




