基于51单片机的数字秒表设计

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机系统课程设计
成绩评定表
设计课题:数字秒表
学院名称:电气工程学院
专业班级:自动1204
学生:
学号:
指导教师:王黎
设计地点:31-630
设计时间:2013-12-29~2013-1-9
单片机系统
课程设计
课程设计名称:数字秒表
专业班级:自动1204
学生姓名:
学号:
指导教师:王黎
课程设计地点:31-630
课程设计时间:2013-12-29~2013-1-9
单片机系统课程设计任务书
目录
1绪论 (3)
2系统概述 (4)
2.1数字式秒表的设计意义 (4)
2.2设计要求与分析 (5)
3 硬件电路设计 (6)
3.1基准脉冲的获取 (6)
3.2键盘及控制电路 (12)
3.3计数、译码及显示电路 (14)
4 数字秒表系统软件设计 (16)
4.1 主程序软件设计 (16)
4.2 中断服务程序设计 (16)
5调试与仿真 (19)
5.1软件调试与烧写 (19)
5.2 硬件仿真 (20)
6. 结论 (21)
参考文献: (23)
附录 (24)
附录一系统原理图 (24)
附录二源程序代码 (25)
1绪论
21世纪,单片机的发展非常的迅速。

单片机是把主要计算机功能部件都集成在一块芯片上的微型计算机。

它是一种集计数和多种接口于一体的微控制器,被广泛应用在智能产品和工业自动化上,而51单片机是个单片机中最为典型和最有代表性的一种。

51单片机是对所有兼容Intel 8031指令系统的单片机的统称。

该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是Atmel的AT89系列,它广泛应用于工业测控系统之中。

很多公司都有51系列的兼容机型推出,今后很长的一段时间将占有大量市场。

本次的设计任务是一个数字秒表,而秒表与普通的钟表不同,它的目的是对从某一时刻到另一时刻的时间间隔进行计时。

秒表的数字化常给人们的生活带来
极大的方便,它广泛应用于社会的各个领域。

通过对数字式秒表的设计,我们可以清楚的了解到它的工作原理,进而也了解了数字钟表的工作原理。

在翻阅相关资料后,我们把秒表的设计分成了三大部分:基准脉冲产生部分;控制部分和计数、译码、显示部分。

本设计的数字电子秒表系统采用STC89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及独立键盘来设计秒表,将软、硬件有机地结合起来。

基准脉冲产生部分由石英振荡器和由计数器组成的分频器构成。

在石英振荡器中,石英晶体的固有频率是1M Hz,即振荡器的输出为1M Hz的矩形脉冲。

而分频器将1M Hz分频为100 Hz的基准脉冲。

控制部分可由基本RS触发器和相应的开关组成。

计数、译码、显示部分中,将使用同步四位二进制加法计数器74LS161 来计数。

74LS48是BCD-7段译码器/驱动器,专用于驱动LED七段共阴极显示数码管。

关键字:基准脉冲计数译码数字显示
2系统概述
2.1数字式秒表的设计意义
秒表的数字化常给人们的生活带来极大的方便,它广泛应用于社会的各个领域。

通过对数字式秒表的设计,我们可以清楚的了解到它的工作原理,进而也了解了数字钟表的工作原理。

在秒表的设计中,我们对《数字电子技术基础》中所学到的知识有了更深刻的认识》。

比如:555多谐振荡器的应用、计数器、译码及显示器的应用。

总之,数字秒表的设计让我们体会了学以致用的乐趣。

2.2设计要求与分析
设计要求如下:
秒表的最大计时值为99分59.99秒;
6位数码管显示,分辨率为0.01秒
具有清零、启动计时、暂停及继续计数等控制功能;
控制操作键不超过二个。

首先,秒表的分辨率为0.01秒,故要获得频率为100 Hz的基准毫秒脉冲;其次,分、毫秒计数器为100进制计数器,秒计数器为60进制计数器;最后,用一个控制键实现秒表的启动/暂停/继续计数功能,用另一个控制健实现秒表的清零功能。

分别实现以上模块功能,即可设计出符合要求的数字秒表。

设计方案论证:
即为数字式秒表,那么必须有数字显示。

按设计要求,须用数码管来做显示器。

题目要求最大记数值为99分59.99秒,那则需要六个数码管。

要求计数分辨率为0.01秒,那么我们需要相应频率的信号发生器。

