基于51单片机的双机串口通信排队叫号系统(LCD显示)设计
1 开发环境
仿真图:proteus8.9以上
程序代码:KEIL4/KEIL5
原理图:AD
设计编号:A0006
视频讲解
基于51单片机的双机串口通信排队叫号系统(LCD显示)设计
2 功能说明介绍
结合实际情况,基于51单片机设计一个排队叫号系统设计。该系统应满足的功能要求为:
由51单片机、按键模块、LCD1602液晶屏、蜂鸣器呼叫模块构成
具体功能:
1、主机通过按键完成叫号,LCD1602液晶显示屏显示被叫的号码及服务的柜台号;同时,蜂鸣器响,以提醒顾客接收服务;
2、从机按下按键实现取号,并通过串行通信方式实现排队取号功能;
3、从机还可以实时显示自己的排队号及及当前正在等待的人数。
3 仿真图
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS16位单片机,片内含4k bytes的可反复擦写的只读程序存储器和128 bytes的随机存取数据存储器,期间采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用16位中央处理器和Flash存储单元,功能强大的AT89C51单片机可灵活应用于各种控制领域。
AT89C51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个1 6位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
本系统中央控制器采用的单片机AT89C51,复位电路采用上电复位电路。外接的晶振为12MHz晶振。
当前仿真情况为:取号机取了三个号,叫号器的柜台2叫第一个号。叫号过程有蜂鸣器提示。
4 程序
工程文件使用Keil4/keil5打开。
代码分为取号机代码和叫号机代码,分别编译产生hex加载到对应的单片机中。
代码
叫号机主函数
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0; //1:数据输入,0:指令输入
sbit RW=P2^1; //1: 读出,0:写入
sbit E=P2^2; //1:有效,0:无效
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
sbit key3=P1^3;
sbit key4=P1^4;
sbit key5=P1^5;
sbit key6=P1^6;
sbit key7=P1^7;
sbit BEEP=P2^6;
uint sev=0;
uint sev1=0;
uint sev2=0;
uint sev3=0;
uint sev4=0;
uint m=0,i=0;
uint jhao=1,qhao=0,dhao=0; //排队叫号 //窗口消的号码
uint jz=0;
uchar data test[]="Hello!"; //初始显示的字符
uchar data prompt2[]="No.00 come to No"; //1062第一行显示的字符
uchar data prompt3[]="0.window,Please!"; //1062第二行显示的字符
uchar data prompt8[]="00 is left";
uchar data prompt9[]="All is 00";
uchar data prompt10[]="W1 - 00";
uchar data prompt11[]="W2 - 00";
uchar data prompt12[]="W3 - 00";
uchar data prompt13[]="W4 - 00";
void intCon()
{
EA=0; //关总中断
SCON=0x50; //0101 0000,SM0 SM1=01表示选择工作方式1;SM2 REN=01表示串行口多机通讯控制位,串行口允许接收(从外部接收数据)
PCON=0X00; //电源控制寄存器 最高位为SMOD,为0,表示波特率不加倍,为1,表示波特率加倍
TMOD=0x20; //0010 0000,GATE=0,以运行控制位TR启动定时器;采用定时1工作方式2
TH1=0xfd; //波特率9600=2^smod*(11.05926*10^6)/(32*12*(2^8-X))
TL1=0xfd;
TR1=1; //计数器工作
}
//
void delay(int n) //延时子程序
{
int k,j;
for(k=0;k<=n;k++)
for<