基于51单片机秒表的程序设计1.docx

上传人:b****5 文档编号:6471279 上传时间:2023-01-06 格式:DOCX 页数:9 大小:107.81KB
下载 相关 举报
基于51单片机秒表的程序设计1.docx_第1页
第1页 / 共9页
基于51单片机秒表的程序设计1.docx_第2页
第2页 / 共9页
基于51单片机秒表的程序设计1.docx_第3页
第3页 / 共9页
基于51单片机秒表的程序设计1.docx_第4页
第4页 / 共9页
基于51单片机秒表的程序设计1.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

基于51单片机秒表的程序设计1.docx

《基于51单片机秒表的程序设计1.docx》由会员分享,可在线阅读,更多相关《基于51单片机秒表的程序设计1.docx(9页珍藏版)》请在冰豆网上搜索。

基于51单片机秒表的程序设计1.docx

基于51单片机秒表的程序设计1

基于51单片机秒表的程序设计 

1.设计目的:

(1)利用单片机定时器中断和定时器计数方式实现秒、分定时。

(2)通过LED显示程序的调整,熟悉8155与8051,8155与LED的接口技术,熟悉LED动态显示的控制过程。

(3)通过键盘程序的调整,熟悉8155与矩阵式键盘的接口技术,熟悉键盘扫描原理。

(4)通过阅读和调试简易秒表整体程序,学会如何编制含LED动态显示、键盘扫描和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。

2. 设计步骤与要求

(1)要求:

以8位LED右边2位显示秒,左边6位显示0,实现秒表计时显示。

以4×4矩阵键盘的KE0、KE1、KE2等3键分别实现启动、停止、清零等功能。

(2)方法:

用单片机定时器T0中断方式,实现1秒定时;利用单片机定时器1方式3计数,实现60秒计数。

用动态显示方式实现秒表计时显示,用键盘扫描方式取得KE0、KE1、KE2的键值,用键盘处理程序实现秒表的启动、停止、清零等功能。

(3)软件设计:

软件整体设计思路是以键盘扫描和键盘处理作为主程序,LED动态显示作为子程序。

二者间的联系是:

主程序查询有无按键,无按键时,调用二次LED动态显示子程序(约延时8ms)后再回到按键查询状态,不断循环;有按键时,LED动态显示子程序作为按键防抖延时被连续调用二次(约延时16ms),待按键处理程序执行完后,再回到按键查询状态,同时兼顾了按键扫描取值的准确性和LED动态显示的稳定性。

秒定时采用定时器T0中断方式进行,60秒计数由定时器1采用方式3完成,中断及计数的开启与关闭受控于按键处理程序。

由上述设计思路可设计出软件流程图如图1.1所示。

(5)程序编制:

编程时置KE0键为“启动”,置KE1键为“停止”,置KE2键为“清零”,因按键较少,在处理按键值时未采用散转指令“JMP”,而是采用条件转移指令“CJNE”,每条指令后紧跟着一条无条件跳转指令“AJMP”,转至相应的按键处理程序,如不是上述3个按键值则跳回按键查询状态。

8位LED显示的数据由显示缓冲区30H~37H单元中的数据决定,顺序是从左至右,动态显示时,每位显示持续时间为1ms,1ms延时由软件实现,8位显示约耗时8ms。

主程序、按键查询子程序采用第0组工作寄存器,显示子程序采用第1组工作寄存器。

1秒定时采用定时器T0方式1中断,每50ms中断一次,用21H做50ms计数单元,每20次为一个循环,计满20次,60秒计数单元(20H)计数1次。

60秒计数采用定时器T1方式2计数,计数脉冲采用软件置位、复位P3.5口的方法实现,用20H单元做60秒计数单元,如定时器T1溢出,则20H单元被清零,20H单元的数据采用十进制计数,该数据被拆成个位和十位两个数据后分别

送至显示缓冲区的30H、31H单元。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

按照上述思路可编制源程序如下:

                ORG               0000H

AJMPMAIN

ORG000BH

AJMPCONT

;;主程序

;;――――――――――初始化程序―――――――――――

MAIN:

MOVTMOD,#61H;;置T0方式1定时,T1方式2计数

