基于单片机实现的电子跑表设计.docx
《基于单片机实现的电子跑表设计.docx》由会员分享,可在线阅读,更多相关《基于单片机实现的电子跑表设计.docx(23页珍藏版)》请在冰豆网上搜索。
![基于单片机实现的电子跑表设计.docx](https://file1.bdocx.com/fileroot1/2022-12/10/619683e9-034f-4448-a7b8-83ab71002401/619683e9-034f-4448-a7b8-83ab710024011.gif)
基于单片机实现的电子跑表设计
第1章绪论
1.1单片机简介
单片机称为单片机微型计算机。
从应用领域来看,单片机主要用来控制,所以又称为微控制器(MicrocontrollerUnit)或嵌入式控制器。
单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。
单片机还具有如下特点:
1.单片机的存储器ROM和RAM时严格区分的。
ROM称为程序存储器,只存放程序,固定常数,及数据表格。
RAM则为数据存储器,用作工作区及存放用户数据。
2.采用面向控制的指令系统。
为满足控制需要,单片机有更强的逻辑控制能力,特别是单片机具有很强的位处理能力。
3.单片机的I/O口通常时多功能的。
由于单片机芯片上引脚数目有限,为了解决实际引脚数和需要的信号线的矛盾,采用了引脚功能复用的方法,引脚处于何种功能,可由指令来设置或由机器状态来区分。
4.单片机的外部扩展能力很强。
在内部的各种功能部件不能满足应用的需求时,均可在外部进行扩展,与许多通用的微机接口芯片兼容,给应用系统设计带来了很大的方便。
1.289C51单片机介绍
VCC:
电源。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
图1.389C51单片机
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储,P2口输出地址的高八位。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
第2章系统总体方案设计
2.1课题设计内容及思路
2.1.1设计内容
根据课程设计要求,我们选择了MCS-51系列单片机中的89C51单片机为核心设计思路,做一个多功电子表。
它不仅要具有电子时钟的功能还要具有跑表的功能。
通过LED数码管显示出来,做时钟时在4位LED显示器上显示分、秒,做跑表时显示范围000.0秒~999.9秒。
当我们按下启动按钮时跑表开始计时,按下停止则停止计时,当按下复位按钮跑表回零。
2.1.2设计思路
1.计时单元由单片机内部的定时器/记数器来实现。
2.时间显示功能通过LED数码管动态扫描来实现。
利用专用键盘/显示器接口芯片8255A可实现对键盘/显示器的动态扫描,由于数码管要显示时钟,还要显示跑表,因此,我分别用31H、32H计时钟,用R5、R6计跑表,当要显示哪一个的时候,就把哪一个地址送到显示地址35H、36H中,达到跑表显示与时钟显示互不影响。
3.表的启动/复位/清零功能由软件来实现。
P1.0接启动键,P1.1接停止键,P1.2接清零键。
4.由于跑表和时钟的中断服务程序有冲突,我们就把跑表的中断服务程序写成另外的子程序了,这样就必须要引入标志位了,我们在此用42H标志位,用标志位来给跑表计数。
2.2系统总体设计方案
在单片机中,定时功能既可以由硬件(定时/记数器)实现,也可通过软件定时实现。
硬件定时是利用单片机内定时器定时,启动以后定时器可与CPU并行工作,不占用CPU时间,CPU有较高的工作效率。
采用硬件定时和软件定时并用的方式,即用T0出中断功能实现50ms定时,通过软件延时程序实现1s定时。
.定时器的有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。
根据设计要求和设计思路,硬件电路有两部分组成,即单片机按键电路,LED显示器电路,下图为系统电路设计流程图。
图2.2系统电路设计流程图
根据课程设计要求,我们决定计时单元由单片机内部的定时器/记数器89C51芯片来实现。
关于时间显示功能通过LED数码管动态扫描来实现。
利用专用键盘/显示器接口芯片8255A可实现对键盘/显示器的动态扫描,由于数码管要显示时钟,还要显示跑表,
另一方面由于跑表和时钟的中断服务程序有冲突,我们就把跑表的中断服务程序写成另外的子程序了,这样就必须要引入标志位了,我们在用
42H标志位,用标志位来给跑表计数。
第3章电子跑表的设计
3.1控制系统硬件设计
3.1.1单片机型号选择
课程设计要求使用89C51单片机,且经过大部分的资料查阅,我最终认定89C51是最理想的电子时钟开发芯片。
89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,而且它与MCS-51兼容。
3.1.2键盘电路设计
该设计用了一个键盘,该键盘可以实现小时分钟和秒钟的调节以及复位的功能。
直接按下小时分钟秒钟对应的按键并松开,则可以通过按键实现对应时间的累加,每按一次加一;而按下复位按键,电子时钟复位清零。
图3.1按键
3.1.3数码管显示原理
数码管是一种把多个LED显示段集成在一起的显示设备。
有两种类型,一种是共阳型,一种是共阴型。
共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。
共阴型就是把多个LED显示段的阴极接在一起,即为公共商。
阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。
通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段。
数码管显示方法可分为静态显示和动态显示两种。
静态显示就是数码管的8段输入及其公共端电平一直有效。
动态显示的原理是,各个数码管的相同段连接在一起,共同占用8位段引管线;每位数码管的阳极连在一起组成公共端。
利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。
图3.2数码管
3.1.474LS244芯片
74LS244为三态输出的八组缓冲器和总线驱动器,其主要电器特性的典型值如下:
引出端符号:
1A1~1A4,2A1~2A4输入端
/1G,/2G三态允许端(低电平有效)
1Y1~1Y4,2Y1~2Y4输出端
图3.3芯片
3.2控制系统软件设计
根据设计要求和设计思路,进行模块设计。
最后我们设计一共六个工作模块。
他们分别是8255A的初始化、程序模块、时钟记时程序模块、数制转换模块,显示模块,跑表工作模块。
3.2.1时钟计时程序模块的设计
60分钟与1000秒时间的产生。
选择定时器T0,用工作方式1,定时50ms,R7先置2,T0定时50ms中断一次,利用R7寄存器减1,当R7寄存器的值=0时,时间正好是0.1s,再利用R0寄存器计数,当R0=10时,时间刚好是1s,再利用R1寄存器计数60s,依次类推,累计60分钟的是时间值,需要用到以下几个寄存器:
R7:
累计0.1s时间寄存器。
T0每中断一次R7=R7-1,计数10次向30H进位,并将R7置2。
30H:
累计1s时间寄存器。
当R0=60s时,向31H进位,然后将30H清零。
31H:
累计60s时间寄存器。
当31H=60s时,当31H=60时,将30H、31H清零。
30H、31H用于时钟计时,以下R6、R5用于跑表计时。
R5:
累计10S时间寄存器。
当R5=100时,向R6进位,然后将R5清零。
R6:
累计1000S时间寄存器。
当R6=100时,将R6清零。
42H:
为标志寄存器。
42H=1时,跑表、时钟计数器都计数,42H=0时,仅时钟计数器计数。
3.2.2跑表模块的设计
1.启动跑表时,T1计时到0.1s时,置42H=1,则在时钟计数器工作的同时,跑表计数器也在工作,并将跑表计数器的值送到显示缓冲区显示。
以下为跑表计时程序:
WATCH:
CLRRS1
CJNER6,#0FFH,TP;跑表程序
MOVR6,#0H;清标志位
NCR4
CJNER4,#100,TP;判是否到10s
MOV41H,R4;送41H单元
MOVR4,#0H
INCR5
CJNER5,#100H,TP;判是否到1000s
MOV42H,R5
MOVR5,#0H
MOVR4,#OH
TP:
LCALLDIVID;调代码转换程序
MOVA,
LCALLDISPLAY;调显示程序
Y
Y
Y
图3.4跑表流程图
2.代码转换程序:
由于人们日常习惯使用十进制数,而计算机的键盘输入、输出以及显示常采用二进制编码的十进制(即BCD码)或ASCII码。
因此,在程序设计中经常要进行代码转换。
以下为代码转换程序:
DIVID:
PUSHACC
MOVA,41H
MOVB,#10
DIVAB
MOV51H,A;高位在51H
MOV50H,B;低位在50H
MOVA,42H
MOV53H,A
MOV52H,B
MOVA,43H
MOV55H,A
MOV54H,B
POPACC
RET
3.显示程序
DISLED:
;显示字符子程序
PUSHDPH;保存现场
PUSHDPL
PUSHACC
SETBRS1;选择3组工作寄存器
MOVA,#LEDWRO;置显示起始地址
ADDA,R4;加位置偏移量
MOVDPTR,#Z8545
MOVX@DPTR,A;设定显示位置
MOVDPTR,#LEDSEG
MOVA,R5
MOVDPTR,#D82555
MOVX@DPTR,A;显示数据
POPACC
3.3主程序设计
这个设计过程主要是围绕了MCS-51系列单片机中的89C51单片机为核心设计思路,制作一个符合要求的电子跑表。
首先我们设置定时器89C51初始值,采用硬件定时和软件定时并用的方式,即用T0出中断功能实现50ms定时,通过软件延时程序实现1s定时。
定时器的有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。
TMOD用于设置定时器/计数器的工作方式0~3,并确定用于定时还是用于计数。
TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止。
然后我们采用8255A芯片进行单片机与各种外围设备相连的接口电路这种方式进行相连。
这样既可实现对键盘/显示器的自动扫描,而且大节省CPU对键盘/显示器的操作时间,从而减轻CPU的负担,而且显示稳定,程序简单,不会出现误动作。
电子跑表的启动/复位/清零功能可以由软件来实现。
P1.0接启动键,P1.1接停止键,P1.2接复位键。
通过LED数码管显示出来,做时钟时在4位LED显示器上显示分、秒,做跑表时显示范围000.0秒~999.9秒。
当我们按下启动按钮时跑表开始计时,按下停止则停止计时,当按下复位按钮跑表回零。
最后由于跑表和时钟的中断服务程序有冲突,我们就把跑表的中断服务程序写成另外的子程序了,这样就必须要引入标志位了,我们在此用42H标志位,用标志位来给跑表计数。
下图为主程序总流程图:
主程序
图3.5总流程图
3.4PROTEUS仿真图
图3.6仿真图
3.5系统的安装调试说明
其操作过程为:
开始之前应把START和STOP、H开关全都拨到低电平位置,接通电源,开始运行,显示器显示000.0,把START置为高电平时,则开始计数;当STOP为高电平时,则跑表停止计数,并保留所停止时刻的时间不变。
若要继续计数,则把STOP置0;若要重新计数,则先把H置1,显示清零,再把STOP置1即可。
此设计产品一共给出用户3个开关(按钮式的开关)。
一个开关标示为时钟/跑表,另一个标示暂停,另一个标示跑表/时钟。
三个开关的启始位置是关的状态。
当给它通电时,它就做时钟使用,当我们按动暂停和跑表/时钟时,产品不动作。
只有当我们按动时钟转/跑表时。
产品才开始转为跑表。
这时的暂停和跑表/时钟。
才起作用。
当按下暂停时,跑表暂停读数,而按下跑表/时钟时,又转到时钟工作。
通过本次仿真,我感觉这个电子跑表的功能还比较的简单,还可以对其功能进行相应的拓展。
在仿真的过程中,遇到过种种的困难,程序上总是遇到一些的问题,例如:
数码管显示不全、复位键失灵等等问题,在wave6000上多次的对程序进行修改,在Proteus上不断的仿真后,终于实现了课题要求的内容!
课程设计总结与体会
一份耕耘,一份收获。
通过两周的单片机课程设计,使我对单片机理论知识有了进一步的认识和了解。
同时它也使我受益匪浅,它不仅让我们使课本上的知识在实际中得到了很好的运用,从而对课本上的知识有了更深刻的认识,更系统的了解。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前没有学到的知识,如:
PROTUES软件制图。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
另外,这次课程设计让我感到了团队合作的重要性。
还有在我们遇到困难时,周老师给予我们的建议与帮助。
最后衷心的感谢老师的教导。
参考文献
[1]谢自美.《电子线路设计·实验·测试》.武汉华中理工大学出版社,1992.5.
[2]何立民.《单片机应用系统设计》.北京航空航天大学出版社,1993.8.
[3]楼然笛.《单片机开发》.北京人民邮电出版社,1994.1.
[4]付家才.《单片机控制工程实践技术》.北京化学工业出版社2004.3.
[5]李光才.《单片机课程设计实例指导》.北京北京航空航天大学出版社2004.5.
[6]朱定华.《单片机原理及接口技术实验》.北京北方交通大学出版社2002.11.
[7]刘湘涛.江世明.《单片机原理与应用》.北京电子工业出版社,2006.2.
[8]余发山.《单片机原理机机及应用技术》.中国矿业大学出版社1998.3.
[9]张迎新.《单片机初级教程-单片机基础》.北京航空航天大学出版社2006.8.
[10]李广第.《单片机基础》.北京航空航天大学出版社1998.3.
[11]孙涵芳.《MCS-51系列单片机原理及应用》.北京航空航天大学出版社.1996.4.
附录
附录A系统原理图
附录B源程序清单
ORG0000H
LJMPSTART
ORG0003H
LJMPS5
ORG000BH
LJMPT00
ORG0013H
LJMPS6
ORG001BH
LJMPT11
ORG2000H
START:
MOVDPTR,#0CFA3H
MOVA,#89H
MOVX@DPTR,A
S1:
MOV30H,#0
MOV31H,#0
MOV32H,#0
MOV33H,#0
MOV34H,#0
MOV35H,#0
S2:
MOVR0,#14H
MOVTMOD,#11H
SETBEA
SETBTR0
SETBET0
SETBET1
LOOP:
CLRTR1
MOVA,#0DFH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,35H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0EFH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,34H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0F7H
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,33H
MOVDPTR,#DIRTAB1
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0FBH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,32H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0FDH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,31H
MOVDPTR,#DIRTAB1
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0FEH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,30H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
JNBP1.0,Z4
JNBP1.3,S3
JNBP1.2,S4
SJMPLOOP
Z4:
AJMPZ1;时钟暂停显示程序
S3:
CLRTR0
SETBIT0
SETBEX0
SETBIT1
SETBEX1
AJMPLOOP;时钟运行显示程序
S4:
SETBTR0
CLREX0
CLREX1
AJMPLOOP
S8:
AJMPKEY;时钟T0溢出入口程序
T00:
MOVTH0,#1EH
MOVTL0,#0CFH
DJNZR0,S8
MOVR0,#14H
INC35H
MOVA,#10
CJNEA,35H,KEY
MOVR0,#14H
MOV35H,#0
INC34H
MOVA,#6
CJNEA,34H,KEY
MOVR0,#14H
MOV35H,#0
MOV34H,#0
MOVR0,#14H
S5:
INC33H
MOVA,#10
CJNEA,33H,KEY
MOVR0,#14H
MOV35H,#0
MOV34H,#0
MOV33H,#0
INC32H
MOVA,#6
CJNEA,32H,KEY
MOVR0,#14H
MOV35H,#0
MOV34H,#0
MOV33H,#0
MOV32H,#0
S6:
INC31H
MOVA,#4
CJNEA,31H,L3
MOVA,#2
CJNEA,30H,L3
SJMPL4
L3:
MOVA,#10
CJNEA,31H,KEY
MOVR0,#14H
MOV35H,#0
MOV34H,#0
MOV33H,#0
MOV32H,#0
MOV31H,#0
INC30H
RETI
L4:
MOVR0,#14H
MOV35H,#0
MOV34H,#0
MOV33H,#0
MOV32H,#0
MOV31H,#0
MOV30H,#0
KEY:
RETI;跑表暂停及循环显示程序
Z1:
SETBTR0
CLREX0
CLREX1
MOV40H,#0
MOV41H,#0
MOV42H,#0
MOV43H,#0
MOV44H,#0
MOV45H,#0
LOOP1:
CLRTR1
MOVA,#0DFH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,45H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0EFH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,44H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0F7H
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,43H
MOVDPTR,#DIRTAB1
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0FBH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,42H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0FDH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,41H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#0CFA0H
MOVX@DPTR,A
ACALLD1MS
MOVA,#0FEH
MOVDPTR,#0CFA1H
MOVX@DPTR,A
MOVA,40H
MOVDPTR,#DIRTAB
MOVCA,@A+DPTR
MOVDPTR,#