快速发布求购| | | | | 加微群|
关注我们
本站客户服务

线上客服更便捷

仪表网官微

扫一扫关注我们

|
客户端
仪表APP

安卓版

仪表手机版

手机访问更快捷

仪表小程序

更多流量 更易传播


您现在的位置:仪表网>汽轮仪表>技术列表>基于51单片机秒表的程序设计

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

2012年07月11日 15:20:37 人气: 6953 来源:
  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单元。
  
  按照上述思路可编制源程序如下:
  
  ORG0000H
  
  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&n,bsp;;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&,nbsp;;扫描字暂存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;选中zui右端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口(位选口)<,/O:P>
  
  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)设计、调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;zui后才根据各模块流程图编制具体程序。调试时应先调主程序,实现zui基本zui主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。本例子将整个程序划分为键盘程序,动态显示程序,秒计时程序三大模块,根据各自的特点确定键盘程序为主程序,动态显示程序为子程序,秒计时程序为定时器中断服务程序。主程序又细分为初始化程序,键盘查询程序,键盘扫描程序,键盘处理程序四大部分。三大模块之间的关系是:键盘程序在无键按下时,不断调用动态显示子程序;在有键按下时,先调用动态显示子程序消抖,再进入键盘处理程序,控制中断服务程序的运行;处理完毕后,再不断调用动态显示子程序。经上述处理后,三大模块运行协调一致,既保持了动态显示的稳定性,又保持了键盘的可靠性,还保持了秒计时的准确性,较好地实现了全部功能。
  
  (3)本例子只用到8位LED显示中的两位,只用到4×4键盘16个按键中的3个,因此,其功能还有较大的扩展空间。只要将上述程序稍加改动即可实现秒、分、时、日显示,并可作修改的实时时钟。如增加LED显示位数或将显示改为LCD显示模块,可实现年、月、周、日、时、分、秒显示。
关键词: 秒表
全年征稿/资讯合作 联系邮箱:ybzhan@qq.com
版权与免责声明
1、凡本网注明"来源:仪表网"的所有作品,版权均属于仪表网,未经本网授权不得转载、摘编或利用其它方式使用上述作品。已经本网授权使用作品的,应在授权范围内使用,并注明"来源:仪表网"。违反上述声明者,本网将追究其相关法律责任。
2、本网转载并注明自其它来源的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品来源,并自负版权等法律责任。
3、如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。
4、合作、投稿、转载授权等相关事宜,请联系本网。

企业推荐

更多
联系我们

客服热线: 0571-87759942

加盟热线: 0571-87756399

媒体合作: 0571-87759945

投诉热线: 0571-87759942

关注我们
  • 下载仪表站APP

  • Ybzhan手机版

  • Ybzhan公众号

  • Ybzhan小程序