MOVTH0,#3CH;;T0置初值

MOVTL0,#0B0H

MOVTH1,#0C4H;;T1置初值

MOVTL1,#0C4H

MOVDPTR,#4400H;;8155控制口地址送DPTR

MOVA,#43H;;设置8155工作方式字

MOVX@DPTR,A;;设置PA、PB口输出,PC口输入

MOV20H,#00H;;60秒计数单元置初值

MOV21H,#14H;;50ms计数单元置初值

MOVSP,#3FH;;堆栈指针置初值

MOVR2,#08H;;LED待显示位数送R2

MOVR0,#30H;;显示缓冲区首址送R0

STAR:

MOV@R0,#00H;;显示缓冲区清零

INCR0

DJNZR2,STAR

CLRA;;累加器清零

;;―――――――――――键盘查询程序――――――――――

 KEY:

ACALLKS;;调按键查询子程序判是否有键按下

JNZK1;;有键按下转移

ACALLDISP;;无键按下,调显示子程序延时

AJMPKEY;;继续查询按键

;;―――――――――――键盘扫描程序――――――――――

K1:

ACALLDISP;;键盘去抖延时

ACALLDISP

ACALLKS;;再次判别是否有键按下

JNZK2;;有键按下转移

AJMPKEY;;无按键,误读,继续查询按键

K2:

MOVR3,#0FEH;;首列扫描字送R3

MOVR4,#00H;;首列号送R4

K3:

MOVDPTR,#4401H;;PA口地址送DPTR,开始列扫描

MOVA,R3

MOVX@DPTR,A;;列扫描字送PA口

INCDPTR;;指向PC口

INCDPTR

MOVXA,@DPTR;;读取行扫描值

JBACC.0,L1;;第0行无键按下,转查第1行

MOVA,#00H;;第0行有键按下,行首键号送A

AJMPLK;;转求键号

L1:

JBACC.1,L2;;第1行无键按下,转查第2行

MOVA,#08H;;第1行有键按下,行首键号送A

AJMPLK;;转求键号

L2:

JBACC.2,L3;;第2行无键按下,转查第3行

MOVA,#10H;;第2行有键按下,行首键号送A

AJMPLK;;转求键号

L3:

JBACC.3,NEXT;;第3行无键按下,转查下一列

MOVA,#18H;;第3行有键按下,行首键号送A

AJMPLK

LK:

ADDA,R4;;形成键码送A

PUSHACC;;键码入栈保护

K4:

ACALLDISP

ACALLKS;;等待键释放

JNZK4;;未释放,等待

POPACC;;键释放,弹栈送A

AJMPPR;;转键盘处理程序

NEXT:

INCR4;;修改列号

MOVA,R3

JNBACC.3,KEY;;4列扫描完返回按键查询状态

RLA;;未扫描完,改为下列扫描字

MOVR3,A;;扫描字暂存R3

AJMPK3;;转列扫描程序

;;―――――――――――键盘处理程序―――――――――――――――

PR:

CJNEA,#00H,PR01;;不是KE0键码,转KE1键

AJMPKE0;;转KE0键处理程序

PR01:

CJNEA,#01H,PR02;;不是KE1键码,转KE2键

AJMPKE1;;转KE1键处理程序

PR02:

CJNEA,#02H,PR03;;不是KE2键码,返回按键查询

AJMPKE2;;转KE2键处理程序

PR03:

AJMPKEY

KE0:

SETBTR0;;启动定时器T0

SETBTR1;;启动定时器T1

SETBET0;;允许定时器T0中断

SETBEA;;开中断

AJMPKEY;;返回键盘查询状态

KE1:

CLREA;;关中断

CLRET0;;禁止定时器T0中断

CLRTR1;;关定时器T1

CLRTR0;;关定时器T0

AJMPKEY

KE2:

CLREA;;关中断

AJMPMAIN;;返回主程序进行初始化

;;――――――――――按键查询子程序――――――――――――――

KS:

MOVDPTR,#4401H;;置8155PA口地址

MOVA,#00H

MOVX@DPTR,A;;全扫描字#00H送PA口

INCDPTR;;指向PC口

INCDPTR

