想起了大学时写过的一个排队叫号系统,决定重温一下记录起来
一、项目要求
叫号:按下按键叫号,数码管显示叫号的号数,蜂鸣器响。
取号:按下按键取号,两个数码管分别显示取到的号数和等待的人数。

(PS:推荐使用串口调试助手进行调试)

二、可能使用到的工具

1.串口调试助手(百度网盘自行下载)

链接:https://pan.baidu.com/s/1XmCBUDD7kF8a5393fh_bBg

提取码:znv3

三、串口通信原理

1.由51单片机引脚图可看出,P3.1(TXD)和P3.0(RXD)为串行通信口,

P3.0为串行接收口,P3.1为串行发送口。要使两块单片机板可以进行串口通信,则将两块板之间的RXD/TXD交叉连接。

Android 叫号屏上排队叫号屏幕叫号自动滚动_数据


四、设计流程图

Android 叫号屏上排队叫号屏幕叫号自动滚动_单片机_02


五、硬件设计

Android 叫号屏上排队叫号屏幕叫号自动滚动_串口_03


六、界面实现

Android 叫号屏上排队叫号屏幕叫号自动滚动_单片机_04


七、代码

主机:

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
 u8 an=0;//叫号数
 u8 receiveData=0;
 sbit k1=P1^0;	 //定义P0.0口是k1
 sbit beep=P1^5;
 char jishu=0,t=0;	
u8 code smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
					0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值
void UsartInit()
{
	SCON=0X50;			//设置为串口工作方式1
	TMOD=0X20;			//设置定时器工作方式2
	PCON=0X00;			//波特率不加倍	PCON第一位是SMOD与波特率的倍数有关
	TH1=0XF3;				//计数器初始值设置,波特率是2400的
	TL1=0XF3;
	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;				    	//打开计数器
}	 
void delay(u16 i)
{
int j=0;

	for(j=0;j<i;j++);	
}
void beepx()
{
 beep=0;
  delay(10000);
  beep=1;
 } 
void sendchar()
{
   TI=0;
   SBUF=an;
   	while(!TI);			 //等待发送数据完成
	TI=0;
}  
 void CallNum(u16 k)	//叫号函数
 {
   P2=smgduan[k];
 }
 void Usart() interrupt 4
{	 
   if(RI==1)
   {
	receiveData=SBUF;//出去接收到的数据
	RI = 0;//清除接收中断标志位
	}
} 
	    
void main()
{
  P2=smgduan[0];
	UsartInit();  //	串口初始化
	while(1)
	{
	   if(k1==0)
	   {
	     delay(100000);
		 if(k1==0);
		 {
		  if(receiveData>an)
		  {	  
		     an++;
	        CallNum(an);
			 beepx();
		     sendchar();	 
		   }
		    while(!k1);
			delay(1000);
	    }
	  }
	}
}

从机:

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
  u8 quhao=0;  //取号
 u8 receiveData=0;	   //接收到的数据
 sbit k1=P1^0;	 //定义P1.0口是k1
u8 code smgduan[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
					0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//显示0~F的值
void UsartInit()
{
	SCON=0X50;			//设置为串行工作方式1  
	TMOD=0X20;			//设置计数器工作方式2(8位自动重装定时器/计数器)
	PCON=0X00;		//波特率不加倍  最高位为SMOD决定波特率是否加倍
	TH1=0XF3;				//定时器初始值设置,波特率是2400
	TL1=0XF3;
	ES=1;						//打开串口中断
	EA=1;						//打开总中断
	TR1=1;					//打开定时器1
}	 
void delay(u16 i)
{
int j=0;
	for(j=0;j<i;j++);	
}
 void sendchar()
{
   TI=0;  
   SBUF=quhao;
   	while(!TI);			 //等待发送数据完成
	TI=0;	//发送标志位清零,等待下次中断
}  
void getnum(u16 k)//取到的号
 {
 P0=smgduan[k];
 }
 void waitnum(u16 k) //等候的人数
 {
   P2=smgduan[k];
 }
 void Usart() interrupt 4  //4为串口中断号
{	 
   if(RI==1)
   {
	receiveData=SBUF;//出去接收到的数据
	RI = 0;//清除接收中断标志位
	}
}  
void main()
{
  P0=smgduan[0];
  P2=smgduan[0];
	UsartInit();  //	串口初始化
	while(1)
	{
	   if(k1==0)
	   {
	     delay(100000);
		 if(k1==0);
		 { 
		 if(quhao<15)
		 {
		    quhao++;	
	      getnum(quhao);
		  sendchar();
		 waitnum(quhao-receiveData-1);
		 }
		 	while(!k1);	
			delay(1000);
		}  
	  } 
	  /*if(quhao-receiveData-1==-1)
	  {
	    waitnum(0);
	  }
	  else{
	   waitnum(quhao-receiveData-1);
	   }  */
	}
}