选择信号发生器时,有两种方案:一种是用晶体震荡器,另一种方案是采用集成电路555定时器与电阻和电容组成的多谐振荡器。

秒表核心部分使用六个74161计数器采用串联方式构成,这种连接方式简单,使用元器件数量少。

因为对秒表的精度要求高,故CP脉冲是由石英振荡器产生的,而没有用555构成的多谐振荡器。

总体设计方案框图及分析:
通过以上的分析,查阅相关资料后,得数字式秒表的原理方框图如图1所示。

图1数字秒表的原理方框图
本电路由启动、清零复位电路、多谐振荡电路、分频计数电路、译码显示电路等组成,整体上是按照基准脉冲产生部分,控制部分和计数、译码、显示部分这三大部分来设计的。

3 硬件电路设计
硬件电路由启动、清零复位电路、多谐振荡电路、分频计数电路、译码显示电路等组成,整体上是按照基准脉冲产生控制部分和计数、译码、显示部分这三大部分来设计的
3.1基准脉冲的获取
1.方案一:由555构成多谐振荡器
⑴555 定时器是一种模拟和数字功能相结合的中规模集成器件,它的电源电压围宽,可在 4.5V~16V 工作,输出驱动电流大约为200mA,因而它的输出可与TTL、CMOS 或者模拟电路电平兼容。

555 定时器成本低,性能可靠,只需要外接几个电阻、电容,就可以实现多谐振荡器、单稳态触发器及施密特触发器等脉冲产生与变换电路。

它也常作为定时器广泛应用于仪器仪表、家用电器、电子测量及自动控制等方面。

555 定时器的部电路框图和外引脚排列R如图1.2 所示。

它部包括两个电压比较器,三个等值串联电阻,一个RS 触发器,一个放电管T 及功率输出级。

它提供两个基准电压VCC /3 和2VCC /3。

555 定时器的功能主要由两个比较器决定。

两个比较器的输出电压控制RS 触发器和放电管的状态。

在电源与地之间加上电压,当 5 脚悬空时,则电压比较器C1 的同相输入端的电压为2VCC /3,C2 的反相输入端的电压为VCC /3。

若触发输入端TR 的电压小于VCC /3,则比较器C2 的输出为0,可使RS 触发器置1,使输出端OUT=1。

如果阈值输入端TH 的电压大于
2VCC/3,同时TR 端的电压大于VCC /3,则C1 的输出为0,C2 的输出为1,可将RS 触发器置0,使输出为0 电平。

⑵由555定时器构成的多谐振荡器如图1.3(a)所示,图1.3(b)为其工作波形。

图2 555构成的多谐振荡器
其工作原理如下:接通电源后,VCC经R1、R2给电容C充电。

由于电容上电压不能突变,电源刚接通时υC<VCC/3,所以555部比较器A1输出高电平,
A2输出低电平,即RD=1,SD=0,基本RS 触发器置1,输出端Q 为高电平。

此时Q=O ,使部放电管截止。

当υC 上升到大于Vcc /3时,RD=1,SD=1,基本RS 触发器状态不变,即输出端Q 仍为高电平,当VC 上升到略大于2VCC /3时,RD =0,SD=1,基本RS 触发器置0,输出端Q 为低电平。

这时Q=1,使部放电管饱合导通。

于是电容C 经R2和部放电管放电,υc 按指数规律减小。

当υC 下降略小于Vcc /3时,部比较器A1输出高电平,A2输出低电平,基本RS 触发器置1,输出高电平。

这时,Q=0,部放电管截止。

于是C 结束放电并重新开始充电。

如此循环不止,输出端就得到一系列矩形脉冲,如图1.3(b )所示。

由图可见,υC 将在Vcc /3和2VCC /3之间变化,因而可求得电容C 上的充电时间1T 和放电时间2T
充电时间 11212()ln 20.7()T R R C R R C =+≈+
放电时间 222ln 20.7T R C R C =≈
矩形波的振荡周期121212ln 2(2)0.7(2)T T T R R C R R C =+=+≈+………①
因此改变1R 、2R 和电容C 的值,便可改变矩形波的周期和频率。

当矩形波的频率f=100 Hz 时,振荡周期T=0.01s 。

当取C=0.1µF,R1=40千欧,若使T=0.01s ,那么,R2≈51千欧。

取一固定电阻47千欧与一5千欧的电位器相串联代替电阻R2。

在调试电路时,调节电位器RP ,使输出脉冲周期为0.01s ,即可获得所需的基准脉冲。

