基于mcs51单片机的多功能秒表设计《微机原理与应用》课程设计报告.docx
- 文档编号:29748107
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:42
- 大小:340.21KB
基于mcs51单片机的多功能秒表设计《微机原理与应用》课程设计报告.docx
《基于mcs51单片机的多功能秒表设计《微机原理与应用》课程设计报告.docx》由会员分享,可在线阅读,更多相关《基于mcs51单片机的多功能秒表设计《微机原理与应用》课程设计报告.docx(42页珍藏版)》请在冰豆网上搜索。
基于mcs51单片机的多功能秒表设计《微机原理与应用》课程设计报告
《微机原理与应用》课程设计
题目:
基于MCS51单片机的多功能秒表设计
学院:
信息与电气工程学院
专业年级:
电气工程2012级1班
学号:
********
学生姓名:
***
指导教师:
***
设计时间:
2014年11月15日~2014年12月20日
课程设计内容:
1、完成就《基于MCS51单片机的多功能秒表设计》的软硬件设计和调试。
2、完成课程设计报告的撰写。
3、课程设计说明书要求:
摘要、设计要求、系统结构、原理设计、各个模块的设计与实现、软件设计、调试过程、收获、体会及总结、参考文献、电路图和源程序。
说明书使用A4打印纸计算机打印或手写,用Protel等绘图软件绘制电子线路图纸
基本功能实现:
1、设计多功能秒表,以百分之一秒的单位计时,并在数码管上显示计时时间;
2、设置【开始键】【停止键】【存储键】【回放键】,上电后数码管显示P,以示准备计时,按开始键启动计时;
3、按存储键存储按键时刻的时间,允许一次启动最多按20次存储键;
4、按停止键结束计时,显示最终的计时时间;
5、按回放键每按一次依次显示存储序号和存储时间,最后一个存储时间回放结束后,再显示最终的计时时间,如此循环显示;
扩展功能与创新
1、设置【倒计时键】,按下倒计时键,能够利用矩阵键盘手动设置初值,然后启动倒计时,直到计时为零,蜂鸣器发声,数码管闪烁;
指导教师签名:
年月日
系主任签名:
年月日
基于MCS51单片机的多功能秒表设计
摘要
本设计是设计一个单片机控制的多功能秒表系统。
近年来随着科技的飞速发展,单片机的应用正在不断地走向深入,同时带动着传统控制检测日新月异的更新。
在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,仅单片机方面的知识是不够的,还要根据具体的硬件结构,以及针对具体的应用对象的软件结合,加以完善。
秒表的出现,解决了传统的由于人为因素造成的误差和不公平性。
本设计的多功能秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及矩阵按键来设计计时器。
将软、硬件有机地结合起来,使得系统能够正确地进行计数,并且结合相应的显示驱动程序,使数码管能够正确地显示时间、存储时间、暂停和倒计时。
我设计的秒表可以同时记录二十个相对独立的时间,通过回放键来查看这二十个不同的计时值,另外还能够设置初值进行倒计时,具有秒表该有的绝大部分功能,可谓功能强大。
其中软件系统采用c51语言编写程序,包括显示程序,存储程序,回放程序,定时器中断,延时程序,按键消抖程序等,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
关键字:
单片机;多功能秒表;PROTEUS
1.绪论
1.1设计目的
1.2设计要求
1.3设计意义
2.系统方案比较及硬件设计
2.1系统总体方案
2.2硬件设计
2.2.189C51单片机
2.2.2晶体振荡电路
2.2.3复位电路
2.2.4电源电路
2.2.5矩阵按键电路
2.2.6显示与蜂鸣器电路
2.2.7硬件电路图
3.软件设计
3.1设计特点
3.2设计思路及程序流程图
3.2.1系统主程序
3.2.2其他子程序定时器初始化程序
4.系统调试
4.1硬件调试
4.2软件调试
5.课程设计体会
参考文献
附录
附件1:
元器件清单
附件2:
完整程序清单
附件3:
电路原理图
附件4:
PCB板电路
附件5:
操作说明书
1.绪论
1.1设计目的
设计一个单片机控制的多功能秒表系统。
利用单片机的定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及矩阵按键来设计秒表。
将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时具有开始/暂停,存储记录,回放计时,清零,设置初值倒计时等功能。
1.2设计要求
(1)设计多功能秒表,以百分之一秒的单位计时,并在数码管上显示计时时间;
(2)上电后数码管显示P,以示准备计时,按开始键启动计时;
(3)key1:
启动和停止。
停止时按键启动计时,启动时按键停止计时。
再按,则在原计时值基础上继续计时;
(4)key2:
存储和回放。
当启动时,按键为存储;当停止时,按键为回放,且能将存储值循环回放;按回放键每按一次依次显示存储序号和存储时间,最后一个存储时间回放结束后,再显示最终的计时时间,如此循环显示;
(5)key3:
清零。
清除存储值和计时值,回到初始状态,显示P;
(6)key4:
倒计时键。
能够利用矩阵键盘手动设置初值,然后启动倒计时,直到计时为零,蜂鸣器发声,数码管闪烁,最后显示00:
00:
00。
1.3设计意义
(1)通过本次课程设计可以使我们进一步熟悉和掌握单片机内部结构和工作原理,了解单片机应用系统设计的基本步骤和方法。
(2)通过利用AT89C51单片机,理解单片机在自动化仪表中的作用以及掌握单片机的编程方法。
(3)通过设计一个简单的实际应用输入及显示模拟系统,掌握单片机仿真软件PROTEUS的使用方法。
(4)该实验通过单片机的定时器/计数器定时和计数原理,设计简单的计时器系统,拥有正确的计时、暂停、清零、倒计时功能,并能同时记录多个相对独立的时间利用回放按钮查看多个不同的计时值,该种秒表在现实生活中应用广泛,具有现实意义。
2.系统方案比较及硬件设计
2.1系统总体方案
方案一:
采用数字逻辑芯片
本系统有功能设置、数据装入、定时、显示、控制多个功能模块。
各个状态保持或转移的条件依赖于键盘控制信号。
由于键盘控制信号繁多,系统的逻辑状态以及相互转移更是复杂,用纯粹的数字电路或小规模的可编程逻辑电路实现该系统有一定的困难,需要用中大规模的可编程逻辑电路。
这样,系统的成本就会急剧上升(相对于方案二)。
因此,本设计并未采用这种方案。
方案二:
采用MCU 内部定时器AT89C51内部含有2个定时器,可以利用一个定时器计时与一个定时器倒计时。
再结合矩阵键盘控制,方便采集信号,而且结合编程,易于实现。
由于方案二具有较好的灵活性、较少的电路器件和较高的性价比,而且通过精确的软件补偿使精度完全可以满足控制需要,所以我们选择该方案完成设计。
本系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合硬件电路如电源电路,晶振电路,复位电路,显示电路,以及一些矩阵按键电路等来设计计时器,将软、硬件有机地结合起来。
其中软件系统采用汇编语言编写程序,包括显示,计数,中断,延时,按键消抖程序等,并在编程软件中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。
系统电路原理框图如图1所示。
图1系统电路原理框图
2.2硬件设计
2.2.189C51单片机
MCS-51系列单片机是8位单片机产品,89C51是其中的典型代表,基本模块包括以下几个部分:
(1)CPU:
89C51的CPU是8位的,另外89C51内部有1个位处理器
(2)R0M:
4KB的片内程序存储器,存放开发调试完成的应用程序
(3)RAM:
256B的片内数据存储器,容量小,但作用大
(4)I/O口:
P0-P3,共4个口32条双向且可位寻址的I/O口线
(5)中断系统:
共5个中断源,3个内部中断,2个外部中断
(6)定时器/计数器:
2个16位的可编程定时器/计数器
(7)通用串行口:
全双工通用异步接收器/发送器
(8)振荡器:
89C51的外接晶振与内部时钟振荡器为CPU提供时钟信号
(9)总线控制:
89C51对外提供若干控制总线,便于系统扩展
89C51的引脚图如下:
图289C51单片机引脚图
图3晶体振荡电路图4复位电路
2.2.2晶体振荡电路(如图3所示)
89C51芯片内部有一个高增益反相放大器,用于构成振荡器。
引线XTAL1和XTAL2分别为反向放大器的输入和输出,两端跨接石英晶体及两个电容就可构成稳定的自激振荡器。
这里,我们选用51单片机12MHZ的内部振荡方式,电容器C1,C2起稳定振荡频率,并对振荡频率有微调作用,C1和C2可在20-100PF之间取值,这里取33PF。
2.2.3复位电路(如图4所示)
采用上电加按键复位电路,上电后,由于电容充电,使RST持续一段高电平时间。
当单片机已在运行之中时,按下复位键也能使RST持续一段时间的高电平,从而实现上电加按键复位的操作。
2.2.4电源电路
用于这里直接利用普中科技开发板进行硬件设计,而且电源在这里也不是我们应该重点考虑的部分,因此我们可以选择用蓄电池供电,或者采用USB线接+5V电源进行供电。
在这里我选择后者,方便易用。
2.2.5矩阵按键电路(如图5所示)
在矩阵按键电路中,我们可以在I/O口上直接接按键,或者通过I/O口设计一个键盘,然后通过键盘扫描程序判断是否有键按下等。
键盘扫描电路节省I/O口,但编程有些复杂,将矩阵键盘按图中所示与89C51的P1口相连。
在这里,我采用行扫描法编程读取键值,然后执行相应的操作,我们将按键S0~S9用于倒计时时候对秒表赋初值,按下则输入相应的键值,按键S10和是S11暂时留着备用,按键S12用于计时启动和停止,S13用于计时值存储和回放,S14用于秒表清零(相当于单片机手动复位),S15用于选择倒计时功能和启动倒计时。
也就是说,S12~S15四个按键都具有双重功能,但不会冲突,因为有前提条件,例如,S12启动和停止键,停止时按键启动计时,启动时按键停止计时。
再按,则在原计时值基础上继续计时;S12存储和回放键。
当启动时,按键为存储;当停止时,按键为回放。
这样可以减少所使用的按键,而且操作方便,但是这对程序的编写要求就相应的提高了。
对于按键的设计,采用了软件延时消抖的程序,使系统的性能得到进一步的提升。
当按键被按下时,相应的引脚被拉低,经扫描后,获得键值,并执行键功能程序,因此按下不同的按键,将执行不同的功能程序。
图5矩阵按键电路
2.2.6显示与蜂鸣器电路(如图6所示)
方案一:
使用数码管显示
该方案控制最简单,根据设计要求显示格式XXXXXXXX。
可以准确的显示计时时间,又由于数码管简单便宜且满足设计要求,而且成本较低,所以选着数码管显示比较合理。
方案二:
使用LCD12864液晶显示
点阵液晶可以显示多种字符及图形,拥有友好的人机界面及强大的显示功能。
特别适用于智能控制的可编程人性化显示。
但是比较复杂。
使用不方便。
增加了难度。
比较方案一和二,我这里选择采用的是数码管显示电路。
用八个共阴极LED数码管显示,LED数码管内部有7个条形发光二极管和1个小圆点发光二极管组成,根据各管的亮暗组合成字符。
在用数码管显示时,我们有静态和动态两种选择,静态显示程序简单,显示稳定,但是占用端口比较多;动态显示所使用的端口比较少,可以节省单片机的I/O口。
在设计中,我们采用LED动态显示,用P0口驱动显示。
由于P0口的输出级是开漏电路,用它驱动时需要外接上拉电阻才能输出高电平。
秒表为计时和倒计时的时候,显示格式为XX-XX-XX,前两位为分钟,中间两位为秒,后面两位为10ms,加上中间两根横线刚好能在八段数码管中显示;当为回放显示存储数据时,由于需要显示至多二十组数据,因此需要两位数码管显示存储次数,如果还按照刚才的显示方式则数码管不够用。
因此为了方便观察,我采用的显示格式为XX.XX.XX.XX,前面两位为存储次数,中间每两位用1个小圆点发光二极管显示,便于区分。
由于采用动态显示,我选用74LS138译码器作为共阴数码管的位选译码输入。
图6数码管显示电路
74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式,其工作原理如下:
当一个选通端(S1)为高电平,另两个选通端(
)和
)为低电平时,可将地址端(A2、A1、A0)的二进制编码在一个对应的输出端以低电平译出。
因此,只要将AT89C51的P2.4,P2.3,P2.2口与74LS138的A2、A1、A0口相连,即可以进行位选控制。
其管脚图如图7,真值表如图8所示。
图774LS138管脚图图83线-8线译码器74LS138的功能表
蜂鸣器电路(如图9)
倒计时结束后,蜂鸣器发声,片刻后停止,利用AT89C51的P2.5口控制蜂鸣器发声。
图9蜂鸣器电路
2.2.7硬件电路图(如图10所示)
图10硬件电路图
3.软件设计
3.1设计特点
在软件设计中,一般采用模块化的程序设计方法,它具有明显的优点。
把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。
应用系统的程序由包含多个模块的主程序和各种子程序组成。
各程序模块都要完成一个明确的任务,实现某个具体的功能,如:
计数、延时、和显示等,在具体需要时调用相应的模块即可。
功能描述:
用八位LED数码管显示时间。
十个初值输入键,一个"开始/暂停"键,一个“记录/回放”键,一个"复位"键,一个“倒计时”键,可同时记录20个相对独立的时间,查看20个不同的计时值。
这14个按键分别控制秒表的五个功能。
3.2设计思路及程序流程图
3.2.1系统主程序
设计思路:
在主程序中进行定时器初始化,键扫描程序,显示程序,根
据扫描到的键值进入相应的功能模块,执行相应的功能。
具体键值及对应功能如下表:
按键名(S0~S15)
键值(KeyValue)
对应子程序
实现功能
S0~S9
0~9
倒计时,设初值
S10~S11
S12
12
启动和停止
S13
13
存储/回放子程序
存储和回放计时
S14
14
清零(复位)
清零秒表
S15
15
倒计时子程序
倒计时功能
注:
1、表格中空白处为未使用;
2、S12键,启动和停止。
停止时按键启动计时,启动时按键停止计时。
再按,则在原计时值基础上继续计时;
3、S13键存储和回放。
当启动时,按键为存储;当停止时,按键为回放。
4、设置F0开始标志位;F1停止标志位;F2倒计时标志位;
主程序流程图如图11所示:
图11流程图
源程序如下:
voidmain()
{Timer0Configuration();//定时器初始化
DisplayData[0]=0X73;//上电后显示P
while
(1)
{
KeyDown();//键扫描
if((KeyValue==12)&&(F0==0))//开始
{F0=1;TR0=1;KeyValue=0;}
if((KeyValue==12)&&(F0==1))//停止
{TR0=0;F1=1;F0=0;KeyValue=0;}
if((KeyValue==13)&&(F0==1))//存储
{KeyValue=0;cuncu();}
if((KeyValue==13)&&(F0==0))//回放
{KeyValue=0;TR0=0;huifang();}
if(KeyValue==14){KeyValue=0;F0=0;F2=0;TR0=0;TR1=0;DisplayData[0]=0X73;//清除存储值和计时值,回到初始状态,显示P
ms_10=0,sec=0,min=0,t1=0,t11=0,KeyValue=0;
for(k=0;k<60;k++)aa[k]=0;
for(k=1;k<8;k++)
{DisplayData[k]=0x00;}
}
if((KeyValue==15)&&(F0==0)&&(F2==0)){daojis();}//倒计时
DigDisplay();
}
}
3.2.2其他子程序定时器初始化程序
(1)定时器初始化中断服务程序
运用两个计数定时器,均工作在方式一,通过TR0/TR1控制计时器工作。
计算初值:
由于晶振频率为12MHz,需要定时10ms
所以初值TH0=D8H,TL0=F0H;TH1=D8H,TL1=F0H。
源程序如下:
voidTimer0Configuration()//初始化
{
TMOD=0X11;//选择为定时器模式,均工作为方式1,仅用TR0,TR1打开启动。
TH0=0X0D8;//给定时器0赋初值,定时100ms
TL0=0X0F0;
TH1=0X0D8;//给定时器1赋初值,定时100ms
TL1=0X0F0;
ET0=1;//打开定时器0中断允许
ET1=1;//打开定时器1中断允许
EA=1;//打开总中断
}
中断服务程序见附录三
(2)键扫描子程序
矩阵键盘扫描原理
方法一:
逐行扫描:
我可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二:
行列扫描:
我可以通过高四位全部输出低电平,低四位输出高电平。
当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
这里采用方法二,源程序如下:
voidKeyDown(void)//键扫描子程序
{
unsignedinta;
GPIO_KEY=0x0f;
if(GPIO_KEY!
=0x0f)
{
Delay10ms
(1);
if(GPIO_KEY!
=0x0f)
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07):
KeyValue=0;break;
case(0X0b):
KeyValue=1;break;
case(0X0d):
KeyValue=2;break;
case(0X0e):
KeyValue=3;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70):
KeyValue=KeyValue;break;
case(0Xb0):
KeyValue=KeyValue+4;break;
case(0Xd0):
KeyValue=KeyValue+8;break;
case(0Xe0):
KeyValue=KeyValue+12;break;
}
while((a<50)&&(GPIO_KEY!
=0xf0))//检测按键松手检测
{
Delay10ms
(1);
a++;
}
a=0;
}
}
}
(3)显示子程序
这里采用动态显示,方便调用,源程序如下:
voidDigDisplay(void)//显示子程序
{
unsignedchari;
unsignedintj;
for(i=0;i<8;i++)
{
switch(i)//位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0;break;//显示第0位
case
(1):
LSA=1;LSB=0;LSC=0;break;//显示第1位
case
(2):
LSA=0;LSB=1;LSC=0;break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0;break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1;break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1;break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1;break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1;break;//显示第7位
}
GPIO_DIG=DisplayData[i];//发送段码
j=50;//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
(4)存储子程序
当存储/回放键按下,即keyvalue=13,且定时器0为启动状态时,对当前时间进行存储,设置t1为计时次数。
源程序如下:
voidcuncu()//存储程序
{
t1++;//t1为计时次数
a=3*(t1-1);//修改1:
原来存储指针计算错误,添加a=3*(t1-1)指针计算
if(t1<=20)
{
aa[a]=min;delay(20);
a++;aa[a]=sec;delay(20);
a++;aa[a]=ms_10;delay(20);
t11=t1;}
}
(5)回放子程序
当存储/回放键按下,即keyvalue=13,且定时器0为关闭状态时,对当前存储时间进行回放,从最后一次会放至第一次,然后再循环回放,源程序如下:
voidhuifang()//回放子程序
{if(t1==0)t1=t11;
if(t1>0){b=3*(t1-1);
DisplayData[7]=zxma[t1/10];//数码管7、6显示次数
DisplayData[6]=zxma[t1%10]+128;
DisplayData[5]=zxma[aa[b]/10];
DisplayData[4]=zxma[aa[b]%10]+128;//数码管5、4显示分钟
b++;
DisplayData[3]=zxma[aa[b]/10];//数码管3、2显示秒
DisplayData[2]=zxma[aa[b]%10]+128;
b++;
DisplayData[1]=zxma[aa[b]/10];//数码管1、0显示10ms
DisplayData[0]=zxma[aa[b]%10];
t1--;
}
DigDisplay();
}
(6)倒计时子程序
倒计时程序是软件设计的一大难点,也是我新拓展的功能,首先要解决如何用按键赋倒计时初值的问题,其次再实现倒计时也比计时麻烦一些。
我编写的程序相对比较繁琐,也许有待进一步精简完善。
设置xian()子程序方便调用,源程序如下:
voiddaojis()
{ms_10=0,sec=0,min=0,m1=0,m0=0,s1=0,s0=0;
while
(1){KeyDown();
if(KeyValue<6){m1=KeyValue;Key
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机原理与应用 基于 mcs51 单片机 多功能 秒表 设计 微机 原理 应用 课程设计 报告