基于C52单片机的排队叫号系统程设计报告Word下载.docx
《基于C52单片机的排队叫号系统程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《基于C52单片机的排队叫号系统程设计报告Word下载.docx(32页珍藏版)》请在冰点文库上搜索。
本人完全意识到本声明的法律后果由本人承担。
日期:
年月日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权 大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
日期:
导师签名:
日期:
注意事项
1.设计(论文)的内容包括:
1)封面(按教务处制定的标准封面格式制作)
2)原创性声明
3)中文摘要(300字左右)、关键词
4)外文摘要、关键词
5)目次页(附件不统一编入)
6)论文主体部分:
引言(或绪论)、正文、结论
7)参考文献
8)致谢
9)附录(对论文支持必要时)
2.论文字数要求:
理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
3.附件包括:
任务书、开题报告、外文译文、译文原文(复印件)。
4.文字、图表要求:
1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写
2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。
图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画
3)毕业论文须用A4单面打印,论文50页以上的双面打印
4)图表应绘制于无格子的页面上
5)软件工程类课题应有程序清单,并提供电子文档
5.装订顺序
1)设计(论文)
2)附件:
按照任务书、开题报告、外文译文、译文原文(复印件)次序装订
第一章设计目的及要求
1.1设计目的
在C51单片机上实现类似银行排队叫号系统的一些功能,从而熟悉单片机的硬件,如数码管,接口,蜂鸣器等。
以及熟悉并用单片机C语言编程,进行仿真,并做成硬件,自己动手,学以致用。
1.2设计要求
1.用4位数码管实现号码的显示。
2.按下“下一位”键号码加1。
3.特定叫号:
用“输入键”进行手动输入号码并显示。
4.复位功能:
为了防止操作员忘记在“特定叫号”前排到的号码,可以按“复位键”来回到之前的那个号码。
5.清零:
按下“清零”键来对当前屏幕进行清零。
6.每按下一个键,同时发出按键声。
第二章设计原理与方案
2.1设计原理
类似于银行的叫号系统,用单片机上的4位数码管来作为显示屏幕,显示当前排到的号码,用4*4矩阵键盘作为操作员的操作键盘来实现按键以及数字输入,用蜂鸣器来发出按键声及提醒声,客户看见排到自己的号时,到柜台来办理业务。
2.2设计方案
用C语言来编程,分别编写出数码管的显示模块,键盘的扫描模块,蜂鸣器的发声模块,软件延时模块等等。
显示模块用table表存显示的数字和字母,用“动态显示法”在数码管显示出来;
键盘扫描模块编写的程序中用到了按下和起手检测,把按下的键位代码反馈给程序;
蜂鸣器发声模块,while循环,端口输出1、0,并延时;
软件延时用的for循环的嵌套。
第三章硬件设计
本设计主要有四个部分,AT89C51单片机芯片,4*4矩阵键盘,4位共阳极数码管,蜂鸣器。
由矩阵键盘获得按键信号后,经单片机芯片处理,将显示信号输送给数码管和蜂鸣器,从而显示数字和发出声音。
3.1硬件系统主要组成部分设计
3.1.1AT89C52芯片
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
它的引脚图如图3.1
3.1.2键盘电路设计
如下图3.2即为4*4矩阵键盘
键盘P13^1~8分别与芯片的P3^0~7相连,它一组按压式开关的集合,是微机系统不可缺少的输入设备,用于输入数据和命令。
键盘的每一个按键都被赋予一个代码,称为键码。
键盘系统的主要工作包括及时发现有键闭合,求闭合键的键码。
根据这一过程的不同,键盘可以分为两种,即编码键盘和非编码键盘。
编码键盘是通过一个编码电路来识别闭合键的键码,非编码键盘是通过软件来识别键码。
由于非编码键盘的硬件电路简单,用户可以方便地增减键的数量,因此在单片机应用系统中,非编码键盘得到广泛的应用,有较好的应用价值。
3.1.3四位数码管
如下图3.3,为四位共阳极数码管,数码管的P17^1~8与芯片的P1^0~7相连,P16^1~4与芯片P2^0~3相连
LED数码管由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。
数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母a,b,c,d,e,f,g,dp来表示。
当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。
如:
显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。
LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。
小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。
发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。
常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
按显示方式分,用单片机驱动LED数码管的方法有静态显示和动态(扫描)显示两种。
静态显示就是显示驱动电路具有输出锁存功能,单片机将所要显示的数据送出后需要刷新,直到下一次显示内容需要更新时再传送新的数据,这种方法显示稳定,占用CPU时间少。
本设计主要是用的动态显示,它的特点正好与静态显示相反,需要CPU时刻对显示器件进行数据刷新,显示数据有闪烁感,占用的CPU时间多,但动态显示所需硬件少,电路相对简单,能节省线路板空间。
采用1位8段共阴极LED,P0口作为LED显示码输出端,因为只采用1位数码管,因此线选端直接接地。
第四章软件设计
本程序分为五个模块,分别是主程序模块,键盘扫描模块,数码管显示模块,软件延时模块,中断定时模块。
键盘扫描模块负责获得键盘按下的按键值,主模块负责处理传进来的信息,处理后发送给输出设备,显示模块实现数码管的数字显示。
软件延时和中断延时应用于其他模块来实现其功能。
具体流程如下图4.1
主程序是while循环。
while语句后跟显示模块,在每次循环都显示数字在数码管上,swich语句用来将键盘扫描返回的值指向各自的功能,清零,复位,输入,下一个等功能。
在输入的同时,每按一个数字,为了使显示不中断,加入数字显示模块。
4.1主程序模块设计
voidmain()
{
TMOD=0x01;
//开中断总开关
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
//设置初始地址,一次中断为5毫秒
EA=1;
ET0=1;
display2(18,1,20,20);
//显示欢迎HI
while
(1)
{
display(shu);
//数码管显示数字
switch(keyscan())//返回键盘扫描值
{
case13:
//按下“下一个”键shu加1
shu++;
break;
case15:
//按下“输入”键
jiyi=shu;
//记住输入前的shu,赋给jiyi
s=16;
x=16;
y=16;
z=16;
while(keyscan()==17)//是否开始输入数字
display1(5,17,16,16);
//显示SR__
if(num>
9)//是否输入的是0~9的数字
{display2(14,17,17,0);
//不是数字则显示ERRO
break;
}
num1=num;
s=num1;
//使键盘扫描时仍显示
while(keyscan()==17)
display1(num1,16,16,16);
//显示num1___
9)
//同上
num2=num;
x=num2;
display1(num1,num2,16,16);
num3=num;
y=num3;
display1(num1,num2,num3,16);
num4=num;
shu=num1*1000+num2*100+num3*10+num4;
}
case10:
//复位
shu=jiyi;
case16:
//清零
shu=0;
}
4.2键盘扫描模块
num=17;
//每次扫描前将num置17
P3=0xf7;
temp=P3;
temp=temp&
0xf0;
while(temp!
=0xf0)
{
delay(5);
temp=P3;
temp=temp&
while(temp!
=0xf0)//稳手扫描
{
temp=P3;
TR0=1;
//开中断
switch(temp)
{
case0xe7:
num=1;
break;
case0xd7:
num=2;
case0xb7:
num=3;
case0x77:
num=10;
}
=0xf0)//起手扫描
temp=P3;
temp=temp&
TR0=0;
}
}
这部分需要注意,为了保证按键按下后没有多加或少加的情况,要加上稳手和起手检测。
4.3数码管显示模块
voiddisplay1(uintc,uintd,uinte,uintf)//xianshi
P2=tablewei[0];
//位选表
P1=tableduan[c];
//段选表
delay(5);
//延时
P2=tablewei[1];
P1=tableduan[d];
delay(5);
P2=tablewei[2];
P1=tableduan[e];
P2=tablewei[3];
P1=tableduan[f];
这里我写了四个显示模块,程序大致相同,只是用在不同地方,做了一些修改。
比如上面这个程序,是输入与table表中对应的数字,在数码管上显示对应的符号。
voiddisplay(uintnumb)
intqian,bai,shi,ge;
qian=numb/1000;
//对给出的数字进行运算
bai=numb/100%10;
shi=numb%100/10;
ge=numb%10;
s=qian;
x=bai;
y=shi;
z=ge;
P2=tablewei[0];
//位选
P1=tableduan[qian];
//段选
delay(3);
P2=tablewei[1];
P1=tableduan[bai];
delay(3);
P2=tablewei[2];
P1=tableduan[shi];
P2=tablewei[3];
P1=tableduan[ge];
而这个则放在主程序while循环下,对每次循环中给出的数值进行运算,然后显示。
voiddisplay3(uintc,uintd,uinte,uintf),与voiddisplay1一样,只不过因为中断需要一个显示模块,而又怕用模块时与其他程序冲突,所以又加了一个。
voiddisplay2只是多加了一个延时。
4.4软件延时模块
voiddelay(uintz)
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
一个循环约一毫秒
4.5中断定时
voidexter0()interrupt1
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
display3(s,x,y,z);
第五章系统调试
5.1硬件连接
键盘P13^1~8分别与芯片的P3^0~7相连,数码管的P17^1~8与芯片的P1^0~7相连,P16^1~4与芯片P2^0~3相连,蜂鸣器P8口与单片机的P2^4相连。
5.2下载调试
将程序通过烧写器下载到单片机上,调试各项功能。
按下键盘,验证程序的各项功能是否实现,数码管是否显示正常,蜂鸣器是否正常响应。
如果出现问题,先检查硬件石油有问题,如果排除硬件问题,则从编写软件中改进后再下载到单片机中进行验证。
这里有值得注意的两点:
1.调试时如果发现键盘按键顺序错乱,可注意参考键盘的电路图来编写键盘扫描程序。
2.本实验板上的是低电平有效,因此编程序,下载时要注意调整程序。
第六章结论分析与体会
这个设计的难点并不在下一个,复位,清零的功能,而在显示上面。
怎么样能在按键的时候使屏幕不闪烁,并且显示同样的值,还有怎么能让声音不影响屏幕的显示,是这个设计的关键。
在这里我用了在键盘扫描的循环中加入显示一起循环来使按键时不闪烁,同时在中断中加入蜂鸣器电平高低来发出声音。
这个程序还可以加入记忆和语音播报,但难度会高很多,以后可以尝试加入。
还有如果用液晶显示,可能会简单一些,也可试试。
课程设计需要很大的耐心,尤其是遇到困难的时候,这也是对我们的考验。
在设计过程中,我们遇到问题不是感到急躁,而是耐心地寻找解决的办法,与老师、同学进行交流讨论,寻求最佳的解决办法。
总之,这次单片机课程设计,让我了解了单片机的结构,功能,还有单片机C语言的编写。
通过自己编写程序并硬件实现,使我对单片机产生了兴趣,在以后我还会做更多的单片机方面的设计。
参考文献
(1)李朝青.《单片机原理及接口技术》.北京航空航天大学出版社
(2)胡汉才.《单片机原理及其接口技术》.清华大学出版社
(3)丁明亮、唐前辉.《51单片机应用设计与仿真》.北京航空航天大学出版社
(4)王燕.《单片机原理与应用》.北京航空航天大学出版社
(5)张靖武.《单片机系统的Protues设计与仿真》.电子工业大学出版社
(6)夏路易.《电路原理图与电路板设计教程》.北京希望电子出版社
(7)周立功.《增强型80C51单片机速成与实践》.北京航空航天大学出版社
附录:
#include<
reg52.h>
#defineuintunsignedint
#defineucharunsignedchar
uintnum,temp,shu=0,num1,num2,num3,num4,jiyi,t=1,s,x,y,z;
sbitd=P2^4;
charcodetableduan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,
0x83,0xc6,0xa1,0x86,0x8e,0xf7,0x88,0x89,0xff,0x7f};
/*分别是0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,_,R,H,全暗,点*/
charcodetablewei[]={0x07,0x0b,0x0d,0x0e};
charcodetablewei1[]={0x17,0x0b,0x1d,0x0e};
voiddelay(uintz);
voiddisplay(uintnumb);
ucharkeyscan();
voiddisplay1(uintc,uintd,uinte,uintf);
voiddisplay2(uintc,uintd,uinte,uintf);
voiddisplay3(uintc,uintd,uinte,uintf);
switch(keyscan())
//显示SR__
s=qian,x=bai,y=shi,z=ge;
ucharkeyscan()//jianpansaomiao
num=17;