2.方案二:由石英晶体构成的多谐振荡器
在对频率的稳定性要求较高的电路中,应采用频率稳定性很高的石英晶体振
荡器,图3给出了两种常见的石英晶体振荡电路。

(a)
(b)
图3 石英晶体振荡电路
石英晶体振荡电路的谐振频率由石英晶体的固有频率决定,故图 1.4中的两电路输出的波形的振荡频率均为1M Kz ,电路中其它元器件对输出波形频率的影响极为有限。

只是石英晶体振荡器产生的频率很高,要得到基准毫秒脉冲,还需要用分频电路。

振荡器输出1M Kz 信号,为了得到100 Hz 的振荡脉冲,可以进行10 000分之一的分频。

3.两种方案的比较与选择
首先,555多谐振荡器的振荡频率不可能是某一精确值,即它的振荡频率不可能达到
100 Hz ;其次,因为
555
多谐振荡器的振荡
121212ln 2(2)0.7(2)T T T R R C R R C =+=+≈+,故频率还受电阻R1、R2和电容C
的影响,当它们中的任一值变动时,振荡频率就受到影响;最后,上述555振荡电路中的振荡频率是由门电路输入电压上升到转换电平所需要时间来决定的,由于受电源电压、温度变化以及某些干扰因素的影响,门电路的转换时间不可能十分精确和稳定,可见,上述振荡电路的振荡频率极不稳定。

而石英晶体振荡器则可以克服以上缺点。

石英晶体多谐振荡器是一种产生高稳定度的脉冲振荡器,它有极高的频率稳定性,而且品质因数又高,因此它有极好的选频特性。

当外加电压频率等于石英晶体的固有频率f0时,它的阻抗最小,频率为f0的电压信号最容易通过,并在电路中形成正反馈而使电路振荡。

石英晶
体多谐振荡器的振荡频率只取决于石英晶体的固有频率f0,而与外接的R、C元件无关。

此外,石英晶体振荡器的电路结构简单、频率易调整。

但是,石英晶体振荡器产生的振荡脉冲的频率过高,为了的到基准脉冲,还需要外加分频电路,555多谐振荡器则不需如此。

在电子秒表的设计中,选择了方案二。

尽管方案二需要使用分频电路,增加了电路中使用的元件数,但秒表的计时一定要可靠、精准,与555多谐振荡器相比,石英晶体振荡器在振荡频率的稳定性上刚好符合设计需要。

4.分频电路的设计
由于要求得到的基准脉冲的频率是100 Hz,而石英晶体振荡器产生的频率过大,需要进行分频。

分频电路有多种选择方案,可以使用专用的分频器,也可通过触发器进行分频,还可以用计数器分频,本次设计中用10进制计数器74HC160对1M Kz进行分频,因为是取10 000分之一,所以使用了4个计数器,尽管用74HC160较多,有点浪费,但其在电路中的连接方式较为简单。

74HC160是同步十进制加法计数器,它有异步清零、同步置数等功能。

图4为它的逻辑符号图。

图4 74HC160的逻辑方框图
74HC160的状态转换表和时序波形图分别如表1.1和图5所示
表1 74HC160的状态转换表
图5 74HC160的时序波形图
通过对表1和图5的分析,可以看出,从CP端输入十个矩形脉冲,而从74HC160的进位输出端知输出一个矩形脉冲,可见,当把前一个74160的进位输出端作为下一个74160的脉冲输入端,即可达到十分频的目的。

由于晶体振荡器的输出为1M Kz的脉冲信号,为了得到100 Hz的振荡脉冲,要进行10 000分之一的分频,故需要四个74160来对振荡输出脉冲进行分频。

基准脉冲的产生电路如图6所示。

R11MΩC147pF
C247pF U2
HC-49/U_1MHz U3
74HC160D_4V QA 14QB 13QC 12QD 11
RCO
15
A 3
B 4
C 5
D
6
ENP 7ENT 10CLK 2~CLR 1~LOAD 9U4
74HC160D_4V QA 14QB 13QC 12QD
11
RCO
15
A 3
B 4
C 5D
6
ENP 7ENT 10CLK 2
~CLR 1~LOAD 9
U5
74HC160D_4V QA 14QB 13QC 12QD 11
RCO
15
A 3
B 4
C 5D
6
ENP 7ENT 10CLK 2~CLR 1~LOAD 9U6
74HC160D_4V
QA 14QB 13QC 12QD
11
RCO
15
A 3
B 4
C 5D
6
ENP 7ENT 10CLK 2
~CLR 1~LOAD 9
VDD
5V
VDD
5V
VDD
5V
VDD
5V
U1A
74LS00D &
VCC
5V 100 Hz 脉冲
1M Hz 脉冲
图6 基准脉冲的产生电路
3.2键盘及控制电路
1.启动和暂停控制开关
启动和暂停控制开关是由基本RS 触发器构成的。

