基于51单片机秒表的程序的设计1Word文档格式.docx
- 文档编号:19073805
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:9
- 大小:40.15KB
基于51单片机秒表的程序的设计1Word文档格式.docx
《基于51单片机秒表的程序的设计1Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机秒表的程序的设计1Word文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
按照上述思路可编制源程序如下:
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工作方式字
MOVXDPTR,A;
设置PA、PB口输出,PC口输入
MOV20H,#00H;
60秒计数单元置初值
MOV21H,#14H;
50ms计数单元置初值
MOVSP,#3FH;
堆栈指针置初值
MOVR2,#08H;
LED待显示位数送R2
MOVR0,#30H;
显示缓冲区首址送R0
STAR:
MOVR0,#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
列扫描字送PA口
INCDPTR;
指向PC口
INCDPTR
MOVXA,DPTR;
读取行扫描值
ACC.0,L1;
第0行无键按下,转查第1行
MOVA,#00H;
第0行有键按下,行首键号送A
AJMPLK;
转求键号
L1:
ACC.1,L2;
第1行无键按下,转查第2行
MOVA,#08H;
第1行有键按下,行首键号送A
L2:
ACC.2,L3;
第2行无键按下,转查第3行
MOVA,#10H;
第2行有键按下,行首键号送A
L3:
ACC.3,NEXT;
第3行无键按下,转查下一列
MOVA,#18H;
第3行有键按下,行首键号送A
AJMPLK
LK:
ADDA,R4;
形成键码送A
PUSHACC;
键码入栈保护
K4:
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;
开中断
返回键盘查询状态
KE1:
CLREA;
关中断
CLRET0;
禁止定时器T0中断
CLRTR1;
关定时器T1
CLRTR0;
关定时器T0
KE2:
AJMPMAIN;
返回主程序进行初始化
――――――――――按键查询子程序――――――――――――――
KS:
MOVDPTR,#4401H;
置8155PA口地址
MOVA,#00H
全扫描字#00H送PA口
INCDPTR
读入PC口状态
CPLA;
变正逻辑,高电平表示有键按下
ANLA,#0FH;
屏蔽高4位
RET;
返回,A≠0表示有键按下
―――――――――LED动态显示子程序―――――――――――――
DISP:
A入栈保护
SETBRS0;
保护第0组工作寄存器,启用第1组工作寄存器
MOVR2,#08H
;
MOVR1,#00H;
设定显示时间
MOVR3,#7FH;
选中最右端LED
MOVR0,#30H;
MOVA,R0;
秒显示个位送A
DISP1:
MOVDPTR,#TAB;
指向字形表首址
MOVCA,A+DPTR;
查表取得字形码
MOVDPTR,#4402H;
指向8155PB口(段码口)
字形码送PB口
MOVA,R3;
取位选字
指向8155PA口(位选口)
位码送PA口
DJNZR1,$;
延时0.5ms
RRA;
位选字移位
移位后的位选字送R3
INCR0;
指向下一位缓冲区地址
缓冲区数据送A
DJNZR2,DISP1;
未扫描完,继续循环
CLRRS0;
恢复第0组工作寄存器
A弹栈,恢复现场
RET
TAB:
DB3FH,06H,5BH,4FH,66H;
共阴极LED字形表
DB6DH,7DH,07H,7FH,6FH
――――――――――定时器中断服务程序―――――――――――――
CONT:
PUSHACC;
保护现场
MOVTH0,#3CH;
定时器T1重置初值
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
MOV30H,A;
秒表个位待显示数据送显示缓冲区
MOVA,20H
SWAPA;
60秒计数单元高、低4位数据互换
MOV31H,A;
秒表十位待显示数据送显示缓冲区
CONT2:
MOVA,#00H
AJMPCONT3
REN1:
恢复现场
中断返回
END
3.总结与分析
(1)实验采用七段码LED设计(数码管),显示直观;
采用定时器中断,计时更准确;
功能齐全,可随时启动、停止、清零,后者智能化程度更高。
(2)设计、调试大型程序时,需先根据要求划分模块,优化结构;
再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;
再根据各模块性质和功能将各模块细化,设计出程序流程图;
最后才根据各模块流程图编制具体程序。
调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。
本例子将整个程序划分为键盘程序,动态显示程序,秒计时程序三大模块,根据各自的特点确定键盘程序为主程序,动态显示程序为子程序,秒计时程序为定时器中断服务程序。
主程序又细分为初始化程序,键盘查询程序,键盘扫描程序,键盘处理程序四大部分。
三大模块之间的关系是:
键盘程序在无键按下时,不断调用动态显示子程序;
在有键按下时,先调用动态显示子程序消抖,再进入键盘处理程序,控制中断服务程序的运行;
处理完毕后,再不断调用动态显示子程序。
经上述处理后,三大模块运行协调一致,既保持了动态显示的稳定性,又保持了键盘的可靠性,还保持了秒计时的准确性,较好地实现了全部功能。
(3)本例子只用到8位LED显示中的两位,只用到4×
4键盘16个按键中的3个,因此,其功能还有较大的扩展空间。
只要将上述程序稍加改动即可实现秒、分、时、日显示,并可作全方位修改的实时时钟。
如增加LED显示位数或将显示改为LCD显示模块,可实现年、月、周、日、时、分、秒显示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 秒表 程序 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)