MOVXA,@DPTR;;读入PC口状态

CPLA;;变正逻辑,高电平表示有键按下

ANLA,#0FH;;屏蔽高4位

RET;;返回,A≠0表示有键按下

;;―――――――――LED动态显示子程序―――――――――――――

DISP:

PUSHACC;;A入栈保护

SETBRS0;;保护第0组工作寄存器,启用第1组工作寄存器

                    MOVR2,#08H       ;;LED待显示位数送R2

MOVR1,#00H;;设定显示时间

MOVR3,#7FH;;选中最右端LED

MOVR0,#30H;;显示缓冲区首址送R0

MOVA,@R0;;秒显示个位送A

DISP1:

MOVDPTR,#TAB;;指向字形表首址

MOVCA,@A+DPTR;;查表取得字形码

MOVDPTR,#4402H;;指向8155PB口(段码口)

MOVX@DPTR,A;;字形码送PB口

MOVA,R3;;取位选字

MOVDPTR,#4401H;;指向8155PA口(位选口)

MOVX@DPTR,A;;位码送PA口

DJNZR1,$;;延时0.5ms

DJNZR1,$;;延时0.5ms

RRA;;位选字移位

MOVR3,A;;移位后的位选字送R3

INCR0;;指向下一位缓冲区地址

MOVA,@R0;;缓冲区数据送A

DJNZR2,DISP1;;未扫描完,继续循环

CLRRS0;;恢复第0组工作寄存器

POPACC;;A弹栈,恢复现场

RET

TAB:

DB3FH,06H,5BH,4FH,66H;;共阴极LED字形表

DB6DH,7DH,07H,7FH,6FH

;;――――――――――定时器中断服务程序―――――――――――――

CONT:

PUSHACC;;保护现场

MOVTH0,#3CH;;定时器T1重置初值

MOVTL0,#0B0H

MOVA,20H;;秒计数器送A

AJMPCONT1

REN:

AJMPREN1

CONT1:

DJNZ21H,REN;;1秒定时未到,中断返回

MOV21H,#14H;;重置50ms计数初值

CLRP3.5;;软件产生定时器T1计数脉冲

NOP

NOP

SETBP3.5

INCA;;1秒计数值加1

DAA;;换算为10进制计数

JBCTF1,CONT2;;60秒到,转清零

CONT3:

MOV20H,A;;计数值送60秒计数单元20H

ANLA,#0FH;;屏蔽高4位

MOV30H,A;;秒表个位待显示数据送显示缓冲区

MOVA,20H

SWAPA;;60秒计数单元高、低4位数据互换

ANLA,#0FH;;屏蔽高4位

MOV31H,A;;秒表十位待显示数据送显示缓冲区

AJMPREN1

CONT2:

MOVA,#00H

AJMPCONT3

REN1:

POPACC;;恢复现场

RET;;中断返回

END

3.总结与分析

(1)实验采用七段码LED设计(数码管),显示直观;采用定时器中断,计时更准确;功能齐全,可随时启动、停止、清零,后者智能化程度更高。

(2)设计、调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。

调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。

本例子将整个程序划分为键盘程序,动态显示程序,秒计时程序三大模块,根据各自的特点确定键盘程序为主程序,动态显示程序为子程序,秒计时程序为定时器中断服务程序。

主程序又细分为初始化程序,键盘查询程序,键盘扫描程序,键盘处理程序四大部分。

三大模块之间的关系是:

键盘程序在无键按下时,不断调用动态显示子程序;在有键按下时,先调用动态显示子程序消抖,再进入键盘处理程序,控制中断服务程序的运行;处理完毕后,再不断调用动态显示子程序。

经上述处理后,三大模块运行协调一致,既保持了动态显示的稳定性,又保持了键盘的可靠性,还保持了秒计时的准确性,较好地实现了全部功能。

(3)本例子只用到8位LED显示中的两位,只用到4×4键盘16个按键中的3个,因此,其功能还有较大的扩展空间。

只要将上述程序稍加改动即可实现秒、分、时、日显示,并可作全方位修改的实时时钟。

如增加LED显示位数或将显示改为LCD显示模块,可实现年、月、周、日、时、分、秒显示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 家庭教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1