基本RS 触发器是由两个与非门交叉耦合而成的,是TTL 触发器的最基本组成部分,其逻辑图如图7所示,它能够存储1位二进制信息,但存在 R+S =1的约束条件。

图7 RS 触发器逻辑电路和逻辑符号
基本RS 触发器的用途之一是作无抖动开关。

例如触发器是具有记忆功能的二进制信息存储器件,是时序逻辑电路的基本器件之一。

在图1.9(a )所示的电路过希望在开关S 闭合时,A 点电压的变化是从+5V 到0V 的清楚跃迁,但是由于机械开关的接触抖动,往往在几十毫秒电压会出现多次抖动,相当于连续出现了几个脉冲信号。

显然,用这样的开关产生的信号直接作为电路的驱动信号可
能导致电路产生错误动作,这在有些情况下是不允许的。

为了消除开关的接触抖动,可在机械开关与驱动电路间接入一个基本RS触发器,把带RS触发器的无抖动的开关称为逻辑开关。

在秒表的设计电路图中,启动和暂停控制开关电路如下图8所示。

J1
图8 控制电路
由图知,当开关J1和开关J2都打开时,基本RS触发器的两输入端都是1,触发器输出保持原状态不变。

当开关J1闭合是,Q输出1,基准脉冲可以输入到计数单元,秒表起动计时;当开关J2闭合是,Q输出0,基准脉冲无法输入到计数单元,秒表暂停计时。

若要继续计时,合上开关J1即可。

2.清零开关的设计
清零功能的实现相对而言比较简单。

把计数单元的所有74LS161的清零控制端Rd连接在一起,通过一个开关接地,需要清零时,闭合开关就行。

图9 复位电路
3.3计数、译码及显示电路
1.计数器的设计
秒表中的计数器是由74LS161构成的。

74LS161是集成同步二进制计数器,该计数器具有同步预置、异步清零、计数和保持四种功能,且有进位信号输出端,可串接计数使用。

它的引脚图见图9。

图9 74LS161引脚图
60进制计数器也是用乘数法构成的,它是由一个十进制计数器和一个六进
制计数器级联而成。

如图10
U3
74161N
QA 14QB 13QC 12QD
11
RCO
15
A 3
B 4
C 5D
6
ENP 7ENT 10CLK 2~CLR 1~LOAD 9U4
74161N
QA 14QB 13QC 12QD
11
RCO
15
A 3
B 4
C 5D
6
ENP 7ENT 10CLK 2
~CLR 1~LOAD 9VCC
5V
VCC
5V
U9A
74LS00D &
U10A
74LS00D
&
个位
十位
图10 60进制计数器
2.译码显示电路
本设计中选用的74LS48是BCD 码七段译码器兼驱动器,输出端(Ya -Yg )为高电平有效,可驱动共阴极LED 显示器,其外引线排列图如图11所示。

U1
74LS48D
A 7
B 1
C 2D
6
OA 13OD 10OE 9OF 15OC 11OB 12OG
14
~LT 3~RBI 5
~BI/RBO 4
图11 74LS48 外引线排列图
显示器采用七段发光二极管显示器,它可直接显示出译码器输出的十进制数。

七段发光显示器有共阳和共阴两种接法。

与74LS48译码器配套的显示器为共阴型。

七段显示器的7段数码管结构如图11所示
图11 7段数码管结构图
4 数字秒表系统软件设计
本系统系统软件设计主要包括数码显示和复位键,开始键,停止键。

本章节系统的介绍了数字秒表的主程序和中断程序的设计流程。

4.1 主程序软件设计
4.2 中断服务程序设计
中断是指计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回现行程序的间断处,继续执行原程序。

中断是单片机实时地处理部或外部事件的一种部机制。

当某种部或外部事件发生时,单片机的中断系统将迫使CPU 暂停正在执行的程序,转而去进行中断事件的处理,中断处理完毕后,又返回被中断的程序处,继续执行下去。

