当前位置:文档之家› 基于51单片机秒表的程序设计[1]

基于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做50 ms计数单元,每20次为一个循环,计满20次,60秒计数单元(20H)计数1次。

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

按照上述思路可编制源程序如下:ORG 0000HAJMP M AINORG 000BHAJMP CONT;主程序;――――――――――初始化程序―――――――――――MAIN:MOV TMOD,#61H ;置T0方式1定时,T1方式2计数MOV TH0,#3CH ;T0置初值MOV TL0,#0B0HMOV TH1,#0C4H ;T1置初值MOV TL1,#0C4HMOV DPTR,#4400H ;8155控制口地址送DPTRMOV A,#43H ;设置8155工作方式字MOVX @DPTR,A ;设置PA、PB口输出,PC口输入MOV 20H,#00H ;60秒计数单元置初值MOV 21H,#14H ;50ms计数单元置初值MOV SP,#3FH ;堆栈指针置初值MOV R2,#08H ;LED待显示位数送R2MOV R0,#30H ;显示缓冲区首址送R0STAR:MOV @R0,#00H ;显示缓冲区清零INC R0DJNZ R2,STARCLR A ;累加器清零;―――――――――――键盘查询程序――――――――――KEY:ACALL KS ;调按键查询子程序判是否有键按下JNZ K1 ;有键按下转移ACALL DISP ;无键按下,调显示子程序延时AJMP KEY ;继续查询按键;―――――――――――键盘扫描程序――――――――――K1:ACALL DISP ;键盘去抖延时ACALL DISPACALL KS ;再次判别是否有键按下JNZ K2 ;有键按下转移AJMP KEY ;无按键,误读,继续查询按键K2: MOV R3,#0FEH ;首列扫描字送R3MOV R4,#00H ;首列号送R4K3:MOV DPTR,#4401H ;PA口地址送DPTR,开始列扫描MOV A,R3MOVX @DPTR,A ;列扫描字送PA口INC DPTR ;指向PC口INC DPTRMOVX A,@DPTR ;读取行扫描值JB ACC.0,L1 ;第0行无键按下,转查第1行MOV A,#00H ;第0行有键按下,行首键号送AAJMP LK ;转求键号L1:JB ACC.1,L2 ;第1行无键按下,转查第2行MOV A,#08H ;第1行有键按下,行首键号送AAJMP LK ;转求键号L2:JB ACC.2,L3 ;第2行无键按下,转查第3行MOV A,#10H ;第2行有键按下,行首键号送AAJMP LK ;转求键号L3:JB ACC.3,NEXT ;第3行无键按下,转查下一列MOV A,#18H ;第3行有键按下,行首键号送A AJMP L KLK:ADD A,R4 ;形成键码送APUSH ACC ;键码入栈保护K4:ACALL DISPACALL KS ;等待键释放JNZ K4 ;未释放,等待POP ACC ;键释放,弹栈送AAJMP PR ;转键盘处理程序NEXT:INC R4 ;修改列号MOV A,R3JNB ACC.3,KEY ;4列扫描完返回按键查询状态RL A ;未扫描完,改为下列扫描字MOV R3,A ;扫描字暂存R3AJMP K3 ;转列扫描程序;―――――――――――键盘处理程序―――――――――――――――PR:CJNE A,#00H,PR01 ;不是KE0键码,转KE1键AJMP KE0 ;转KE0键处理程序PR01:CJNE A,#01H,PR02 ;不是KE1键码,转KE2键AJMP KE1 ;转KE1键处理程序PR02:CJNE A,#02H,PR03 ;不是KE2键码,返回按键查询AJMP KE2 ;转KE2键处理程序PR03:AJMP KEYKE0:SETB TR0 ;启动定时器T0SETB TR1 ;启动定时器T1SETB ET0 ;允许定时器T0中断SETB EA ;开中断AJMP KEY ;返回键盘查询状态KE1:CLR EA ;关中断CLR ET0 ;禁止定时器T0中断CLR TR1 ;关定时器T1CLR TR0 ;关定时器T0AJMP K EYKE2:CLR EA ;关中断AJMP MAIN ;返回主程序进行初始化;――――――――――按键查询子程序―――――――――――――― KS:MOV DPTR,#4401H ;置8155PA口地址MOV A,#00HMOVX @DPTR,A ;全扫描字#00H送PA口INC DPTR ;指向PC口INC DPTRMOVX A,@DPTR ;读入PC口状态CPL A ;变正逻辑,高电平表示有键按下ANL A,#0FH ;屏蔽高4位RET ;返回,A≠0表示有键按下;―――――――――LED动态显示子程序―――――――――――――DISP:PUSH ACC ;A入栈保护SETB RS0 ;保护第0组工作寄存器,启用第1组工作寄存器MOV R2,#08H ;LED待显示位数送R2MOV R1,#00H ;设定显示时间MOV R3,#7FH ;选中最右端LEDMOV R0,#30H ;显示缓冲区首址送R0MOV A,@R0 ;秒显示个位送ADISP1:MOV DPTR,#TAB ;指向字形表首址MOVC A,@A+DPTR ;查表取得字形码MOV DPTR,#4402H ;指向8155PB口(段码口)MOVX @DPTR,A ;字形码送PB口MOV A,R3 ;取位选字MOV DPTR,#4401H ;指向8155PA口(位选口)MOVX @DPTR,A ;位码送PA口DJNZ R1,$ ;延时0.5msDJNZ R1,$ ;延时0.5msRR A ;位选字移位MOV R3,A ;移位后的位选字送R3INC R0 ;指向下一位缓冲区地址MOV A,@R0 ;缓冲区数据送ADJNZ R2,DISP1 ;未扫描完,继续循环CLR RS0 ;恢复第0组工作寄存器POP ACC ;A弹栈,恢复现场RETTAB:DB 3FH,06H,5BH,4FH,66H ;共阴极LED字形表DB 6DH,7DH,07H,7FH,6FH;――――――――――定时器中断服务程序――――――――――――― CONT:PUSH ACC ;保护现场MOV TH0,#3CH ;定时器T1重置初值MOV TL0,#0B0HMOV A,20H ;秒计数器送AAJMP CONT1REN:AJMP REN1CONT1:DJNZ 21H,REN ;1秒定时未到,中断返回MOV 21H,#14H ;重置50ms计数初值CLR P3.5 ;软件产生定时器T1计数脉冲NOPNOPSETB P3.5INC A ;1秒计数值加1DA A ;换算为10进制计数JBC TF1,CONT2 ;60秒到,转清零CONT3:MOV 20H,A ;计数值送60秒计数单元20HANL A,#0FH ;屏蔽高4位MOV 30H,A ;秒表个位待显示数据送显示缓冲区MOV A,20HSWAP A ;60秒计数单元高、低4位数据互换ANL A,#0FH ;屏蔽高4位MOV 31H,A ;秒表十位待显示数据送显示缓冲区AJMP R EN1. CONT2:MOV A,#00HAJMP C ONT3REN1:POP ACC ;恢复现场RET ;中断返回END3.总结与分析(1)实验采用七段码LED设计(数码管),显示直观;采用定时器中断,计时更准确;功能齐全,可随时启动、停止、清零,后者智能化程度更高。

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

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

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

相关主题