基于51单片机秒表的程序设计_第1页
基于51单片机秒表的程序设计_第2页
基于51单片机秒表的程序设计_第3页
基于51单片机秒表的程序设计_第4页
基于51单片机秒表的程序设计_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于51单片机秒表的程序设计1设计目的:(1)利用单片机定时器中断和定时器计数方式实现秒、分定时。(2)通过led显示程序的调整,熟悉8155与8051,8155与led的接口技术,熟悉led动态显示的控制过程。(3)通过键盘程序的调整,熟悉8155与矩阵式键盘的接口技术,熟悉键盘扫描原理。(4)通过阅读和调试简易秒表整体程序,学会如何编制含led动态显示、键盘扫描和定时器中断等多种功能的综合程序,初步体会大型程序的编制和调试技巧。2 设计步骤与要求 (1)要求:以8位led右边2位显示秒,左边6位显示0,实现秒表计时显示。以44矩阵键盘的ke0、ke1、ke2等3键分别实现启动、停止、清零等

2、功能。(2)方法:用单片机定时器t0中断方式,实现1秒定时;利用单片机定时器1方式3计数,实现60秒计数。用动态显示方式实现秒表计时显示,用键盘扫描方式取得ke0、ke1、ke2的键值,用键盘处理程序实现秒表的启动、停止、清零等功能。(3)软件设计:软件整体设计思路是以键盘扫描和键盘处理作为主程序,led动态显示作为子程序。二者间的联系是:主程序查询有无按键,无按键时,调用二次led动态显示子程序(约延时8ms)后再回到按键查询状态,不断循环;有按键时,led动态显示子程序作为按键防抖延时被连续调用二次(约延时16ms),待按键处理程序执行完后,再回到按键查询状态,同时兼顾了按键扫描取值的准确

3、性和led动态显示的稳定性。秒定时采用定时器t0中断方式进行,60秒计数由定时器1采用方式3完成,中断及计数的开启与关闭受控于按键处理程序。由上述设计思路可设计出软件流程图如图1.1所示。(5)程序编制:编程时置ke0键为“启动”,置ke1键为“停止”,置ke2键为“清零”,因按键较少,在处理按键值时未采用散转指令“jmp”,而是采用条件转移指令“cjne”,每条指令后紧跟着一条无条件跳转指令“ajmp”,转至相应的按键处理程序,如不是上述3个按键值则跳回按键查询状态。8位led显示的数据由显示缓冲区30h37h单元中的数据决定,顺序是从左至右,动态显示时,每位显示持续时间为1ms,1ms延时

4、由软件实现,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 ajmpmain org000b

5、h 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,#

6、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

7、k3: movdptr,#4401h;pa口地址送dptr,开始列扫描 mova,r3 movxdptr,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;转求键号

8、 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;

9、不是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 ajmp

10、key ke2: clrea ;关中断 ajmpmain;返回主程序进行初始化 ;按键查询子程序 ks: movdptr,#4401h ;置8155pa口地址 mova,#00h movxdptr,a;全扫描字#00h送pa口 incdptr ;指向pc口 incdptr movxa,dptr;读入pc口状态 cpla ;变正逻辑,高电平表示有键按下 anla,#0fh ;屏蔽高4位 ret ;返回,a0表示有键按下 ;led动态显示子程序 disp:pushacc;a入栈保护 setbrs0;保护第0组工作寄存器,启用第1组工作寄存器 movr2,#08h ;led待显示位数送r2 movr

11、1,#00h;设定显示时间 movr3,#7fh;选中最右端led movr0,#30h;显示缓冲区首址送r0 mova,r0;秒显示个位送a disp1:movdptr,#tab;指向字形表首址 movca,a+dptr;查表取得字形码 movdptr,#4402h;指向8155pb口(段码口) movxdptr,a;字形码送pb口 mova,r3 ;取位选字 movdptr,#4401h;指向8155pa口(位选口) movxdptr,a;位码送pa口 djnzr1,$;延时0.5ms djnzr1,$;延时0.5ms rra;位选字移位 movr3,a;移位后的位选字送r3 incr0

12、;指向下一位缓冲区地址 mova,r0;缓冲区数据送a djnzr2,disp1;未扫描完,继续循环 clrrs0 ;恢复第0组工作寄存器 popacc ;a弹栈,恢复现场 ret tab:db3fh,06h,5bh,4fh,66h;共阴极led字形表 db6dh,7dh,07h,7fh,6fh ;定时器中断服务程序 cont:push acc ;保护现场 mov th0,#3ch ;定时器t1重置初值 mov tl0,#0b0h mov a,20h ;秒计数器送a ajmp cont1ren:ajmp ren1 cont1:djnz21h,ren;1秒定时未到,中断返回 mov21h,#14

13、h;重置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;恢复现

14、场 ret;中断返回 end3 总结与分析 (1)实验采用七段码led设计(数码管),显示直观;采用定时器中断,计时更准确;功能齐全,可随时启动、停止、清零,后者智能化程度更高。 (2)设计、调试大型程序时,需先根据要求划分模块,优化结构;再根据各模块特点确定何为主程序,何为子程序,何为中断服务程序,相互间如何调用;再根据各模块性质和功能将各模块细化,设计出程序流程图;最后才根据各模块流程图编制具体程序。调试时应先调主程序,实现最基本最主要的功能,在此基础上再将各模块功能往主程序上堆砌,直至各模块联调、统调,实现全部功能。本例子将整个程序划分为键盘程序,动态显示程序,秒计时程序三大模块,根据各自的特点确定键盘程序为主程序,动态显示程序为子程序,秒计时程序为定时器中断服务程序。主程序又细分为初始化程序,键盘查询程序,键盘扫描程序,键盘处理程序四大部分。三大模块之间的关系是:键盘程序在无键按下时,不断调用动态显示子程序;在有键按下时,先调用动态显示子程序消抖,再进入键盘处理程序,控制中断服

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论