5调试与仿真
5.1软件调试与烧写
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

运行Keil软件需要Pentium或以上的CPU,16MB 或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP 等操作系统。

掌握这一软件的使用对于使用51系列单片机的爱好者来说是十分必要的,如果你使用C语言编程,那么Keil几乎就是你的不二之选(目前在国你只能买到该软件、而你买的仿真机也很可能只支持该软件),即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。

在开发大型软件时更能体现高级语言的优势。

C51工具包的整体结构,uVision与Ishell分别是C51 for Windows 和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。

开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。

然后分别由C51及C51编译器编译生成目标文件(.OBJ)。

目标文件可由LIB51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。

ABS文件由OH51转换成标准的Hex文件,以供调试器
dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。

图12为在编辑程序时所用的软件KILE.通过此程序对软件进行编辑,编译,调试。

图12 烧写过程
5.2 硬件仿真
Proteus软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为风标电子技术)。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

虽然目前国推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

Proteus 是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、
PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。

在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。

Proteus软件具有其它EDA工具软件(例:multisim)的功能。

比如:原理布图;PCB自动或人工布线;SPICE电路仿真;互动的电路仿真;用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI 器件,部分IIC器件。

6. 结论
单片机可以应用于各个领域,而单片机本身也是融合了各个领域的知识。

我们可以通过单片机去实现很多的电子产品,因为它的应用领域非常的广泛,所以发展很迅速。

本次设计,先通过KEIL软件对软件进行编辑、调试、编译,通过此次长达数天的编辑,对单片机C语言编写应用的更加熟练;然后通过STC-ISP 软件学习如果在单片机种下载程序代码;通过proteus软件,对数字秒表的硬件进行仿真。

本次设计时以单片机为中心进行设计,但是仅仅有单片机的知识还不够,同时还需要具有硬件的知识和软件的知识,并将它们有机的结合起来。

首先要通过硬件知识去设计整个电路,然后通过C语言去写数字秒表的C语言设计。

同时,由于STC89C52单片机的ROM只有8KB,所以还要注意存的应用;还要注意如何设计硬件和软件,去增加运行速度和计数精度。

本次设计的数字秒表结构简单,但是对以后来说却是很好的经历。

