历史上的今天
返回首页

历史上的今天

今天是:2025年02月20日(星期四)

正在发生

2020年02月20日 | 基于51单片机的排队叫号系统仿真与程序源码设计

2020-02-20 来源:51hei

基于51单片机的排队叫号系统设计,电路和程序比较简单,附件是proteus仿真电路图和源程序,供初学者学习参考。


排队叫号系统仿真原理图如下
0.png?imageView2/2/w/550

单片机源程序如下:

#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;         //使消号标志无效 

推荐阅读

史海拾趣

Everbuild公司的发展小趣事

Everbuild深知人才是企业发展的核心。因此,公司注重人才培养和团队建设。公司建立了完善的培训体系,为员工提供各种技能培训和职业发展机会。同时,Everbuild还鼓励员工参与创新项目和技术研发,激发员工的创造力和工作热情。这些努力使Everbuild拥有一支高素质、专业化的团队,为公司的持续发展提供了强有力的保障。

C&K Components公司的发展小趣事

进入千禧年代,随着全球经济的融合和科技的快速发展,ITT Industries看中了C&K在开关领域的领先地位和强大实力,决定对其进行收购。这次并购使C&K成为ITT的开关部门,但公司仍然保留了C&K的名称和品牌。并购后的C&K借助ITT的全球资源和平台优势,进一步提升了自身的研发能力和市场竞争力,实现了更快速的发展。

Delkin Devices公司的发展小趣事

为了更好地服务全球客户,Delkin Devices积极拓展海外市场。公司在欧洲设立了办事处,以便更直接地接触欧洲市场并了解当地客户需求。此外,Delkin Devices还通过参加国际展会、建立合作伙伴关系等方式,不断拓展其在全球范围内的影响力。通过这些努力,Delkin Devices成功将产品销往全球多个国家和地区,实现了国际化布局和市场拓展。

AURORA公司的发展小趣事

AURORA公司深知自动驾驶技术的商业化落地需要与汽车制造商紧密合作。因此,AURORA积极与大众汽车集团、现代汽车等多家知名汽车制造商建立合作关系。通过共同研发和推广自动驾驶技术,AURORA成功帮助这些汽车厂商加速各自自动驾驶汽车的商用计划。这种深度合作不仅提升了AURORA的市场影响力,也为公司的长期发展奠定了坚实基础。

Dow-Key Microwave Corporation公司的发展小趣事

为了实现公司的国际化发展战略,Dow-Key Microwave积极开展国际合作与交流。公司与全球知名的电子企业和研究机构建立了紧密的合作关系,共同开展技术研发和市场开拓活动。这些合作不仅提升了公司的技术水平和市场影响力,还为公司的国际化发展提供了有力支持。同时,公司还积极参与国际展览和论坛活动,展示公司的最新技术和产品成果,进一步提升了公司的国际知名度和品牌形象。

Fermionics Lasertech Inc公司的发展小趣事

作为一家有社会责任感的企业,Fermionics Lasertech Inc公司始终关注环境保护和社会公益事业。他们积极推行绿色制造理念,采用环保材料和节能技术生产产品;同时,公司还积极参与各类公益活动,回馈社会。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了强大动力。

问答坊 | AI 解惑

大家可以进来讨论一下各种调制方式的使用

比如说在什么场合用什么样的调制,有什么优缺点,就比如GSM为什么要用GMSK等,也可以谈谈星座映射方面的知识,这样大家可以共同学习,共同进步,也可以说说你用过哪种调制技术等…

查看全部问答>

不错的系统资料,WCDMA系统设计PPT

1.W-CDMA协议概观(25.201) 2.传输信道和物理信道映射(25.211) 3.信道复用与信道编码(25.212) 4.扩频与调制模式(25.213)    5.物理层处理机制(25.214) 6.物理层测试规范(25.215) …

查看全部问答>

lpc1343能否移植usosII

如题,想了解一下是否能跑系统,除了ucosII,其他的系统也可以…

查看全部问答>

NXP LPC2468 USB Host 主机控制器程序

本人第一次写USB 程序,网上很多都是USB设备(模拟一个USB设备),但任务是USB主机驱动,即驱动开发板驱动一个USB设备,先期是HID类 有哪位高手给一个资源,给点指导郁闷很长时间了。(1.JUNGO的USBWare要钱,很贵,有免费的吗) nxp LPC 24xx 以 ...…

查看全部问答>

关于年龄问题

我今年27了,搞嵌入式是不是有点晚了,请问这个行业能干到多少岁? 我是指目前国内的现状,一般搞嵌入式软件开发的都是多大的人? 总觉得自己有点大了,人家都是小伙子,有点不好意思,哈哈。…

查看全部问答>

WinCE开发顶级群_大家来捧场(顺便散分)

新建了一个群,主要想招揽高级别的开发者,一起分享开发经验。 虽然不一定能解决各自问题,至少能开阔眼界。 本群的特点: 1.新股,有潜力。 2.股东有实力。 3.年底分红。 4.稳赚不赔。 要求至少3年以上项目经验。对几个常见系统之一 WinCE/W ...…

查看全部问答>

猎头职位:北京世界五百强诚聘symbian高级研发-c++

猎头职位:北京世界五百强诚聘symbian高级研发-c++ 有相应的具体JD 客户是世界五百强外资,做智能手机symbian系统的研发 一般要求硕士5年经验以上,具体看个人资质 请有意者速速联系 msn:jessi.wang@hotmail.com e-mail:weiyangwj@sina.com ...…

查看全部问答>

vxWorks 创建硬盘,使用dosFs文件的方法—求教

   因为最近在编写一个网络文件传输方面的应用程序,该应用程序需要实现windows XP和vxWorks之间的文件传输。因为在这方面我是一个初学者,所以遇到不少的问题,问题如下 ,希望大家可以详细的帮我解答一下。     因为现在我 ...…

查看全部问答>

EnumPrinterDrivers的奇怪现象

        BOOL ret;         ret = EnumPrinterDrivers(NULL, NULL, 1, NULL, 0, &dwNeeded, &dwReturned);         返回值是1,但是dwNeeded却为0,dwReturned也为0 & ...…

查看全部问答>

STM8地址重叠编译错误,要怎么设置;

STM8编译时报错,如下,  这要怎么解决 #error clnk Debug\\tim1pwm.lkf:1 segments .text (0x8083-0x82e2) and .const (0x8000-0x8084) overlap…

查看全部问答>