51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
基于51单片机秒表的程序设计
发布时间:2009/6/29  阅读次数:925  字体大小: 【】 【】【

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                                 0000H
                                       AJMP             MAIN
                                       ORG               000BH
                                       AJMP             CONT
                       ;主程序
                       ;――――――――――初始化程序―――――――――――
                       MAIN:               MOV             TMOD,#61H                     ;置T0方式1定时,T1方式2计数
                                                                     MOV             TH0,#3CH                                       ;T0置初值
                                                                     MOV             TL0,#0B0H
                                                                     MOV             TH1,#0C4H                                   ;T1置初值
                                                                     MOV             TL1,#0C4H                              
                                                                     MOV             DPTR,#4400H                    
                       ;8155控制口地址送DPTR
                                                                     MOV             A,#43H                                            
                       ;设置8155工作方式字
                                                                     MOVX             @DPTR,A                            
                       ;设置PA、PB口输出,PC口输入
                                                                     MOV             20H,#00H                                      
                       ;60秒计数单元置初值
                                                                     MOV             21H,#14H                                    
                       ;50ms计数单元置初值
                                                                     MOV             SP,#3FH                                        
                       ;堆栈指针置初值
                                                                     MOV             R2,#08H                                        
                       ;LED待显示位数送R2
                                                                     MOV             R0,#30H                                          
                       ;显示缓冲区首址送R0
                       STAR:               MOV             @R0,#00H                                   ;显示缓冲区清零
                                           INC               R0
                                                                     DJNZ             R2,STAR
                                                                     CLR               A                                                                  
                           ;累加器清零
                       ;―――――――――――键盘查询程序――――――――――
                           KEY:                     ACALL         KS                   ;调按键查询子程序判是否有键按下                          
                                                        
                               JNZ             K1                                                                       ;有键按下转移
                                                                     ACALL             DISP                                                    
                       ;无键按下,调显示子程序延时
                                                                     AJMP             KEY                                                          
                       ;继续查询按键
                       ;―――――――――――键盘扫描程序――――――――――
                       K1:                       ACALL         DISP                                                       ;键盘去抖延时
                                           ACALL     DISP
                                                                     ACALL     KS                                                              
                       ;再次判别是否有键按下
                                                                     JNZ               K2                                                                
                       ;有键按下转移
                               AJMP             KEY                                                 ;无按键,误读,继续查询按键
                         K2:                           MOV             R3,#0FEH                                   ;首列扫描字送R3
                                                                   MOV             R4,#00H                                         ;首列号送R4
                       K3:                       MOV             DPTR,#4401H                   ;PA口地址送DPTR,开始列扫描
                                                                     MOV             A,R3                                                
                                                                     MOVX             @DPTR,A                               ;列扫描字送PA口
                                                                     INC               DPTR                                                      
                       ;指向PC口
                                           INC               DPTR
                                                                     MOVX             A,@DPTR                             ;读取行扫描值
                                                                     JB                     ACC.0,L1                                        
                       ;第0行无键按下,转查第1行
                                                                     MOV             A,#00H                                          
                       ;第0行有键按下,行首键号送A
                                                                     AJMP             LK                                                              
                       ;转求键号
                       L1:                       JB                     ACC.1,L2                                        
                       ;第1行无键按下,转查第2行
                                                                     MOV             A,#08H                                          
                       ;第1行有键按下,行首键号送A
                                                                     AJMP             LK                                                              
                       ;转求键号
                         L2:                         JB                     ACC.2,L3                                        
                       ;第2行无键按下,转查第3行
                                                                     MOV             A,#10H                                          
                       ;第2行有键按下,行首键号送A
                                                                     AJMP             LK                                                              
                       ;转求键号
                       L3:                             JB                     ACC.3,NEXT                         ;第3行无键按下,转查下一列

                                                                     MOV             A,#18H                                            
                       ;第3行有键按下,行首键号送A
                                           AJMP             LK
                       LK:                       ADD             A,R4                                                 ;形成键码送A
                                                                     PUSH             ACC                                                      
                       ;键码入栈保护
                         K4:                       ACALL     DISP
                                                                     ACALL             KS                                                    
                       ;等待键释放
                                                                     JNZ               K4                                                              
                       ;未释放,等待
                                                                     POP               ACC                                                        
                       ;键释放,弹栈送A
                                                                     AJMP             PR                                                            
                       ;转键盘处理程序
                       NEXT:               INC               R4                                                                 ;修改列号
                                                                     MOV             A,R3
                                                                     JNB               ACC.3,KEY                            
                       ;4列扫描完返回按键查询状态
                                                                     RL                   A                                                                
                           ;未扫描完,改为下列扫描字
                                                                     MOV             R3,A                                                
                       ;扫描字暂存R3
                                                                     AJMP             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             KEY
                       KE0:                     SETB             TR0                                                         ;启动定时器T0
                                                                     SETB             TR1                                                        
                       ;启动定时器T1
                                                                     SETB             ET0                                                        
                       ;允许定时器T0中断
                                                                     SETB             EA                                                            
                       ;开中断
                                                                     AJMP             KEY                                            
                       ;返回键盘查询状态
                       KE1:                     CLR               EA                                                             ;关中断
                                                                     CLR               ET0                                                        
                       ;禁止定时器T0中断
                                                                     CLR               TR1                                                        
                       ;关定时器T1
                                                                     CLR               TR0                                                        
                       ;关定时器T0
                                           AJMP             KEY
                       KE2:                     CLR               EA                                                                 ;关中断
                                                                     AJMP             MAIN                                                  
                       ;返回主程序进行初始化
                       ;――――――――――按键查询子程序――――――――――――――
                         KS:                       MOV             DPTR,#4401H                     ;置8155PA口地址
                                                                       MOV             A,#00H                                          
                                                                     MOVX             @DPTR,A                              
                       ;全扫描字#00H送PA口
                                                                     INC               DPTR                                                      
                       ;指向PC口
                                           INC               DPTR
                                                                     MOVX             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待显示位数送R2
                                                                     MOV             R1,#00H                                       ;设定显示时间
                                                                     MOV             R3,#7FH                                      
                       ;选中最右端LED
                                                                     MOV             R0,#30H                                      
                       ;显示缓冲区首址送R0
                                                                     MOV             A,@R0                                           ;秒显示个位送A

                       DISP1:               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.5ms
                                                                     DJNZ             R1,$                                                  
                       ;延时0.5ms
                                                                     RR                   A                                                                
                           ;位选字移位
                                                                     MOV             R3,A                                                
                       ;移位后的位选字送R3
                                                                     INC               R0                                                                
                       ;指向下一位缓冲区地址
                                                                     MOV             A,@R0                                           ;缓冲区数据送A

                               DJNZ             R2,DISP1                                     ;未扫描完,继续循环
                                                                     CLR               RS0                                                            
                       ;恢复第0组工作寄存器
                                                                     POP               ACC                                                          
                       ;A弹栈,恢复现场
                                           RET
                       TAB:                   DB                   3FH,06H,5BH,4FH,66H                          
                       ;共阴极LED字形表
                                                                     DB                   6DH,7DH,07H,7FH,6FH
                       ;――――――――――定时器中断服务程序―――――――――――――
                       CONT:             PUSH       ACC                                                             ;保护现场
                                                                     MOV         TH0,#3CH                             ;定时器T1重置初值
                              , ;                      &nbs, p;               MOV         TL0,#0B0H                                                
                                                                     MOV         A,20H                                           ;秒计数器送A
                                           AJMP       CONT1                                              
                       REN:                     AJMP       REN1
                       CONT1:           DJNZ             21H,REN                                         ;1秒定时未到,中断返回
                                                                     MOV             21H,#14H                                        
                       ;重置50ms计数初值
                                                                     CLR               P3.5                                                            
                         ;软件产生定时器T1计数脉冲
                                           NOP
                                           NOP
                                           SETB             P3.5
                                                                     INC               A                                                                  
                           ;1秒计数值加1
                                                                     DA                 A                                                                  
                           ;换算为10进制计数
                                                                     JBC               TF1,CONT2                               ;60秒到,转清零

                         CONT3:         MOV             20H,A                                               ;计数值送60秒计数单元20H
                                                                     ANL             A,#0FH                                   ;屏蔽高4位
                                                                     MOV             30H,A                                              
                       ;秒表个位待显示数据送显示缓冲区
                                                                     MOV             A,20H
                                                                     SWAP         A                                                                    
                       ;60秒计数单元高、低4位数据互换
                                                                     ANL             A,#0FH                                   ;屏蔽高4位
                                                                     MOV             31H,A                                              
                       ;秒表十位待显示数据送显示缓冲区
                                           AJMP             REN1
                         CONT2:         MOV             A,#00H                                          
                                           AJMP             CONT3
                       REN1:                 POP               ACC                                                       ;恢复现场
                                                                     RET                                                                                    
                       ;中断返回
                                           END                                                      
                       3. 总结与分析
                              
                       (1)实验采用七段码LED设计(数码管),显示直观;采用定时器中断,计时更准确;功能齐全,可随时启动、停止、清零,后者智能化程度更高。
                       (2)设计、调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。本例子将整个程序划分为键盘程序,动态显示程序,秒计时程序三大模块,根据各自的特点确定键盘程序为主程序,动态显示程序为子程序,秒计时程序为定时器中断服务程序。主程序又细分为初始化程序,键盘查询程序,键盘扫描程序,键盘处理程序四大部分。三大模块之间的关系是:键盘程序在无键按下时,不断调用动态显示子程序;在有键按下时,先调用动态显示子程序消抖,再进入键盘处理程序,控制中断服务程序的运行;处理完毕后,再不断调用动态显示子程序。经上述处理后,三大模块运行协调一致,既保持了动态显示的稳定性,又保持了键盘的可靠性,还保持了秒计时的准确性,较好地实现了全部功能。

                       (3)本例子只用到8位LED显示中的两位,只用到4×4键盘16个按键中的3个,因此,其功能还有较大的扩展空间。只要将上述程序稍加改动即可实现秒、分、时、日显示,并可作全方位修改的实时时钟。如增加LED显示位数或将显示改为LCD显示模块,可实现年、月、周、日、时、分、秒显示。

  

我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号