参考文献:
[1]阎石.数字电子技术基础[M].:高等教育,2006年5月第5版
[2]胡健,玉宾,朱焕立等.单片机原理及接口技术[M].:机械工业,2009年7月第一版
[3]郭天祥.51单片机C语言教程[M].:电子工业,2009年12月第一版
[4]谭浩强.C程序设计[M].:清华大学,2005年7月第三版.
附录
附录一系统原理图
附录二源程序代码
ORG 0000H
START: LJMP MAIN
ORG 000BH
LJMP PDJW
;****************************************************************;;系统监控程序区
ORG 0030H
MAIN: MOV PSW, #00H
MOV SP, #7FH ;确立堆栈区
MOV R0, #20H ;RAM区首地址
MOV R7, #96 ;RAM区单元个数
MOV TMOD, #01H
SETB EA
SETB ET0
ML: MOV R0, #00H
INC R0
DJNZ R7, ML
TSF: MOV DPTR, #DISBH ;系统初始化后提示符“P.”字符代码表首地址
MOV R5, #08H
MOV R0, #78H
DISPTSF:CLR A
MOVC A, A+DPTR
MOV R0, A
INC R0
INC DPTR
DJNZ R5, DISPTSF
KEY0: LCALL DISP
LCALL KEY
JB 20H.0, K1
JB 20H.1, K2
JB 20H.2, K3
LJMP KEY0
KEY00: LCALL KEY
LCALL DISP
JB 20H.2, K3
LJMP KEY00
K1: JB 22H.1, KEY0 ;如果此时为暂停状态,本次按键K1无效CPL 22H.0
JB 22H.0, K01 ;高电平则计时
CLR TR0 ;低电平则停止
LCALL DISP
LJMP KEY00
K01: MOV 7AH, #12H ;从零开始计时
MOV 7DH, #12H
MOV 7FH, #10H
MOV 78H, #00H
MOV 79H, #00H
MOV 7BH, #00H
MOV 7CH, #00H
MOV 7EH, #00H
MOV 7FH, #00H
LCALL DISP
MOV TH0, #0D8H
MOV TL0, #0F0H
SETB TR0 ;启动定时器
LJMP KEY0
K2: JB 22H.0, K21 ;判断秒表是否启动,如不是启动状态则此次按键无效
LJMP KEY0
K21: CPL 22H.1
JB 22H.1, K22
SETB TR0 ;继续计时
LJMP KEY0
K22: CLR TR0 ;暂停秒表
LCALL DISP
LJMP KEY0
K3: JB 22H.0, KEY0 ;只有当停止是,清零键才有效MOV R0, #79H ;秒表清零
LCALL CLR00
MOV R0, #7CH
LCALL CLR00
MOV R0, #7FH
LCALL CLR00
LJMP KEY0
PDJW: PUSH PSW
PUSH ACC
MOV TMOD, #01H ;定时器以工作方式1工作SETB RS1 ;设定组号为2组
CLR RS0
MOV TH0, #0D8H
MOV TL0, #0F0H
MOV R0, #79H
LCALL ADD01
CJNE R2, #99, RETT ;判断1秒到没
MOV R0, #7CH
LCALL ADD01
CJNE R2, #60, RETT ;判断60毫秒到没
LCALL CLR00
MOV R0, #7FH
LCALL ADD01
CJNE R2, #60H, RETT ;判断60分到没
LCALL CLR00
RETT: POP ACC
POP PSW
RETI
;*****************************************************************;
;常数表格区
;系统初始化后提示符“P.”字符代码表;
DISBH: DB 10H,10H,10H,10H,10H,10H,10H,11H ;提示符“P.”字符序号;显示字符段选码表(共阳极代码)
TAB: DB 0C0H, 0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H ;0-8 DB 90H, 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0BFH ;9,A,B,C,D,E,F,灭,p.,-
;*******************************************************************;
;子程序区;
ADD01: MOV A, R0
DEC R0
SWAP A
ORL A, R0
ADD A, #01H
DA A
MOV R2, A
ANL A, #0FH
MOV R0, A
MOV A, R2
ANL A, #0F0H
SWAP A
INC R0
MOV R0, A
RET
CLR00: MOV R0, #00H
DEC R0
MOV R0, #00H
RET
;键扫描子程序
KEY: LCALL KEYCHULI ;调P1口数据处理子程序JZ EXIT ;没有键按下,转返回
LCALL DISP ;调显示子程序去抖动
LCALL DISP
LCALL KEYCHULI ;调P1口数据处理子程序
JZ EXIT ;没有键按下,转返回
MOV B, 20H ;保存取反后的键值
KEYSF: LCALL KEYCHULI ;调P1口数据处理子程序JZ KEY1 ;键释放,转恢复键值
LCALL DISP
LCALL DISP ;调显示子程序延时
LJMP KEYSF ;等待释放
KEY1: MOV 20H, B ;键值送20H保存EXIT: RET
;子程序返回
;P1口数据处理子程序
KEYCHULI:PUSH PSW ;保护现场
CLR RS1 ;改变当前寄存器组为组1 SETB RS0
MOV P1, #0FFH ;先向P1口写1
MOV A, P1 ;读P1口数据
CPL A ;P1口数据取反
MOV 20H, A ;保存取反后的键值
CLR RS1 ;恢复当前寄存器组为组0 CLR RS0
POP PSW ;恢复现场
RET ;子程序返回
;显示子程序
;入口: 78H,79H,7AH,7BH,7CH,7DH,7EH,7FH,
DISP: PUSH DPH
PUSH DPL
PUSH ACC
PUSH PSW
CLR RS1 ;改变当前寄存器组为组1
SETB RS0
MOV R1, #78H ;显示缓冲存储单元首地址
MOV R2, #0FEH ;从右至左显示
MOV R5, #08H ;循环次数,即驱动数码管的位数DISP1: MOV A, R1
MOV DPTR, #TAB
MOVC A, A+DPTR
MOV P0, A ;送段控
MOV P2, R2 ;送位控
LCALL DL ;延时1毫秒
MOV A, R2 ;位控码送A
RL A ;获得新的位控码
MOV R2, A ;保存新的位控码
INC R1 ;获得新的显示缓冲单元地址DJNZ R5, DISP1 ;循环没有结束则继续
DISP2: POP PSW ;恢复当前寄存器组的组号
POP ACC
POP DPL
POP DPH
RET
;延时1ms子程序(晶振频率12MHz)DL DL: MOV R7, #02H
DL1: MOV R6, #0FFH
DL2: DJNZ R6, DL2
DJNZ R7, DL1
RET
END。

相关文档
最新文档