《单片机原理及接口技术》课程设计
——单片机秒表的设计
学
院: 机电工程学院
专业班级: 10 级电气工程二班 姓 学 名: 姚杜村 号: 1002120208 杨坤漓
指导教师: 宋东亚 时
间:2012 年 11 月 20 日―2013 年 01 月 05 日
电子秒表设计
目
录
序 言 .......................................................... 2 第一章 绪 论 ................................................... 3 1.1 概 述 .................................................... 3 1.2 设计任务 ................................................. 3 1.3 设计目的 ................................................. 3 第二章 设计任务及内容........................................... 3 2.1 设计题目 ................................................. 3 2.2 设计内容 ................................................. 3 2.3 功能分析 ................................................. 4 第三章总体设计及核心器件简介..................................... 4 3.1 硬件设计 ................................................. 4 3.1.1 89C51 单片机 ................................................................................... 4 3.1.2 晶体振荡电路 .................................................................................. 5 3.1.3 复位电路........................................................................................... 6 3.1.4 按键电路........................................................................................... 6 3.1.5 显示电路........................................................................................... 7 3.2 软件设计 ................................................ 8 3.2.1 程序设计思想 .................................................................................. 8 3.2.2 系统资源的分配 .............................................................................. 8 3.2.3 主程序设计 ...................................................................................... 8 3.2.4 中断程序设计 .................................................................................. 8 第四章 数字电子秒表的调试 ...................................... 10 4.1 软件的仿真与调试 ....................................... 10 4.2 硬件的调试 ............................................. 11 4.2.1 晶振电路的测试 ............................................................................ 11 4.2.2 复位电路的测试 ............................................................................ 11 4.3 程序设计 ................................................. 12 4.3.1 秒表的初始化 ................................................................................ 12 4.3.2 开始计时......................................................................................... 12 4.3.3 计时程序.......................................................................................
.. 12 4.3.4 暂停计时......................................................................................... 12 4.3.5 秒表清零......................................................................................... 12 心 得 体 会 .................................................... 15 附录 A 秒表仿真电路图 ......................................... 16 附录 B 源程序 .................................................. 17 参 考 文 献 .................................................... 19
1
电子秒表设计
序 言
随着电子技术的发展, 电子技术在各个领域的运用也越来 越广泛,人对它的认识也逐步加深。作为一个学习电气专业的 当代大学生来说,我们不但要有扎实的基础知识、课本知识, 还应有较强的动手能力。现实也要求我们既精通电子技术理 论,更要掌握电子电路设计、实验研究和调试技术。 秒表计时器秒表计时器常常用于体育竞赛及各种其他要 求有较精确时间的各领域中。其中启/停开关的使用方法与传 统的机械计时器相同,即按一下启/停开关,启动计时器开始 计时,再按一下启/停开关计时终止。而复位开关可以在任何 情况下使用,即使在计时过程中,只要按一下复位开关,计时 应立即终止,并对计时器清零。本设计就是利用所学到的电子 元器件将脉冲源用数码管显示出来,以制承诺简易的秒表。 电子秒表是重要的计时工具,广泛应用于各行各业。可以 用来测量物体的速度和加速度, 可以用来验证牛顿第二定律和 机械能守恒等物理实验。相对其他计时工具具有便捷、准确、 可比性高等优点。减少工作人员的负担,降低错误率。 姚 杜 村
2
电子秒表设计
第一章 绪 论
1.1 概 述
单片微型计算机简称单片机,又称微控制器,是微型计算机的一个重要分支。 单片机是 20 世纪七十年代中期发展起来的一种大规模集成电路芯片,是集 CPU、 RAM、ROM、I/O 接口和终端系统与同一硅片的器件。20 世纪八十年代以来单片机 发展迅速各类新产品不断涌现出现许多新产品,出现了许多高性能新型机种现已成 为工业控制和各控制领域的支柱产业之一。由于单片机功能强、体积小、可靠性好、 价格便宜等独特优点因而受到人们的高度重视并取到了一系列的科研成果,成为传 统工业技术改造和新产品更新换代的理想机种,并具有广阔的发展前景。 本设计运用所学的单片机知识,将单片机与普通秒表相结合设计了电子秒表, 具有显示直观、读取方便、精度高等优良特点,在计时中应用广泛。
1.2 设计任务
以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、 停止、时间显示。
1.3 设计目的
加强对 51 系列单
片机的构造了解及应用,熟悉汇编语言或 C 语言编程,综合 掌握和理解设计各部分的工作原理、设计过程、芯片器件的选择方法、模块化编程 等多项知识。 (1)用单片机模拟实现具体应用使个人设计系统能够真正使用; (2) 把理论知识与实践知识相结合, 充分发挥个人能力, 并在实践中得到锻炼; (3)提高利用已学的知识分析和解决问题的能力; (4)提高动手实践能力。
第二章 设计任务及内容
2.1 设计题目
秒表的设计
2.2 设计内容
3
电子秒表设计
(1)填写设计任务书; (2)进行总体设计,画出设计原理图; (3)用 PROTEUS 软件画出设计电路图; (4)用 Keil 软件编写程序; (5)在 PROTEUS 里模拟并调试程序达到期望功能。
2.3 功能分析
采用 3 个 LED 数码管显示时间,计时范围设置为 0~99.9 秒,即精确到 0.1 秒, 用按键控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时; 按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当 前计时值;按“复位”按键,系统清零。
第三章 总体设计及核心器件简介
本实验利用单片机的定时器/计数器定时和计数的原理,通过采用 Proteus 仿真 软件来模拟实现。模拟 AT89C51 单片机、LED 数码管以及控件来控制秒表的计数 以及计时的开启、暂停、继续、与复位。其中有三个数码管来显示数据,两个数码 管显示秒 (两位) 另一个数码管显示十分之一秒, , 十分之一秒的数码管计数从 0~9, 满十进一后显示秒得数码管的个位加一,并且十分之一秒显示清零重新从零计数。 同理当个位满十进一后个位也清零重新计数 ,当计时超过范围(即超过 99.9 秒) 后,所有数码管全部清零重新计数。
3.1 硬件设计
3.1.1 89C51 单片机
MCS-51 系列单片机是 8 位单片机产品,89C51 是其中的典型代表,基本模 块包括以下几个部分: (1) CPU:89C51 的 CPU 是 8 位的,另外 89C51 内部有 1 个位处理器 (2) R0M:4KB 的片内程序存储器,存放开发调试完成的应用程序 (3) RAM:256B 的片内数据存储器,容量小,但作用大
4
电子秒表设计
(4) I/O 口:P0-P3,共 4 个口 32 条双向且可位寻址的 I/O 口线 (5) 中断系统:共 5 个中断源,3 个内部中断,2 个外部中断 (6) 定时器/计数器:2 个 16 位的可编程定时器/计数器 (7) 通用串行口:全双工通用异步接收器/发送器 (8) 振荡器:89C51 的外接晶振与内部时钟振荡器为 CPU 提供时钟信号 (9) 总线控制:89C51 对外提供若干控制总线,便于系统扩展
89C51 的引脚如下图:
89C51 单片机引脚图
3.1.2
晶体振荡电路
89C51 单片机内部的振荡电路是
一个高增益反相放大器, 引线 XTAL1 和 XTAL2 分别为反相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的 输出,该反相放大器可以配置为片内振荡器。 这里选用 51 单片机 12MHZ 的内部振荡方式,电路如下:C2、C3 起稳定振荡 频率、快速起振的作用
5
电子秒表设计
晶振电路
3.1.3
复位电路
采用上电复位,上电后,由于电容充电,使 RST 持续一段时间的高电平,从 而实现上电复位操作。 这不仅能使单片机复位,还能是单片机的外围设备同时复 位,当程序出现错误时,可以随时使电路复位。 电路图如下:
复位电路
3.1.4
按键电路
当按键被按下时,相应的引脚被拉低,经扫描后,获得键值,并执行键功能 程序,因此按下不同的按键,将执行不同的功能程序。 电路图如下:
6
电子秒表设计
按键电路
3.1.5
显示电路
采用3个 LED 数码管,LED 是七段显示器,内部有 7 个条形发光二极管和 1 个小圆点发光二极管,根据各管的亮暗组成字符。 在用数码管显示时, 有静态和动态两种选择, 这里采用 LED 动态显示, P0、 用 P1、 P2 口驱动显示,由于 P0 口没有上拉电阻,因此 P0 口需要外接上拉电阻才 能输出高电平,这里使用 8 个 4.7k 的电阻作为上拉电阻。 电路图如下:
显示电路 3.1.5
7
电子秒表设计
3. 2
软件设计
3.2.1 程序设计思想
结合电路,程序的总体思路 如图 3.1.5。
3.2.2 系统资源的分配
本设计系统所用到的单片机端口数比较多,所以在这里将对数字电子秒表的硬 件资源的大概分配加以说明。片内 RAM 的分配、各功能键的定义以及各端口的分配 安排如表 3.3 所示。 表 3.3 端口的分配安排表 名称 7BH-7DH R3- R5 定时器 T0 外部中断 INT0 外部中断 INT1 功能描述 0.1s-10s 位显示寄存区 0.1s-10s 位溢出计数区 控制秒表的最小精度 停止中断信号入口 开始中断信号入口 3CB0H 初始化值 00H
3.2.3 主程序设计
本系统程序主要模块由主程序、 定时中断服务程序、 外部中断 INT0 服务程序和 外部中断 INT1 服务程序组成。 其中主程序是整个程序的主体。 可以对各个中断程序 进行调用,协调各个子程序之间的联系。 系统(上电)复位后,进入主程序,主程序流程图如图 3.11。首先对系统进行 初始化,包括设置各入口地址、中断的开启、对各个数据缓存区清“0”、赋定时器 初值,初始化完毕后,就进入数码管显示程序。数码管显示程序对显示缓存区内的 数值进行调用并在数码管上进行动态显示。 显示一次就对 P3.4 进行一次扫描, 查询 启动键 P3.4 是否按下,当启动键按下后,数码管全零显示,没有按下则返回开始, 重新循环显示数字 8。 在
主程序中还进行了赋寄存区的初始值、设置定时器初值以及开启外部中断等 操作,当定时时间到后就转去执行定时中断程序。当外部中断有请求则去执行外部 中断服务程序,并在执行完后返回主程序。
3.2.4 中断程序设计
现在方案中采用了两个中断,外部中断 INT0,INT1。CPU 在响应中断时,先处 理高级中断,在处理低级中断,若有多个同级中断时,则按自然优先顺序处理。例 如当 CPU 正在处理一个中断申请时,有出现了另一个优先级比它高的中断请求,这
8
电子秒表设计
是,CPU 就暂停终止对当前优先级较低的中断源的服务,转去响应优先级比它高的 中断请求,并为其服务。待服务结束,再继续执行原来较低级的中断服务程序。而 当 CPU 为级别高的终端服务程序服务时, 如果级别低的中断发出中断请求, 此时 CPU 是不会响应的,所以为了避免开始和暂停两个按键中的一个出现没有响应的情况, 在进行程序编辑时要注意对中断的使用,避免出现中断的嵌套。,合理分配中断对 本设计的实现是至关重要的。
80C51 的自然优先级顺序排列如下: 中断源 外部中断 INT0 定时/计数器 T0 溢出中断 外部中断 INT1 定时/计数器 T1 溢出中断 串行口中断 最低 最高
数字式秒表中的两个按键采用了中断实现功能。开始采用外部中断 INT0,停止 采用外部中断 INT1。另外程序中还用到了定时/计数器 0 溢出中断进行计时。依据 设计要求,停止的外部中断 INT1 中断级别最高,计时的定时/计数器 0 溢出中断次 之,开始的外部中断 INT0 级别最低。 (1)外部中断 INT0 服务程序 外部中断 INT0 服务程序结合外部 P3.2 开始键实现数字电子秒表的计时开始功 能,具体流程图如图 2.12。 当按下 P3.2 开始键按下向 CPU 发出外部中断请求,CPU 转向外部中断 0 服务 程序执行,启动定时器 T0。
9
电子秒表设计
主程序流程图
第四章 数字电子秒表的调试
4.1 软件的仿真与调试
10
电子秒表设计
Proteus ISIS 是英国 Labcenter 公司开发的电路分析与实物仿真软件,它可以 仿真、 分析(SPICE)各种模拟器件和集成电路。 该软件的主要特点总结后有以下四点: ①实现了单片机仿真和 SPICE 电路仿真相结合的功能。②支持目前主流单片机系统 的仿真。③提供了软件调试功能,并可以与 WAVE 联合仿真调试。④具有强大的原理 图绘制功能。总之,该软件是一款集单片机和 SPICE 分析于一身的仿真软件,功能 极其强大。在电子领域中也起到了很大的作用,它的出现仿真不需要先焊接电路, 可以先仿真调试通过后在焊电路,节省了不少在硬件调试上所花的时间。 Proteus ISIS 的工作界面是一种标准的
Windows 界面。它包括标题栏、主 菜单、状态栏、标准工具栏、绘图工具栏、对象选择按钮、预览对象方位控制按 钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口等十几个工 具,方便了使用者的使用。 Proteus SISI 绘制原理图的操作与 Protel 99se 绘制原理图的操作基本相同, 在这里就不再作赘述。下面拿本设计中的一个仿真例子作简述说明。运行 Proteus SISI 后,绘制病床呼叫系统的原理图。 首先打开已经画好的 proteus DSN 文件,双击图中的 80C51 芯片,就弹出一个 窗口,在 Program File 项中通过路径选择在 WAVE 中生成的 HEX 文件,双击选中后 确定,这样仿真图中的 80C51 芯片就已经读取了本设计中的 HEX 文件。单击“三角 形按钮”进行仿真。通过对仿真结果的观察来对程序进行修改,最终使程序到达设 计要求。
4. 2
硬件的调试
按照之前设计好的数字电子秒表原理图,检测电路中是否存在短路。因为系统
采用的是共阴极数码管作为显示电路,必须确保数码管的公共端接的是低电平。
4.2.1 晶振电路的测试
在单片机正常运行的必要条件是单片机系统的时钟稳定正常。实际中,因为各 种原因导致系统时钟不正常而出现系统无法正常运行,因此系统时钟是否振动是通 电检查的首要环节。
4.2.2 复位电路的测试
复位不正常也会导致系统不能工作。如果复位引脚始终为高电平,系统将始终 处于复位状态;如果始终为低电平,不能产生复位所需的高电平信号脉冲,则系统 也可能无法正常工作。单片机正常工作时,RST 复位引脚应为 0V,按下复位按键时, 复位引脚为高电平 5V 左右。
11
电子秒表设计
4.3 程序设计
程序的各个组成模块及工作流程描述:
4.3.1 秒表的初始化
根据程序流程图,先进行秒表的初始化,即:①将 I/O 口 P3 全写一,为秒表的 控制输入做好准备;②将数码管全部置零,使其处于秒表计时的初始状态;③将工 作寄存器 R0~R2 以及 30H 初始化,留待后面的计时程序备用;④将定时器 0 置于 工作方式 1,并为其装入计时预置数 D8FE(因为程序运行过程中占用的时间会导致 一定误差,此为经实物测试之后的修正值),即将定时器定为每 10ms 溢出;⑤开 总中断允许和定时器 0 中断允许。初始化完成后,即进入之后的按键扫描程序。
4.3.2 开始计时
若确认“开始计时”键被按下,则跳转至程序标号“RUN”处,将定时器 0 计 时允许控制位 TR0 置位,则定时器开始运行。此动作完成后,返回按键检测程序, 等待操作者的下一次指令。
4.3.3 计时程序
定时器 0 计时至 10ms,溢出,引发中断,程序跳转至定时器 0 中断服务程序入
口 000BH 处执行。 程序跳转至中断服务程序 TIME0。 由于秒表的最小计时单位是 0.1s, 即 100ms,因此需加入软件计时,使定时器 0 溢出 10 次之后才改变数码管的显示状 态。因此每来一次中断就将 30H 中的数加 1,若 30H 中的数没有到 10,则给定时器 0 重新装入预置数,之后中断返回并继续等待中断;到 10 了,才进入显示程序,改 变数码管的显示状态,执行完毕之后中断返回并继续等待中断。
4.3.4 暂停计时
若确认“暂停计时”键被按下,则跳转至程序标号“PAUSE”处,将定时器 0 计时允许控制位 TR0 置零, 则定时器暂停运行。 此动作完成后, 返回按键检测程序, 等待操作者的下一次指令。
4.3.5 秒表清零
若确认“秒表清零”键被按下,则跳转至程序标号“STOP”处,将 TR0 置零, 关闭定时器 0 运行。并且将数码管、工作寄存器、定时器 0 预置数全部重置,使其 处于秒表计时的初始状态。此动作完成后,返回按键检测程序,等待操作者的下一 次指令。
12
电子秒表设计
程序清单如下:
ORG 0000H ;程序开始 AJMP START ;跳转到主程序 START ORG 000BH ;定时器 0 中断的地址入口 AJMP TIME0 ;定时器 0 溢出,跳转到中断程序 TIME0 START: ;主程序 MOV P3,#0FFH ;输入端口 P3 全写 1 MOV P0,#3FH ; MOV P1,#3FH ; MOV P2,#0BFH ;数码管初始化 MOV 30H,#00H ; MOV R0,#00H ; MOV R1,#0AH ; MOV R2,#00H ;工作寄存器初始化 MOV TMOD,#01H ;定时器 0 工作于方式 1 MOV TH0,#0D8H ; MOV TL0,#0FEH ;定时器 0 预置数(D8FEH=55550D) SETB EA ;开总中断允许 SETB ET0 ;开定时器 0 中断允许 READ: ;读键程序 L1:JB P3.2,L2 ; LCALL DELAY ;按键延时防抖 JB P3.2,L1 ; AJMP RUN ;确认计时键被按下,开始/继续计时 L2:JB P3.3,L3 ; LCALL DELAY ;按键延时防抖 JB P3.3,L2 ; AJMP PAUSE ;确认暂停键被按下,暂停计时 L3:JB P3.4,L1 ; LCALL DELAY ;按键延时防抖 JB P3.4,L3 ; AJMP STOP ;确认清零键被按下,秒表重置 RUN: ;计时键按下,跳转至此 SETB TR0 ;定时器 0 开始/继续运行 AJMP READ ; PAUSE: ;暂停键按下,跳转至此 CLR TR0 ; AJMP READ ; TIME0: ;定时器 0 溢出,中断,跳转至此 INC 30H ; MOV A,30H ; CJNE A,#0AH,TIME1 ;30H 单元中的值到 10 了吗?(计时到 10 毫秒了吗,也就 是说,该向毫秒位送数了吗?)
13
电子秒表设计
MOV DPTR,#TAB MOV A,R0 INC R0 CJNE R0,#0AH,GET MOV R0,#00H LCALL SECOND 位 GET: MOVC A,@A+DPTR MOV P1,A MOV 30H,#00H TIME1: MOV TH0,#0D8H MOV TL0,#0FEH RETI SECOND: PUSH ACC PUSH PSW MOV A,R1 INC R1 CJNE R1,#14H,GET1 MOV R1,#0AH LCALL SECOND1 位进位 GET1: MOVC A,@A+DPTR MOV P2,A POP PSW POP ACC RET SECOND1: PUSH ACC PUSH PSW MOV A,R2 INC R2 CJNE R2,#0AH,GET2 MOV R2,#00H GET2: MOVC A,@A+DPTR MOV P0,A POP PSW POP ACC RET STOP:
;30H 中的值到 10 了,顺序执行 ; ; ;R0 中的值到 10 了吗?(该向秒位进位
了吗?) ; ;到了,R0 清零,调用进位子程序 SECOND,向秒位进 ;没到,跳过进位子程序 ; ;查表并向数码管毫秒位送数 ;重置 30H 单元 ; ; ;给定时器 0 重新预置数 ;中断返回 ;秒位进位子程序 ; ;将 ACC 和 PSW 推入堆栈保护 ; ; ;R1 中的值到 20 了吗, 也就是说, 该向十秒位进位了吗? ; ;到了。R1 重置,调用进位子程序 SECOND1,向十秒 ;没到,跳过进位子程序 ; ;查表并向数码管秒位送数 ; ;PSW,ACC 出栈 ;子程序返回 ;十秒位进位子程序 ; ;将 ACC 和 PSW 推入堆栈保护 ; ; ;R2 中的值到 10 了吗,也就是说,该将此位归零了吗? ;到了,R2 清零 ;没到,跳过清零程序 ; ;查表并向数码管十秒位送数 ; ;PSW,ACC 出栈 ;子程序返回 ;清零键按下,跳转至此
14
电子秒表设计
MOV P3,#0FFH ; MOV P0,#3FH ; MOV P1,#3FH ; MOV P2,#0BFH ;数码管清零 MOV 30H,#00H ; MOV R0,#00H ; MOV R1,#0AH ; MOV R2,#00H ;工作寄存器初始化 CLR TR0 ;计时器 0 停止计时 MOV TH0,#0D8H ; MOV TL0,#0FEH ;定时器 0 预置数 AJMP READ ; DELAY: ;延时 10ms 子程序 MOV R3,#50D ; D1:MOV R4,#100D ; D2:DJNZ R4,D2 ; DJNZ R3,D1 ; RET ;子程序返回 TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0F DH,87H,0FFH,0EFH,0BFH ;数码管段选码数表 END ;程序结束
心 得 体 会
在此次课程设计中,我主要承担程序设计的工作。 虽然秒表是一个非常简单的功能,但要在单片机中使用汇编语言来实现这个功 能,仍然花了我不少心思。 首先是计时的问题,由于单片机计时器最大只能计时 65.5ms,因此要实现毫秒 位的变化,我采用了软件计时的方法,单片机只需计时 10ms,然后用软件重复 10 次,即可达到计时 100ms 的目的。 显示方面,为了使编程简单,我使用了静态显示。不过这使得占用 I/O 口线过 多,而且连线复杂繁琐,为实物的制作带来了不便。在以后的学习和应用中我会努 力加深动态扫描显示的理解,争取熟练运用。 根据书本知识, 我们一开始只给 P0 口加上了上拉电阻, 但是实物做成后我们发 现 P1 和 P2 口得输出显示非常暗,初步确定是驱动能力不足的问题后,我们给二者
15
电子秒表设计
也加上了上拉电阻,结果使得显示正常了。由此我们了解到,实践才是检验真理的 唯一标准,有时候书本上的知识需要经过实践的改进,才能运用到实际中。 此次课程设计巩固了我的基础知识,提高了我的应用水平,锻炼了我的动手能 力,使我受益匪浅。然而,在吸取经验的同时,我也吃了不少教训。在编程、仿真 方面都走了不少弯路。但是,学则要有所收获,经过此次的锻炼,我在很多方面都 已经有所提高,知识也掌握得更加扎实了。 在今后的学习和实践中,我将继续努力钻研,提
高自己,争取在学术和记忆上 获得更大的进步。
附录 A
秒表仿真电路图
16
电子秒表设计
附录 B 源程序
ORG 0000H AJMP START ORG 000BH AJMP TIME0 START: MOV P3,#0FFH MOV P0,#3FH MOV P1,#3FH MOV P2,#0BFH MOV 30H,#00H MOV R0,#00H MOV R1,#0AH MOV R2,#00H MOV TMOD,#01H MOV TH0,#0D8H MOV TL0,#0FEH SETB EA SETB ET0 READ: L1:JB P3.2,L2 LCALL DELAY JB P3.2,L1 AJMP RUN L2:JB P3.3,L3 LCALL DELAY JB P3.3,L2 AJMP PAUSE L3:JB P3.4,L1 LCALL DELAY JB P3.4,L3 AJMP STOP RUN: SETB TR0 AJMP READ PAUSE: CLR TR0 AJMP READ TIME0: INC 30H MOV A,30H ;程序开始 ;跳转到主程序 START ;定时器 0 中断的地址入口 ;定时器 0 溢出,跳转到中断程序 TIME0 ;主程序 ;输入端口 P3 全写 1 ; ; ;数码管初始化 ; ; ; ;工作寄存器初始化 ;定时器 0 工作于方式 1 ; ;定时器 0 预置数(D8FEH=55550D) ;开总中断允许 ;开定时器 0 中断允许 ;读键程序 ; ;按键延时防抖 ; ;确认计时键被按下,开始/继续计时 ; ;按键延时防抖 ; ;确认暂停键被按下,暂停计时 ; ;按键延时防抖 ; ;确认清零键被按下,秒表重置 ;计时键按下,跳转至此 ;定时器 0 开始/继续运行 ; ;暂停键按下,跳转至此 ; ; ;定时器 0 溢出,中断,跳转至此 ; ;
17
电子秒表设计
CJNE A,#0AH,TIME1 ;30H 单元中的值到 10 了吗?(计时到 10 毫秒了吗,也就 是说,该向毫秒位送数了吗?) MOV DPTR,#TAB ;30H 中的值到 10 了,顺序执行 MOV A,R0 ; INC R0 ; CJNE R0,#0AH,GET ;R0 中的值到 10 了吗?(该向秒位进位了吗?) MOV R0,#00H ; LCALL SECOND ;到了,R0 清零,调用进位子程序 SECOND,向秒位进 位 GET: ;没到,跳过进位子程序 MOVC A,@A+DPTR ; MOV P1,A ;查表并向数码管毫秒位送数 MOV 30H,#00H ;重置 30H 单元 TIME1: ; MOV TH0,#0D8H ; MOV TL0,#0FEH ;给定时器 0 重新预置数 RETI ;中断返回 SECOND: ;秒位进位子程序 PUSH ACC ; PUSH PSW ;将 ACC 和 PSW 推入堆栈保护 MOV A,R1 ; INC R1 ; CJNE R1,#14H,GET1 ;R1 中的值到 20 了吗, 也就是说, 该向十秒位进位了吗? MOV R1,#0AH ; LCALL SECOND1 ;到了。R1 重置,调用进位子程序 SECOND1,向十秒 位进位 GET1: ;没到,跳过进位子程序 MOVC A,@A+DPTR ; MOV P2,A ;查表并向数码管秒位送数 POP PSW ; POP ACC ;PSW,ACC 出栈 RET ;子程序返回 SECOND1: ;十秒位进位子程序 PUSH ACC ; PUSH PSW ;将 ACC 和 PSW 推入堆栈保护 MOV A,R2 ; INC R2 ; CJNE R2,#0AH,GET2 ;R2 中的值到 10 了吗,也就是说,该将此位归零了吗? MOV R2,#00H ;到了,R2 清零 GET2: ;没到,跳过清零程序 MOVC A,@A+DPTR ; MOV P0,A ;查表并向数码管十秒位送数 POP PSW ; POP ACC ;PSW,ACC 出栈
18
电子秒表设计
RET ;子程序返回 STOP: ;清零键按下,跳转至此 MOV P3,#0FFH ; MOV P0,#3FH ; MOV P1,#3FH ; MOV P2,#0BFH ;数码管清零 MOV 30H,#00H ; MOV R0,#00H ; MOV R1,#0AH ; MOV R2,#00H ;工作寄存器初始化 CLR TR0 ;计时器 0 停止计时 MOV
TH0,#0D8H ; MOV TL0,#0FEH ;定时器 0 预置数 AJMP READ ; DELAY: ;延时 10ms 子程序 MOV R3,#50D ; D1:MOV R4,#100D ; D2:DJNZ R4,D2 ; DJNZ R3,D1 ; RET ;子程序返回 TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0F DH,87H,0FFH,0EFH,0BFH ;数码管段选码数表 END ;程序结束
参 考 文 献
1.《单片机原理及接口技术》 ,刘全利编著,高等教育出版社,2009 年。 2.《计算机接口技术试验指导书》 ,黄艳玲主编,重庆大学出版社。
19
电子秒表设计
20
《单片机原理及接口技术》课程设计
——单片机秒表的设计
学
院: 机电工程学院
专业班级: 10 级电气工程二班 姓 学 名: 姚杜村 号: 1002120208 杨坤漓
指导教师: 宋东亚 时
间:2012 年 11 月 20 日―2013 年 01 月 05 日
电子秒表设计
目
录
序 言 .......................................................... 2 第一章 绪 论 ................................................... 3 1.1 概 述 .................................................... 3 1.2 设计任务 ................................................. 3 1.3 设计目的 ................................................. 3 第二章 设计任务及内容........................................... 3 2.1 设计题目 ................................................. 3 2.2 设计内容 ................................................. 3 2.3 功能分析 ................................................. 4 第三章总体设计及核心器件简介..................................... 4 3.1 硬件设计 ................................................. 4 3.1.1 89C51 单片机 ................................................................................... 4 3.1.2 晶体振荡电路 .................................................................................. 5 3.1.3 复位电路........................................................................................... 6 3.1.4 按键电路........................................................................................... 6 3.1.5 显示电路........................................................................................... 7 3.2 软件设计 ................................................ 8 3.2.1 程序设计思想 .................................................................................. 8 3.2.2 系统资源的分配 .............................................................................. 8 3.2.3 主程序设计 ...................................................................................... 8 3.2.4 中断程序设计 .................................................................................. 8 第四章 数字电子秒表的调试 ...................................... 10 4.1 软件的仿真与调试 ....................................... 10 4.2 硬件的调试 ............................................. 11 4.2.1 晶振电路的测试 ............................................................................ 11 4.2.2 复位电路的测试 ............................................................................ 11 4.3 程序设计 ................................................. 12 4.3.1 秒表的初始化 ................................................................................ 12 4.3.2 开始计时......................................................................................... 12 4.3.3 计时程序.......................................................................................
.. 12 4.3.4 暂停计时......................................................................................... 12 4.3.5 秒表清零......................................................................................... 12 心 得 体 会 .................................................... 15 附录 A 秒表仿真电路图 ......................................... 16 附录 B 源程序 .................................................. 17 参 考 文 献 .................................................... 19
1
电子秒表设计
序 言
随着电子技术的发展, 电子技术在各个领域的运用也越来 越广泛,人对它的认识也逐步加深。作为一个学习电气专业的 当代大学生来说,我们不但要有扎实的基础知识、课本知识, 还应有较强的动手能力。现实也要求我们既精通电子技术理 论,更要掌握电子电路设计、实验研究和调试技术。 秒表计时器秒表计时器常常用于体育竞赛及各种其他要 求有较精确时间的各领域中。其中启/停开关的使用方法与传 统的机械计时器相同,即按一下启/停开关,启动计时器开始 计时,再按一下启/停开关计时终止。而复位开关可以在任何 情况下使用,即使在计时过程中,只要按一下复位开关,计时 应立即终止,并对计时器清零。本设计就是利用所学到的电子 元器件将脉冲源用数码管显示出来,以制承诺简易的秒表。 电子秒表是重要的计时工具,广泛应用于各行各业。可以 用来测量物体的速度和加速度, 可以用来验证牛顿第二定律和 机械能守恒等物理实验。相对其他计时工具具有便捷、准确、 可比性高等优点。减少工作人员的负担,降低错误率。 姚 杜 村
2
电子秒表设计
第一章 绪 论
1.1 概 述
单片微型计算机简称单片机,又称微控制器,是微型计算机的一个重要分支。 单片机是 20 世纪七十年代中期发展起来的一种大规模集成电路芯片,是集 CPU、 RAM、ROM、I/O 接口和终端系统与同一硅片的器件。20 世纪八十年代以来单片机 发展迅速各类新产品不断涌现出现许多新产品,出现了许多高性能新型机种现已成 为工业控制和各控制领域的支柱产业之一。由于单片机功能强、体积小、可靠性好、 价格便宜等独特优点因而受到人们的高度重视并取到了一系列的科研成果,成为传 统工业技术改造和新产品更新换代的理想机种,并具有广阔的发展前景。 本设计运用所学的单片机知识,将单片机与普通秒表相结合设计了电子秒表, 具有显示直观、读取方便、精度高等优良特点,在计时中应用广泛。
1.2 设计任务
以单片机为核心,设计一个秒表,具有计时功能,按键有启动计时、数据清零、 停止、时间显示。
1.3 设计目的
加强对 51 系列单
片机的构造了解及应用,熟悉汇编语言或 C 语言编程,综合 掌握和理解设计各部分的工作原理、设计过程、芯片器件的选择方法、模块化编程 等多项知识。 (1)用单片机模拟实现具体应用使个人设计系统能够真正使用; (2) 把理论知识与实践知识相结合, 充分发挥个人能力, 并在实践中得到锻炼; (3)提高利用已学的知识分析和解决问题的能力; (4)提高动手实践能力。
第二章 设计任务及内容
2.1 设计题目
秒表的设计
2.2 设计内容
3
电子秒表设计
(1)填写设计任务书; (2)进行总体设计,画出设计原理图; (3)用 PROTEUS 软件画出设计电路图; (4)用 Keil 软件编写程序; (5)在 PROTEUS 里模拟并调试程序达到期望功能。
2.3 功能分析
采用 3 个 LED 数码管显示时间,计时范围设置为 0~99.9 秒,即精确到 0.1 秒, 用按键控制秒表的“开始”、“暂停”、“复位”,按“开始”按键,开始计时; 按“暂停”按键,系统暂停计时;再按“开始”键,系统继续计时;数码管显示当 前计时值;按“复位”按键,系统清零。
第三章 总体设计及核心器件简介
本实验利用单片机的定时器/计数器定时和计数的原理,通过采用 Proteus 仿真 软件来模拟实现。模拟 AT89C51 单片机、LED 数码管以及控件来控制秒表的计数 以及计时的开启、暂停、继续、与复位。其中有三个数码管来显示数据,两个数码 管显示秒 (两位) 另一个数码管显示十分之一秒, , 十分之一秒的数码管计数从 0~9, 满十进一后显示秒得数码管的个位加一,并且十分之一秒显示清零重新从零计数。 同理当个位满十进一后个位也清零重新计数 ,当计时超过范围(即超过 99.9 秒) 后,所有数码管全部清零重新计数。
3.1 硬件设计
3.1.1 89C51 单片机
MCS-51 系列单片机是 8 位单片机产品,89C51 是其中的典型代表,基本模 块包括以下几个部分: (1) CPU:89C51 的 CPU 是 8 位的,另外 89C51 内部有 1 个位处理器 (2) R0M:4KB 的片内程序存储器,存放开发调试完成的应用程序 (3) RAM:256B 的片内数据存储器,容量小,但作用大
4
电子秒表设计
(4) I/O 口:P0-P3,共 4 个口 32 条双向且可位寻址的 I/O 口线 (5) 中断系统:共 5 个中断源,3 个内部中断,2 个外部中断 (6) 定时器/计数器:2 个 16 位的可编程定时器/计数器 (7) 通用串行口:全双工通用异步接收器/发送器 (8) 振荡器:89C51 的外接晶振与内部时钟振荡器为 CPU 提供时钟信号 (9) 总线控制:89C51 对外提供若干控制总线,便于系统扩展
89C51 的引脚如下图:
89C51 单片机引脚图
3.1.2
晶体振荡电路
89C51 单片机内部的振荡电路是
一个高增益反相放大器, 引线 XTAL1 和 XTAL2 分别为反相振荡放大器的输入及内部时钟工作电路的输入和来自反相振荡器的 输出,该反相放大器可以配置为片内振荡器。 这里选用 51 单片机 12MHZ 的内部振荡方式,电路如下:C2、C3 起稳定振荡 频率、快速起振的作用
5
电子秒表设计
晶振电路
3.1.3
复位电路
采用上电复位,上电后,由于电容充电,使 RST 持续一段时间的高电平,从 而实现上电复位操作。 这不仅能使单片机复位,还能是单片机的外围设备同时复 位,当程序出现错误时,可以随时使电路复位。 电路图如下:
复位电路
3.1.4
按键电路
当按键被按下时,相应的引脚被拉低,经扫描后,获得键值,并执行键功能 程序,因此按下不同的按键,将执行不同的功能程序。 电路图如下:
6
电子秒表设计
按键电路
3.1.5
显示电路
采用3个 LED 数码管,LED 是七段显示器,内部有 7 个条形发光二极管和 1 个小圆点发光二极管,根据各管的亮暗组成字符。 在用数码管显示时, 有静态和动态两种选择, 这里采用 LED 动态显示, P0、 用 P1、 P2 口驱动显示,由于 P0 口没有上拉电阻,因此 P0 口需要外接上拉电阻才 能输出高电平,这里使用 8 个 4.7k 的电阻作为上拉电阻。 电路图如下:
显示电路 3.1.5
7
电子秒表设计
3. 2
软件设计
3.2.1 程序设计思想
结合电路,程序的总体思路 如图 3.1.5。
3.2.2 系统资源的分配
本设计系统所用到的单片机端口数比较多,所以在这里将对数字电子秒表的硬 件资源的大概分配加以说明。片内 RAM 的分配、各功能键的定义以及各端口的分配 安排如表 3.3 所示。 表 3.3 端口的分配安排表 名称 7BH-7DH R3- R5 定时器 T0 外部中断 INT0 外部中断 INT1 功能描述 0.1s-10s 位显示寄存区 0.1s-10s 位溢出计数区 控制秒表的最小精度 停止中断信号入口 开始中断信号入口 3CB0H 初始化值 00H
3.2.3 主程序设计
本系统程序主要模块由主程序、 定时中断服务程序、 外部中断 INT0 服务程序和 外部中断 INT1 服务程序组成。 其中主程序是整个程序的主体。 可以对各个中断程序 进行调用,协调各个子程序之间的联系。 系统(上电)复位后,进入主程序,主程序流程图如图 3.11。首先对系统进行 初始化,包括设置各入口地址、中断的开启、对各个数据缓存区清“0”、赋定时器 初值,初始化完毕后,就进入数码管显示程序。数码管显示程序对显示缓存区内的 数值进行调用并在数码管上进行动态显示。 显示一次就对 P3.4 进行一次扫描, 查询 启动键 P3.4 是否按下,当启动键按下后,数码管全零显示,没有按下则返回开始, 重新循环显示数字 8。 在
主程序中还进行了赋寄存区的初始值、设置定时器初值以及开启外部中断等 操作,当定时时间到后就转去执行定时中断程序。当外部中断有请求则去执行外部 中断服务程序,并在执行完后返回主程序。
3.2.4 中断程序设计
现在方案中采用了两个中断,外部中断 INT0,INT1。CPU 在响应中断时,先处 理高级中断,在处理低级中断,若有多个同级中断时,则按自然优先顺序处理。例 如当 CPU 正在处理一个中断申请时,有出现了另一个优先级比它高的中断请求,这
8
电子秒表设计
是,CPU 就暂停终止对当前优先级较低的中断源的服务,转去响应优先级比它高的 中断请求,并为其服务。待服务结束,再继续执行原来较低级的中断服务程序。而 当 CPU 为级别高的终端服务程序服务时, 如果级别低的中断发出中断请求, 此时 CPU 是不会响应的,所以为了避免开始和暂停两个按键中的一个出现没有响应的情况, 在进行程序编辑时要注意对中断的使用,避免出现中断的嵌套。,合理分配中断对 本设计的实现是至关重要的。
80C51 的自然优先级顺序排列如下: 中断源 外部中断 INT0 定时/计数器 T0 溢出中断 外部中断 INT1 定时/计数器 T1 溢出中断 串行口中断 最低 最高
数字式秒表中的两个按键采用了中断实现功能。开始采用外部中断 INT0,停止 采用外部中断 INT1。另外程序中还用到了定时/计数器 0 溢出中断进行计时。依据 设计要求,停止的外部中断 INT1 中断级别最高,计时的定时/计数器 0 溢出中断次 之,开始的外部中断 INT0 级别最低。 (1)外部中断 INT0 服务程序 外部中断 INT0 服务程序结合外部 P3.2 开始键实现数字电子秒表的计时开始功 能,具体流程图如图 2.12。 当按下 P3.2 开始键按下向 CPU 发出外部中断请求,CPU 转向外部中断 0 服务 程序执行,启动定时器 T0。
9
电子秒表设计
主程序流程图
第四章 数字电子秒表的调试
4.1 软件的仿真与调试
10
电子秒表设计
Proteus ISIS 是英国 Labcenter 公司开发的电路分析与实物仿真软件,它可以 仿真、 分析(SPICE)各种模拟器件和集成电路。 该软件的主要特点总结后有以下四点: ①实现了单片机仿真和 SPICE 电路仿真相结合的功能。②支持目前主流单片机系统 的仿真。③提供了软件调试功能,并可以与 WAVE 联合仿真调试。④具有强大的原理 图绘制功能。总之,该软件是一款集单片机和 SPICE 分析于一身的仿真软件,功能 极其强大。在电子领域中也起到了很大的作用,它的出现仿真不需要先焊接电路, 可以先仿真调试通过后在焊电路,节省了不少在硬件调试上所花的时间。 Proteus ISIS 的工作界面是一种标准的
Windows 界面。它包括标题栏、主 菜单、状态栏、标准工具栏、绘图工具栏、对象选择按钮、预览对象方位控制按 钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口等十几个工 具,方便了使用者的使用。 Proteus SISI 绘制原理图的操作与 Protel 99se 绘制原理图的操作基本相同, 在这里就不再作赘述。下面拿本设计中的一个仿真例子作简述说明。运行 Proteus SISI 后,绘制病床呼叫系统的原理图。 首先打开已经画好的 proteus DSN 文件,双击图中的 80C51 芯片,就弹出一个 窗口,在 Program File 项中通过路径选择在 WAVE 中生成的 HEX 文件,双击选中后 确定,这样仿真图中的 80C51 芯片就已经读取了本设计中的 HEX 文件。单击“三角 形按钮”进行仿真。通过对仿真结果的观察来对程序进行修改,最终使程序到达设 计要求。
4. 2
硬件的调试
按照之前设计好的数字电子秒表原理图,检测电路中是否存在短路。因为系统
采用的是共阴极数码管作为显示电路,必须确保数码管的公共端接的是低电平。
4.2.1 晶振电路的测试
在单片机正常运行的必要条件是单片机系统的时钟稳定正常。实际中,因为各 种原因导致系统时钟不正常而出现系统无法正常运行,因此系统时钟是否振动是通 电检查的首要环节。
4.2.2 复位电路的测试
复位不正常也会导致系统不能工作。如果复位引脚始终为高电平,系统将始终 处于复位状态;如果始终为低电平,不能产生复位所需的高电平信号脉冲,则系统 也可能无法正常工作。单片机正常工作时,RST 复位引脚应为 0V,按下复位按键时, 复位引脚为高电平 5V 左右。
11
电子秒表设计
4.3 程序设计
程序的各个组成模块及工作流程描述:
4.3.1 秒表的初始化
根据程序流程图,先进行秒表的初始化,即:①将 I/O 口 P3 全写一,为秒表的 控制输入做好准备;②将数码管全部置零,使其处于秒表计时的初始状态;③将工 作寄存器 R0~R2 以及 30H 初始化,留待后面的计时程序备用;④将定时器 0 置于 工作方式 1,并为其装入计时预置数 D8FE(因为程序运行过程中占用的时间会导致 一定误差,此为经实物测试之后的修正值),即将定时器定为每 10ms 溢出;⑤开 总中断允许和定时器 0 中断允许。初始化完成后,即进入之后的按键扫描程序。
4.3.2 开始计时
若确认“开始计时”键被按下,则跳转至程序标号“RUN”处,将定时器 0 计 时允许控制位 TR0 置位,则定时器开始运行。此动作完成后,返回按键检测程序, 等待操作者的下一次指令。
4.3.3 计时程序
定时器 0 计时至 10ms,溢出,引发中断,程序跳转至定时器 0 中断服务程序入
口 000BH 处执行。 程序跳转至中断服务程序 TIME0。 由于秒表的最小计时单位是 0.1s, 即 100ms,因此需加入软件计时,使定时器 0 溢出 10 次之后才改变数码管的显示状 态。因此每来一次中断就将 30H 中的数加 1,若 30H 中的数没有到 10,则给定时器 0 重新装入预置数,之后中断返回并继续等待中断;到 10 了,才进入显示程序,改 变数码管的显示状态,执行完毕之后中断返回并继续等待中断。
4.3.4 暂停计时
若确认“暂停计时”键被按下,则跳转至程序标号“PAUSE”处,将定时器 0 计时允许控制位 TR0 置零, 则定时器暂停运行。 此动作完成后, 返回按键检测程序, 等待操作者的下一次指令。
4.3.5 秒表清零
若确认“秒表清零”键被按下,则跳转至程序标号“STOP”处,将 TR0 置零, 关闭定时器 0 运行。并且将数码管、工作寄存器、定时器 0 预置数全部重置,使其 处于秒表计时的初始状态。此动作完成后,返回按键检测程序,等待操作者的下一 次指令。
12
电子秒表设计
程序清单如下:
ORG 0000H ;程序开始 AJMP START ;跳转到主程序 START ORG 000BH ;定时器 0 中断的地址入口 AJMP TIME0 ;定时器 0 溢出,跳转到中断程序 TIME0 START: ;主程序 MOV P3,#0FFH ;输入端口 P3 全写 1 MOV P0,#3FH ; MOV P1,#3FH ; MOV P2,#0BFH ;数码管初始化 MOV 30H,#00H ; MOV R0,#00H ; MOV R1,#0AH ; MOV R2,#00H ;工作寄存器初始化 MOV TMOD,#01H ;定时器 0 工作于方式 1 MOV TH0,#0D8H ; MOV TL0,#0FEH ;定时器 0 预置数(D8FEH=55550D) SETB EA ;开总中断允许 SETB ET0 ;开定时器 0 中断允许 READ: ;读键程序 L1:JB P3.2,L2 ; LCALL DELAY ;按键延时防抖 JB P3.2,L1 ; AJMP RUN ;确认计时键被按下,开始/继续计时 L2:JB P3.3,L3 ; LCALL DELAY ;按键延时防抖 JB P3.3,L2 ; AJMP PAUSE ;确认暂停键被按下,暂停计时 L3:JB P3.4,L1 ; LCALL DELAY ;按键延时防抖 JB P3.4,L3 ; AJMP STOP ;确认清零键被按下,秒表重置 RUN: ;计时键按下,跳转至此 SETB TR0 ;定时器 0 开始/继续运行 AJMP READ ; PAUSE: ;暂停键按下,跳转至此 CLR TR0 ; AJMP READ ; TIME0: ;定时器 0 溢出,中断,跳转至此 INC 30H ; MOV A,30H ; CJNE A,#0AH,TIME1 ;30H 单元中的值到 10 了吗?(计时到 10 毫秒了吗,也就 是说,该向毫秒位送数了吗?)
13
电子秒表设计
MOV DPTR,#TAB MOV A,R0 INC R0 CJNE R0,#0AH,GET MOV R0,#00H LCALL SECOND 位 GET: MOVC A,@A+DPTR MOV P1,A MOV 30H,#00H TIME1: MOV TH0,#0D8H MOV TL0,#0FEH RETI SECOND: PUSH ACC PUSH PSW MOV A,R1 INC R1 CJNE R1,#14H,GET1 MOV R1,#0AH LCALL SECOND1 位进位 GET1: MOVC A,@A+DPTR MOV P2,A POP PSW POP ACC RET SECOND1: PUSH ACC PUSH PSW MOV A,R2 INC R2 CJNE R2,#0AH,GET2 MOV R2,#00H GET2: MOVC A,@A+DPTR MOV P0,A POP PSW POP ACC RET STOP:
;30H 中的值到 10 了,顺序执行 ; ; ;R0 中的值到 10 了吗?(该向秒位进位
了吗?) ; ;到了,R0 清零,调用进位子程序 SECOND,向秒位进 ;没到,跳过进位子程序 ; ;查表并向数码管毫秒位送数 ;重置 30H 单元 ; ; ;给定时器 0 重新预置数 ;中断返回 ;秒位进位子程序 ; ;将 ACC 和 PSW 推入堆栈保护 ; ; ;R1 中的值到 20 了吗, 也就是说, 该向十秒位进位了吗? ; ;到了。R1 重置,调用进位子程序 SECOND1,向十秒 ;没到,跳过进位子程序 ; ;查表并向数码管秒位送数 ; ;PSW,ACC 出栈 ;子程序返回 ;十秒位进位子程序 ; ;将 ACC 和 PSW 推入堆栈保护 ; ; ;R2 中的值到 10 了吗,也就是说,该将此位归零了吗? ;到了,R2 清零 ;没到,跳过清零程序 ; ;查表并向数码管十秒位送数 ; ;PSW,ACC 出栈 ;子程序返回 ;清零键按下,跳转至此
14
电子秒表设计
MOV P3,#0FFH ; MOV P0,#3FH ; MOV P1,#3FH ; MOV P2,#0BFH ;数码管清零 MOV 30H,#00H ; MOV R0,#00H ; MOV R1,#0AH ; MOV R2,#00H ;工作寄存器初始化 CLR TR0 ;计时器 0 停止计时 MOV TH0,#0D8H ; MOV TL0,#0FEH ;定时器 0 预置数 AJMP READ ; DELAY: ;延时 10ms 子程序 MOV R3,#50D ; D1:MOV R4,#100D ; D2:DJNZ R4,D2 ; DJNZ R3,D1 ; RET ;子程序返回 TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0F DH,87H,0FFH,0EFH,0BFH ;数码管段选码数表 END ;程序结束
心 得 体 会
在此次课程设计中,我主要承担程序设计的工作。 虽然秒表是一个非常简单的功能,但要在单片机中使用汇编语言来实现这个功 能,仍然花了我不少心思。 首先是计时的问题,由于单片机计时器最大只能计时 65.5ms,因此要实现毫秒 位的变化,我采用了软件计时的方法,单片机只需计时 10ms,然后用软件重复 10 次,即可达到计时 100ms 的目的。 显示方面,为了使编程简单,我使用了静态显示。不过这使得占用 I/O 口线过 多,而且连线复杂繁琐,为实物的制作带来了不便。在以后的学习和应用中我会努 力加深动态扫描显示的理解,争取熟练运用。 根据书本知识, 我们一开始只给 P0 口加上了上拉电阻, 但是实物做成后我们发 现 P1 和 P2 口得输出显示非常暗,初步确定是驱动能力不足的问题后,我们给二者
15
电子秒表设计
也加上了上拉电阻,结果使得显示正常了。由此我们了解到,实践才是检验真理的 唯一标准,有时候书本上的知识需要经过实践的改进,才能运用到实际中。 此次课程设计巩固了我的基础知识,提高了我的应用水平,锻炼了我的动手能 力,使我受益匪浅。然而,在吸取经验的同时,我也吃了不少教训。在编程、仿真 方面都走了不少弯路。但是,学则要有所收获,经过此次的锻炼,我在很多方面都 已经有所提高,知识也掌握得更加扎实了。 在今后的学习和实践中,我将继续努力钻研,提
高自己,争取在学术和记忆上 获得更大的进步。
附录 A
秒表仿真电路图
16
电子秒表设计
附录 B 源程序
ORG 0000H AJMP START ORG 000BH AJMP TIME0 START: MOV P3,#0FFH MOV P0,#3FH MOV P1,#3FH MOV P2,#0BFH MOV 30H,#00H MOV R0,#00H MOV R1,#0AH MOV R2,#00H MOV TMOD,#01H MOV TH0,#0D8H MOV TL0,#0FEH SETB EA SETB ET0 READ: L1:JB P3.2,L2 LCALL DELAY JB P3.2,L1 AJMP RUN L2:JB P3.3,L3 LCALL DELAY JB P3.3,L2 AJMP PAUSE L3:JB P3.4,L1 LCALL DELAY JB P3.4,L3 AJMP STOP RUN: SETB TR0 AJMP READ PAUSE: CLR TR0 AJMP READ TIME0: INC 30H MOV A,30H ;程序开始 ;跳转到主程序 START ;定时器 0 中断的地址入口 ;定时器 0 溢出,跳转到中断程序 TIME0 ;主程序 ;输入端口 P3 全写 1 ; ; ;数码管初始化 ; ; ; ;工作寄存器初始化 ;定时器 0 工作于方式 1 ; ;定时器 0 预置数(D8FEH=55550D) ;开总中断允许 ;开定时器 0 中断允许 ;读键程序 ; ;按键延时防抖 ; ;确认计时键被按下,开始/继续计时 ; ;按键延时防抖 ; ;确认暂停键被按下,暂停计时 ; ;按键延时防抖 ; ;确认清零键被按下,秒表重置 ;计时键按下,跳转至此 ;定时器 0 开始/继续运行 ; ;暂停键按下,跳转至此 ; ; ;定时器 0 溢出,中断,跳转至此 ; ;
17
电子秒表设计
CJNE A,#0AH,TIME1 ;30H 单元中的值到 10 了吗?(计时到 10 毫秒了吗,也就 是说,该向毫秒位送数了吗?) MOV DPTR,#TAB ;30H 中的值到 10 了,顺序执行 MOV A,R0 ; INC R0 ; CJNE R0,#0AH,GET ;R0 中的值到 10 了吗?(该向秒位进位了吗?) MOV R0,#00H ; LCALL SECOND ;到了,R0 清零,调用进位子程序 SECOND,向秒位进 位 GET: ;没到,跳过进位子程序 MOVC A,@A+DPTR ; MOV P1,A ;查表并向数码管毫秒位送数 MOV 30H,#00H ;重置 30H 单元 TIME1: ; MOV TH0,#0D8H ; MOV TL0,#0FEH ;给定时器 0 重新预置数 RETI ;中断返回 SECOND: ;秒位进位子程序 PUSH ACC ; PUSH PSW ;将 ACC 和 PSW 推入堆栈保护 MOV A,R1 ; INC R1 ; CJNE R1,#14H,GET1 ;R1 中的值到 20 了吗, 也就是说, 该向十秒位进位了吗? MOV R1,#0AH ; LCALL SECOND1 ;到了。R1 重置,调用进位子程序 SECOND1,向十秒 位进位 GET1: ;没到,跳过进位子程序 MOVC A,@A+DPTR ; MOV P2,A ;查表并向数码管秒位送数 POP PSW ; POP ACC ;PSW,ACC 出栈 RET ;子程序返回 SECOND1: ;十秒位进位子程序 PUSH ACC ; PUSH PSW ;将 ACC 和 PSW 推入堆栈保护 MOV A,R2 ; INC R2 ; CJNE R2,#0AH,GET2 ;R2 中的值到 10 了吗,也就是说,该将此位归零了吗? MOV R2,#00H ;到了,R2 清零 GET2: ;没到,跳过清零程序 MOVC A,@A+DPTR ; MOV P0,A ;查表并向数码管十秒位送数 POP PSW ; POP ACC ;PSW,ACC 出栈
18
电子秒表设计
RET ;子程序返回 STOP: ;清零键按下,跳转至此 MOV P3,#0FFH ; MOV P0,#3FH ; MOV P1,#3FH ; MOV P2,#0BFH ;数码管清零 MOV 30H,#00H ; MOV R0,#00H ; MOV R1,#0AH ; MOV R2,#00H ;工作寄存器初始化 CLR TR0 ;计时器 0 停止计时 MOV
TH0,#0D8H ; MOV TL0,#0FEH ;定时器 0 预置数 AJMP READ ; DELAY: ;延时 10ms 子程序 MOV R3,#50D ; D1:MOV R4,#100D ; D2:DJNZ R4,D2 ; DJNZ R3,D1 ; RET ;子程序返回 TAB: DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,3FH,86H,0DBH,0CFH,0E6H,0EDH,0F DH,87H,0FFH,0EFH,0BFH ;数码管段选码数表 END ;程序结束
参 考 文 献
1.《单片机原理及接口技术》 ,刘全利编著,高等教育出版社,2009 年。 2.《计算机接口技术试验指导书》 ,黄艳玲主编,重庆大学出版社。
19
电子秒表设计
20