基于51单片机排队叫号系统设计讲解文档格式.docx
《基于51单片机排队叫号系统设计讲解文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机排队叫号系统设计讲解文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
本系统由按键输入系统、单片机系统、屏幕显示系统及叫号提示音系统组成,系统分为两个部分:
抽号部分和叫号部分,其控制核心为AT89C51单片机,选用此单片机编程简单,开发工具便于使用,能很好地满足排队叫号的控制数据处理。
抽号部分和叫号部分采用一块LCD液晶显示器,这样显示数据直观,便于顾客理解,抽号部分输入只需使用一个抽号键即可,便于客户操作,叫号部分包括两个叫号键,系统采用自动清零,无需人工操作。
2.2方案论证
1.控制器
控制器的选择是确定整个系统硬件方案的关键,它关系到其它几个部分方案的确定,对于排队叫号系统,控制器的可选方案有以下两种:
(1)采用单片机。
单片机采用半导体工艺,使其具有很多显著的优点和特点,因而能在各个领域都得到迅猛的发展,它主要有如下特点:
1有优异的性能价格比。
2集成度甚高,体积小,有很高的可靠性,可以在恶劣环境下工作。
3控制能力强。
4低功耗,低电压,便与生产便携式产品。
5扩展容易。
(2)采用PLC。
PLC是一种专门为在工业环境下的应用而设计的专用计算机。
其特点是抗干扰能力强,具有很高的可靠性高;
各种接口配套齐全,功能完善,适用性强。
采用PLC构成的控制系统的工作量小,维护方便,适合于野外使用,但价格昂贵[21]。
排队叫号系统作为一种生活中常用的小型系统,本身价值不高,更要求控制系统具有较好的性价比,经上述分析比较,确定采用单片机作为控制器。
2.输入通道
输入通道为按键。
按键有独立式按键和行列式按键两种,因为所需按键数少,故确定使用独立式按键。
3.控制输出通道
排队叫号系统的执行机构是1602显示器和蜂鸣器使得系统输出简单明了。
2.3总体方案
系统的组成如图2.3。
设备上电后,显示器屏亮,无信息显示。
当客户按键后,没按一下,队伍加一,显示器显示客户队伍号:
排满20位后,再按取号键,屏幕显示“队伍满”。
当客服叫号时,队伍减1,程序进行信息处理,在屏幕上显示“几号客户到几号窗口”,同时进行声音提示;
当队伍空时,显示“队伍空”,显示器屏幕清空,储存队伍号码归零处理。
图2.3总体方案框图
3硬件电路设计
3.1单片机及外围电路
微控制器采用AT89C51。
AT89C51是美国ATMEL公司生产的与MCS-51系列单片机完全兼容的高性能CMOS8位单片机,MCS-51系列单片机以其推出时间早、配套资源丰富、开发手段完善、性价比高等特点而得到了广泛的应用,是单片机的主流品种。
AT89C51的内部资源主要包括:
·
与MCS--51系列完全兼容的高性能8位CPU;
8K字节可重复编程的Flash存储器;
256字节的SRAM;
4个8位的并行口,共32条I/O口线;
3个16位的定时器/计数器;
6个中断源,2个中断优先级的中断系统;
一个全双工的串行口;
内部振荡器。
AT89C51的外围电路主要包括时钟电路、复位电路、存储器扩展电路等,为了提高系统的可靠性,应设计看门狗(Watch-dogTimer)电路。
如图3.1所示。
图3.1单片机外围电路
3.2显示电路
多数的应用系统,都要配输出外设,LED显示器和LCD显示器,为了达到显示目的,我们选用了LCD1602显示器。
在显示方面,我们选用LCD显示。
背光亮度可调,可显示两行,每行16字符,不能显示汉字,内置含128个字符的ASCII字符集字库,并行接口编程容易,但是占用的I/O口线比较多,
引脚功能介绍如下:
VSS(引脚1):
电源地。
VDD(引脚2):
电源正。
VO(引脚3):
对比度调节端
RS(引脚4):
数据/命令选择端(H/L)
R/W(引脚5):
读写选择端(H/L)
E(引脚6):
使能信号
D0~D7(引脚7~14)数据口
BLA(引脚15)背光电源正
BLK(引脚16)背光电源负
1602显示屏连接单片机的P0口,电路连接图如下
图3.3
3.3按键电路
按键控制电路中,单片机的P1口分别连接3个按键式开关,P3.0顾客排号按键;
P3.1窗口一叫号按键;
P3.2窗口二叫号按键。
按键电路图如下图3.3
图3.3
3.4蜂鸣器电路
蜂鸣器的正极的一段连接到5V电源上面,另一端连接到三级管的集电极,三极管的基极有单片机的P1.5管脚来控制,当P1.5管脚为低时,输出高电平,三极管导通,这样蜂鸣器的电流形成回路,放出声音。
用户可以通过程序控制P1.5管脚的置低和置高来使蜂鸣器发出声音和关闭。
电路如下图
4系统软件设计
4.1主程序设计
主程序见附录B
图4.1主程序流程图
4.2子程序液晶LCD1602显示处理程序
液晶LCD1602显示处理程序
/***************************************
LCD1602*显示屏命令写入函数*
****************************************/
voidLCD_write_com(ucharcom)
{
e=0;
rs=0;
rw=0;
P0=com;
delay(1000);
e=1;
delay(1000);
}
/*****************************************
LCD1602*显示屏数据写入函数*
*****************************************/
voidLCD_write_data(uchardat)
rs=1;
P0=dat;
}
LCD1602*显示屏数据写入数据*
voidLCD_clear(void)
LCD_write_com(0x01);
LCD1602显示屏初始化函数
voidLCD_init(void)
LCD_write_com(0x38);
/*显示模式设置*/
delay(100);
LCD_write_com(0x38);
LCD_write_com(0x08);
/*显示关闭*/
/*显示清屏*/
LCD_write_com(0x06);
/*显示光标移动设置*/
LCD_write_com(0x0C);
/*显示开及光标设置*/
}
程序具体流程图如图
这几个是1602显示的必备程序,设置好1602后,只需通知写指令和写数据的程序处理,能够把需要显示的内容显示出来,是比较简单的显示设备。
4.3子程序按键检测程序
/*获取键值函数*/
uintsweep_key()
uintjianzhi;
if(key1==0)
{delay(1000);
if(key1==0)
jianzhi=1;
RankFlag=1;
if(key2==0||key3==0)
if(key2==0)
jianzhi=2;
if(key3==0)
jianzhi=3;
ClearNumFlag=1;
return(jianzhi);
本设计只有两个叫号窗口,相对来说比较简单,通过按键检测程序来分辨是哪个按键按下了。
窗口依据实际需要可以增加,程序有很大的扩展性。
5系统调试与总结
5.1调试
屏幕出将程序下载到单片机中调试成功。
按下客户端取号按键现号码如上图。
按下服务叫号键出现提示如下图
5.2总结
此系统采用LCD1602显示,做起来比较简单,其中只设立了两个处理窗口,虽然较少,不过可以根据需要自行增加,具有较好扩展功能。
设计采用声音提示,由于能力有限,不会编写音乐程序,就用了最简单的蜂鸣器声音。
从此次设计中,我学到很多,对没用掌握的知识有了一定的理解。
参考文献
[1]单片机微型计算机原理、应用、及接口技术(第二版)。
张迎新等编著。
国防科技大学出版社出版。
[2]单片机在服务叫号管理系统中的应用。
唐海波于宏图李继平。
《微型机与应用》。
[3]MCS-51单片机应用设计。
张毅刚。
哈尔滨工业大学出版社。
[4]MCS—51单片机原理与应用(C语言版)。
机械工业出版社。
[5]一种基于单片机的排队叫号系统设计。
欧志刚。
计算机光盘软件与应用。
附录A:
系统原理图
附录B
程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P2^6;
sbitrw=P2^5;
sbite=P2^7;
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitsounder=P1^5;
ucharprompt1[]="
YourNo.is00!
"
;
ucharprompt2[]="
No.00GoToWin.0"
ucharprompt3[]="
Queueisfull"
ucharprompt4[]="
Queueisempty!
uintnum_count=0;
//排队叫的号码
uintrank_number[20]={0};
//排队叫号存储的数组
uintnum=0;
//窗口消的号码
intRankFlag=0;
//叫号的标志
intClearNumFlag=0;
//消号的标志
uintLengthFlag=0;
//队列长度叫一次号时+1,消一次号时-1
/*延时函数*/
voiddelay(uintn)
while(n--);
LCD1602*显示屏命令写入函数*
{
e=0;
P0=com;
LCD1602*显示屏清空显示*
LCD_write_com(0x06);
LCD_write_com(0x0C);
/*简单的蜂鸣器提示音*/
voidsound()
{uinta;
for(a=0;
a<
500;
a++)
sounder=0;
delay(61);
sounder=1;
/*获取键值函数*/
jianzhi=1;
jianzhi=2;
ClearNumFlag=1;
叫号机按一次一号键变量+1,最大为20
voidQueueNumProcess()
if(RankFlag==1)//判断叫号标志是否有效
if(LengthFlag<
20)
num_count++;
rank_number[LengthFlag]=num_count;
LengthFlag++;
窗口消号处理函数
voidClearNumProcess()
uinti;
if(ClearNumFlag==1)//判断消号标志是否有效
num=rank_number[0];
//把消的号赋给全局变量num
for(i=0;
i<
19;
i++)//让数组整体左移一个存储单元,即把消得号删除
rank_number[i]=rank_number[i+1];
LengthFlag--;
检测到按键后,检测函数处理及LCD显示处理
voidCheckButtonProcess(uintm)
uintjz,i;
jz=m;
if((jz==1)&
&
(RankFlag==1))
//当队列人数达到20时,提示
//Queueisfull
if(LengthFlag>
=20)
LCD_clear();
LCD_write_com(0x80+0x02);
16;
i++)
LCD_write_data(prompt3[i]);
else
QueueNumProcess();
prompt1[11]=(num_count)/10+'
0'
prompt1[12]=(num_count)%10+'
LCD_write_com(0x80+02);
15;
{
LCD_write_data(prompt1[i]);
//"
RankFlag=0;
if((jz==2||jz==3)&
ClearNumFlag==1)
if(LengthFlag==0)
LCD_write_com(0x80+0);
LCD_write_data(prompt4[i]);
//"
Queueisempty"
delay(65535);
//无人排队时屏幕自动清屏,计数归零
num_count=0;
ClearNumProcess();
//消号处理,营业员操作
sound();
prompt2[3]=num/10+'
prompt2[4]=num%10+'
prompt2[15]=(jz-1)+'
LCD_write_data(prompt2[i]);
No.00cometoNo.0"
ClearNumFlag=0;
main函数
voidmain()
uintKvalue;
LCD_init();
while
(1)
Kvalue=sweep_key();
//获取键值
if(RankFlag==1||ClearNumFlag==1)//判断叫号标志和消号标志是否有效
CheckButtonProcess(Kvalue);
delay(200);
//使叫号标志无效
//使消号标志无效
Kvalue=0;
//键值清0