单片机原理实验5

更新时间:2023-03-08 06:22:57 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

单片机原理实验讲义

郭海燕 周小方编

漳州师范学院物理与电子信息工程系

2010年11月

单片机原理实验

前 言

随着微电子技术的发展,当前各种电子设备中几乎都能见到微控制器的身影,《单片机原理》课程是电子信息科学与技术、电子信息工程、电气工程及其自动化等本科专业学生的重要专业课,是这些专业学生首次学习与微控制器有关的课程,学好本课程内容,掌握单片机应用系统程序设计方法,养成良好的设计规范,对学生进一步学习其它功能更强、复杂性更高的微控制器(或微处理器)有重要意义。

课程主要讲述51系列单片机的内部结构、指令系统和编程设计方法,是一门实践性很强的课程。本实验讲义共安排六个实验,分别为:

实验一、单片机集成开发环境入门;

实验二、I/O口输入输出实验――循环灯程序设计;

实验三、I/O口输入输出实验――LED数码管动态显示与按键去抖程序设计; 实验四、定时器应用实验――LED数码动态显示与矩阵键盘赋值程序设计; 实验五、计数器应用实验――基于热敏电阻和555电路的简易温度报警系统设计; 实验六、中断实验――简易温度控制器设计。

其中实验一是入门实验,为基础性实验,另五个实验为设计性、综合性实验。

围绕“简易温度控制器”这个实际应用系统的设计的各个环节展开,每个实验完成最终系统的一个或二个子模块的设计,最终将各模块集成为一个完整系统。本实验采用自制实验板,三名学生领用1套实验板和1条下载线,组成讨论小组,以个人电脑为设计平台,利用课外时间完成设计、仿真和调试等前期工作,在利用课内2课时时间集中进行点评和设计总结。五个设计性、综合性实验均采用“WAVE 3.2”集成开发环境完成程序设计、仿真,并最终下载到自制的系统板中运行,其设计、仿真、调试过程与真实的工程设计无异,全方位实践CDIO工程教育理念,突出“构思(Conceive)、设计(design)、实现(implement)”三个重要环节,对提高学生工程创新能力、综合应用所学知识解决实际工程问题的能力有重要作用。

在单片机应用系统设计中,最核心的问题如何构建系统监控程序,最重要的程序设计方法是模块化程序设计法,最重要的系统分析方法是状态及转移分析法。本讲义的五个设计性实验的设计内容着重突出状态及转移分析法和模块化程序设计法,力图让学生初步建立单片机应用系统程序的宏观结构框架,而不过分纠缠各种算法子程序的微观结构及编程技巧。就前者而言,未能应用系统程序的宏观结构框架,意味着课程教学目标未能达到;就后者而言,建立后者需经长期专业工作的积累,对初学者不能要求过高,且有各种资料可供参考。

i

单片机原理实验

目 录

前言

实验一、单片机集成开发环境入门

实验二、I/O口输入输出实验――循环灯程序设计

实验三、I/O口输入输出实验――LED数码管动态显示与按键去抖程序设计 实验四、定时器应用实验――LED数码动态显示与矩阵键盘赋值程序设计

实验五、计数器应用实验――基于热敏电阻和555电路的简易温度报警系统设计 实验六、中断实验――简易温度控制器设计

附录一、WAVE 3.2集成开发环境菜单及其功能说明 附录二、AT89S52实验板硬件原理图

附录三、单片机ISP下载编程软件及USB下载器简介 附录四、“简易温度控制器”设计项目程序汇总

ii

单片机原理实验

实验一、单片机集成开发环境入门

一、

实验目地

1. 掌握单片机集成开发软件“WAVE 3.2”的开发环境配置。

2. 掌握单片机集成开发软件“WAVE 3.2”的基本功能,了解MCS-51系列单片机

应用系统的软件开发过程。

? 掌握创建工程项目和管理工程项目的方法。

? 掌握MCS-51系列单片机汇编程序的编辑、编译方法。

? 掌握MCS-51系列单片机汇编程序的仿真调试方法和观察窗口的使用。

二、 实验设备

PC 兼容机一台,操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”。

三、 实验原理

1. 单片机集成开发软件“WAVE 3.2”简介

单片机应用程序的设计步骤通常可分为以下几步:(1)根据单片机应用系统的功能进行算法构思和设计,画出程序流程图;(2)用单片机汇编语言、C语言或PLM语言(初学者一般应采用汇编语言)编写源程序;(3)将源程序翻译成单片机可执行的机器码程序,即所谓的目标程序,该过程称为汇编或编译;(4)程序调试,将目标程序下载到目标单片机(即应用系统板中的单片机),运行目标程序,对运行结果进行监控。若运行结果与预期结果相符,程序正确,调试结束;否则由结果的差异分析算法或程序的可能错误,重复步骤2至4,修改源程序、重新汇编、再调试,直至程序正确。以上步骤2至4可应用单片机集成开发软件在个人计算机上完成。

“WAVE 3.2”是一款功能强大的单片机集成开发软件,可开发多个系列的单片机应用系统。该软件主要功能有:(1)集成了文本编辑器,可对源程序进行编辑、修改;(2)集成了汇编器,可对源程序进行汇编,自动查找源程序中的语法错误,并将无语法错误的源程序翻译成目标程序;(3)集成了仿真调试器,可对目标系统进行在线仿真调试,也可在个人计算机上对目标程序进行模拟仿真调试。

在线仿真调试,必需借助硬件仿真器,PC机通过硬件仿真器与目标系统相连,可用PC机监控目标程序的运行,目标单片机内部RAM和特殊功能寄存器的值可实时反馈回PC机。程序员通过分析目标单片机内部RAM和特殊功能寄存器的值、观测目标程序与单片机应用系统的配合情况,判断系统的软硬件是否正确。

模拟仿真调试是一种纯软件模拟,它直接利用PC机的资源,在PC机上模拟目标程序的运行,并显示虚拟单片机内部RAM和特殊功能寄存器的值,程序员通过分析虚拟单片机内部RAM和特殊功能寄存器的值仅能判断与硬件无关的那部分软件的正确与否,无法判断单片机应用系统的硬件是否正确,目标程序与系统硬件是否匹配。

由于在线仿真调试需要硬件仿真器,设备成本较高,使用较复杂,不利于普及。因此,本课程的实验将采用模拟仿真调试与硬件无关的部分软件(这部分软件所占比例很大),采用将目标程序下载到目标系统中实际运行,进行软硬件综合调试。

2. 集成开发软件“WAVE 3.2”的界面

1

单片机原理实验

启动“WAVE 3.2”后,集成开发软件的界面如图1.1所示,菜单功能见附录一。

主菜单

工具栏

观察窗口项目窗口

图1.1:WAVE集成开发环境界面

编辑窗口

3. 单片机应用程序设计及调试方法

以下举例说明51系列单片机应用程序设计及调试的主要方法,主要步骤如下:①创建工程项目,编辑源程序;②汇编或编译;③使用软件模拟器及观察窗口调试程序。

以实现“从P1.0口输出1Hz方波”程序为例。先进行算法设计,若每隔500mS将P1.0求反,则P1.0口将输出频率为1Hz的方波,程序流图如图1.2和图1.3所示。为了能在本例中能尽可能多地实践程序调试方法,我们故意将500mS延时子程序复杂化,采用二级子程序嵌套,并引入十进制加法运算。该程序的汇编源程序清单如下

ORG 0000H LJMP MAIN ORG 0030H

MOV SP,#60H ;初始化

ACALL DELAY ;调用500mS延时子程序 SJMP MAIN1

(30H)十进制加1 (30H)=50H ? Y返回 图1.3:50mS延时子程

2

开始 初始化 P1.0求反 调用500mS延时子程序 图1.2:产生方波流程循环变量(30H)=0 调用10mS延时子程序 MAIN:

MAIN1: XRL P1,#01H ;P1.0求反

NDELAY: MOV 30H,#0 ;500mS延时子程序 DELAY1: ACALL D10MS ;调用10mS延时子程序

MOV A,30H

单片机原理实验

ADD A,#01H DA A MOV 30H,A

CJNE A,#50H,DELAY1 RET

D10MS: MOV R6,#20 ;延时(2*R7+4)*R6+5=10005机器周 D10MS1: MOV R7,#248

NOP DJNZ R7,$ DJNZ R6,D10MS1 RET

END

3.1 创建工程项目

①建立一个工作文件夹(不妨取为E:\\学号\\实验一)用于保存与本例的工程项目有关的各种文件。

②启动WAVE软件,系统将自动打开最近使用过的工程项目,将所有窗口全部关闭。 ③编辑源程序,选择菜单[文件|新建文件]功能,出现一个文件名为NONAME1 的源程序编辑窗口,在此窗口中输入上述程序,选择菜单[文件|保存文件]或[文件|另存为]功能,将文件保存到工作目录中,文件名自定义,如取为eg1.asm,文件保存后,程序窗口上文件名变成了:E:\\学号\\实验一\\eg1.asm。

④建立新的项目,选择菜单[文件|新建项目]功能,自动打开项目名为UNTITLED的项目窗口,并弹出加入模块文件对话框,选择eg1.asm源程序文件,点击打开。紧接着弹出加入包含文件对话框,因没有需要添加的其它文件,点击取消钮。再接着弹出保存项目对话框,键入工程项目的名称project,点击保存钮,项目窗口中的项目名称显示为project.prj。注意:工程项目文件、源程序文件等要保存在同一文件夹中。

⑤设置项目,选择菜单[设置|仿真器设置]功能或按“仿真器设置”快捷图标或双击项目窗口的第一行来打开“仿真器设置”对话框。

由于本课程实验没有使用硬件仿真器,自制实验板的CPU型号为AT89S52,因此在“仿真器”栏中应如下设置仿真器:在仿真器标签中任意选取仿真器和仿真头,只要所选仿真器和仿真头可仿真的CPU列表中有8032或8732即可,并选择其中一款CPU,然后选中“使用伟福软件模拟器,并设置晶体频率1200000Hz。

在“语言”栏中,由于本课程实验均采用汇编语言编写程序,因此“编译器选择”选择“伟福汇编器”。当仿真器设置好后,再次保存项目,完成项目创建。

3.2 汇编(或编译)程序

选择菜单[项目|编译]功能或按编译快捷图标,编译你的项目。在编译过程中,如果源程序有语法错误,将自动弹出信息窗口,显示错误所在行号及错误编号等信息,双击错误信息,可以在源程序中定位所在行。纠正错误后,再次编译直到没有错误。

3

单片机原理实验

在编译之前,软件会自动将项目和程序存盘。在编译没有错误后,打开工作文件夹,可以看到文件夹中产生eg1.lst、project.bin、project.hex三个文件,第1个是源程序eg1.asm的汇编列表文件,可用记事本编辑器打开该文件,解读该文件提供的信息;第2和3个文件是该工程项目的二种格式的目标程序(.bin和.hex格式)。

3.3 汇编程序的仿真调试方法和观察窗口的使用

如前所述,模拟仿真调试的方法是在PC机上模拟目标程序的运行,并显示虚拟单片机内部RAM和特殊功能寄存器的值,程序员通过分析虚拟单片机内部RAM和特殊功能寄存器的值仅能判断与硬件无关的那部分软件的正确与否。常用先打开合适的观察窗口,用跟踪、单步、执行到光标处等方式来调试程序。比如

① 打开CPU窗口、数据窗口(DATA窗口)、外设端口,适当调整各窗口位置和大小,如图1.4所示。

图1.4:WAVE软件工作环境

在主窗口下方的状态栏中显示CPU的当前状态,包括PC、DPTR、ACC、PSW、SP的值及上次程序执行(跟踪、单步、或执行到光标处)的时间。

在CUP窗口中,第一栏显示每条指令的地址、机器码、反汇编结果、对应的源程序行,若该栏未显示正确指令,可重新编译;第二栏显示SFR及其值,第三栏显示被选中的SFR名位的值,被选中的SFR的名称和值的显示格为立体框样式。

点击跟踪快捷图标,程序转移到“MAIN”标号行,此时在源程序窗口最左边出现“o”和“=>”符号,其中“o”代表此行为有效程序,此行产生了可以执行的机器码,伪指令不产生机器码;“=>”所指的行(被点亮的行)就是下次将要执行的程序指令行。

数据窗口逐行显示内部RAM的内容,每行16字节。 端口显示P0、P1、P2、P3的状态,“√”表示高电平(即逻辑1)。

②由于待调试程序仅涉及SFR中的ACC、PSW、SP和RAM中R6、R7、30H单元、堆

4

单片机原理实验

栈(60H~7FH),为了便于观察这些单元的内容变化,可在CPU窗口中关闭无关的SFR的显示,添加R6、R7、30H单元的显示。

选择菜单[仿真器|设置汇编预定义符号]功能,弹出符号定义对话框;例如要关闭DPL,则双击DPL,将DPL的用途由“预定义符号+SFR窗口显示”改为“预定义符号”,确认修改;例如要添加R6,则点击“添加”钮,输入名称――R6、地址――06H,用途选择为“预定义符号+SFR窗口显示”,确认修改。所有修改完后,关闭CPU窗口,再重新打开CPU窗口,此时窗口第二、三栏的显示内容如图1.5所示,添加30H单元时,将该单元取名为XR1。

图1.5:经修改后CPU窗口 ③跟踪法调试程序。

中的第二、三栏 在“=>”指向“MOV SP,#60H”时,点击跟踪快捷图标1次,观察CPU窗口中SP值的变化,及该指令的执

行时间;

再点击跟踪快捷图标1次,执行“XRL P1,#01H”指令,观察端口P1的变化; 继续点击跟踪快捷图标1次,执行“ACALL DELAY”指令,观察程序的转移及CPU窗口SP值的变化及RAM窗口60H、61H内容的变化,这些变化反映子程序调用时断点地址的进栈保护;

继续点击踪快捷图标1次,执行“MOV 30H,#0”,由于执行前XR1的值为0,因此CPU窗口中XR1的值没有变化,仍为黑色;

继续点击踪快捷图标1次,执行“ACALL D10MS”,观察程序的转移、CPU窗口SP值的变化及RAM窗口62H、63H内容的变化,这些变化反映子程序二级嵌套的断点保护。

继续点击跟踪快捷图标6次,每次均观察CPU窗口的变化,从第5次开始,循环执行“DJNZ R7,$”指令,若继续用跟踪法调试程序,还需点击245次才能结束循环,调试效率太低,可用以下的“断点”法调试。

④跟踪及断点调试法。

用鼠标左键点击“DJNZ R6,D10MS1”程序行,光标移至该行,点击鼠标右键,打开快捷菜单,选择“执行到光标处”,观察“=>”和程序执行时间的变化。

继续点击跟踪快捷图标4次,每次均观察CPU窗口R6、R7的变化,从第4次开始又进入“DJNZ R6,D10MS1”循环。至此,根据程序执行情况,已可判断10mS延时程序编写基本正确,用鼠标左键点击D10mS子程序的“RET”行,选择“执行到光标处”,观察观察CPU窗口R6、R7的变化和执行时间。点击跟踪快捷图标,执行“RET”,结束子程序调用,观察SP值的变化和程序的转向,这些情况反映子程序返回时的断点击栈情况。

继续点击跟踪快捷图标5次,每次均观察CPU窗口变化,第5次执行“CJNE A,#50H,DELAY1”指令,“=>”指向“DELAY1: ACALL D10MS”,由于前面的调试已表明D10MS子程序正确,若再采用前述的调试方法,调试效率太低,可采用以下的单步调试方法。

5

单片机原理实验

⑤单步调试法。

点击单步快捷图标1次,观察“=>”的指向和执行时间;继续点击单步快捷图标5次,每次均观察CPU窗口的变化。至此,500mS延时子程序调试基本完成,仅剩(30H)单元十进制加1的算法逻辑是否正确无法判断,采用以下方法可提高调试效率。先双击CPU窗口的XR1,将XR1值修改为49H,然后继续点击单步快捷图标,并观察CPU窗口的变化,直至执行“DELAY”子程序的返回指令“RET”。至此500mS延时子程序调试完毕。

返回主程序以后,继续重复点击单步快捷图标,观察每一单步执行的结果和执行时间,判断主程序的逻辑是否正确。

⑥模块化程序的调试

程序设计通常采用模块化的结构,因此程序调试一般也按模块进行调试。通常先调试子程序,再逐模块调试各功能模块,在子程序或模块程序调试时,常采用修改CPU的状态,设定模块程序的入口条件,再调试程序,如调试双加法子程序时,往往先设定RAM中存放被加数和加数的单元,然后再进行调试。

四、 实验内容

1. 掌握“WAVE 3.2”的基本功能

按“实验原理”中所述,完成“从P1.0口输出1Hz方波”程序的项目创建、编译程序、程序调试等内容。

2. 6位无符号压缩BCD码加法子程序设计与调试

设两个6位BCD码相加,设加数、被加数已经按压缩BCD码从高位到低位存放在内存单元中,被加数存于RAM的30H、31H、32H,加数存于33H、34H、35H,和存于R2、R3、R4中,进位位保存在C中。试进行算法设计,画出程序流图,写出汇编语言源程序。按“实验原理”中所述,完成该程序的项目创建、编译程序、程序调试等内容。

五、 实验报告要求

实验报告要求写明实验目的,并提交以下内容。

1. 提交“实验内容2”中的程序流图、汇编语言源程序清单。 2. 简述“实验内容2”中的程序的调试方法。

6

单片机原理实验

实验二、I/O口输入输出实验――循环灯程序设计

一、

实验目地

1. 掌握51系列单片机I/O端口操作方法,I/O端口控制程序的编写。 2. 了解数码管动态显示的工作原理,了解按键抖动的现象。 3. 掌握51系列单片机目标程序的下载方法。

4. 掌握循环速度可键控循环灯控制程序设计方法。

二、 实验设备

PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。

三、 实验原理

1. AT89S52单片机实验板简介

本实验采用自制实验板,实验板硬件原理图参见附录二。该实验板的主芯片为AT89S52,含有稳压电源电路、CPU及时钟电路、复位电路、在线编程接口电路、独立键盘电路、数码显示电路、矩阵键盘电路、循环灯(指示灯)电路、工频交流电同步电路、温度测量电路、加热功率调整电路、扩展EEPROM电路、扩展串口电路、扩展数字电位器(或D/A)电路、扩展四通道A/D转换器电路。其中稳压电源电路、CPU及时钟电路、复位电路、在线编程接口电路、独立键盘电路都是典型电路,其原理不再赘述,其它模块将在实验二至六中使用,各模块电路的工作原理在各实验中介绍。

2. 循环灯(指示灯)电路工作原理 如图2.1所示,8只红色发光管LED+5VLD8LD7LD6LD5LD4LD3LD2LD1T5接成共阳极形式,开关管T5控制8只共 9012R19阳极发光管的电源,当CS4(P2.4)引hfgedcba4K7脚输出0时,T5导通,发光管阳极得到

CS45V电源,CS4为循环灯(或指示灯)模

R7~14块的选择控制端。各发光管的阴极分别470经限流电阻R7~14后由P0口控制,当CS4=0时,P0口某位(如P0.0)为0时, 与该端口相连接的发光管(如LD1)点

图2.1:循环灯电路工作原理 亮,反之发光管熄灭。循环灯(指示灯)

真值表如表2.1所示。当CS4=0,P0.0=0时,LD1点表2.1:发光管真值表 亮,若忽略开关管T5和P0.0口内部MOS管的饱和电CS4 P0.0 LD1 压降,则流过LD1的正向电流为 H - 灭 ILD1?5?VF R7P00P01P02P03P04P05P06P07L L abcdefghH L 灭 亮 式中VF为发光管正向导通电压,红色发光管的

VF?1.8V,因此ILD1?6.8mA。若只发光管全部点亮,则通过开关管T5的电流为

7

单片机原理实验

54.4mA,T5选用9012(200mA/50V)可以满足要求。当CS4(P2.4)=0时,若P2.4引脚内部MOS管的饱和电压降,则T5基极控制电流为0.9mA,该基极电流要驱动54.4mA的集电极电流,T5管的放大倍数需超过60倍,通常9012均能满足此要求。

发光管的亮度与流过发光管的正向电流大小有关,也与发光管的发光效率有关,按发光效率区分,光发管通常可分为超高亮度(用于室外)、高亮度(用于室内)、普通亮度(用于较暗背景)3种,根据不同的亮度要求,Φ3发光管的正向电流可设定在1~10mA范围内。

3. 定速循环灯的软件设计

若采用软件延时的方法使8盏LED灯从右至左(LD1→LD2→?LD8→LD1→?)循环点亮,循环速度固定,每盏灯亮的时间0.5秒。根据循环灯控制要求和真值表2.1,用RAM的1个单元(如记为P0S,地址31H)来记录8个LED的状态,P0S的每位对应有尽有只LED,从低位到高位分别对应LD1到LD8,某位的逻辑值为0表示相应LED为亮(负逻辑)。P0S的初始值为0FEH(LD1亮,其它灭),每隔0.5秒P0S的值左循移1位,并将P0S的值从P1口输出,从而实现循环灯控制,程序流图如图2.2所示,程序清单如下

开始(转主程入口) ;==程序首“ORG 0000H”前定义各变量== CS4 BIT P2.4

选择循环灯模块(CS4=0) P0S EQU 31H ;P0口的输出状态

熄灭所有LED ;============ ORG 0000H

P0S赋初值 LJMP MAIN ORG 0030H

P0S值从P1输出 MAIN: CLR CS4

P0S左循移 MOV P0,#0FFH ;LED灯全灭

MOV P0S,#0FEH ;右边第一个亮

延时0.5秒 MLOOP: MOV A,P0S

MOV P0,A RL A

图2.2:循环灯流程图 MOV P0S,A

LCALL DELAY ;延时0.5秒 AJMP MLOOP ;======延时子程序====== DELAY: MOV R5,#200 ;延时((2*R7+3)*R6+5)*R5≈0.5S DL00: MOV R6,#05 DL01: MOV R7,#250 DL02: DJNZ R7,DL02 DJNZ R6,DL01 DJNZ R5,DL00 RET

8

单片机原理实验

END

4. 独立健盘使用 P1.6SW1实验板中配有两个独立按键,如图2.2所示。

由于P1口内部有上拉电阻(20~40kΩ),当按键SW1(或SW2)按下时,端口P1.6(或P1.7)为低电平,

P1.7而按键松开时,端口P1.6为高电平。将P1口的状

SW2态读至ACC,可以判断是否有键按下,ACC.6=0(或

ACC.7=0)表示有SW1(或SW2)键下,此种状态

图2.2:独立键盘接口电路 表示为负逻辑表示,A求反后可得正逻辑表示。若

用RAM的1个单元(如记为KEY,地址30H)来

记录独立按键的状态,则可采用以下子程序读取、并保存按键的状态。 ;==程序首“ORG 0000H”前定义各变量== KEY EQU 20H ;保存按键的状态 SW1 BIT KEY.6 ;SW1键要内部RAM的映射 SW2 BIT KEY.7 ;SW2键要内部RAM的映射 ;======读独立键盘子程序======

RDKEY: ORL P1,#0C0H ;读I/O,先置1再读入 MOV A,P1 XRL A,#0C0H ;第6和7位求反,转为正逻辑 MOV KEY,A ;保存键状态 RET

四、 实验内容

1. 定速循环灯项目调试

⑴建立定速循环灯项目

建立工作文件夹“E:\\学号\\实验二”,采用实验一所述方法完成以下任务,建立定速循环灯项目、建立源程序文件、编辑源程序、编译。

⑵按实验一所述方法,使用伟福软件模拟器对定速循环灯项目进行模拟仿真。 ⑶将软件模拟调试通过的目标程序下载到目标实验板的CPU(AT89S52)上,下载方法参见附录三。取下下载器,上电试运行,观察循环灯运行情况。

2. 循环速度可键控循环灯项目设计

设计一个可以用按键控制循环灯循环速度的工程项目,该项目可实现以下功能:①开始时,循环灯从右到左循环点亮,每盏灯亮的时间为2.5mS,采用软件延时的方法实现;②通过独立按键SW1和SW2可改变循环灯循环速度,每盏灯亮的时间从2.5mS至0.5S可步进调整,每按一次SW1键,每盏灯亮的时间增加2.5mS;每按一次SW2键,每盏灯亮的时间减少2.5mS。

本设计项目算法的核心是编写一个延时时间可调的延时子程序,延时时间从2.5mS至0.5S可键控步进调整,步进值2.5mS。可采用以下方法实现:①在内部RAM中定义1个变量,如TDL、地址30H、初值为#01H,在主程序的每一次循环中都读一次独立按键的状态,并根据SW1(或SW2)键的状态对TDL进行加1(或减1)控制;②

9

单片机原理实验

将“定速循环灯”控制程序中延时子程序的“MOV R5,#200”指令改为“MOV R5,TDL”,即可实现循环灯循环速度键控。

项目程序设计完后,完成以下任务:

⑴建立循环速度可键控循环灯项目,建立项目、建立源程序文件、编辑源程序、编译。

⑵使用伟福软件模拟器对循环速度可键控循环灯项目进行模拟仿真。

⑶将软件模拟调试通过和目标程序下载到目标实验板的CPU(AT89S52)上,取下下载器,上电试运行,观察循环灯运行情况、按键SW1和SW2对循环速度的控制作用。

⑷注意观察以下现象。其一是,当总循环周期为20mS(每盏灯亮的时间为2.5mS)时,循环灯亮成一条直线,当循环周期大于40mS时,循环灯或逐个点亮、或亮成一条抖动的直线(即频闪现象)。其二是,点击SW1和SW2键时,单片机有时可检测到按键,有时检测不到按键。其三是,点击一次按键时,单片机有时会检测到多次按键。

五、 实验报告要求

实验报告要求写明实验目的,并提交以下内容。

1. 简述“循环速度可键控循环灯”控制算法原理,提交程序流图、汇编语言源程序清单。

2. 对在实验板运行“循环速度可键控循环灯”项目目标程序所观察到的现象进行分析,解释其原因。

3. 回答思考题。

六、 思考题

1. 调整哪些电路参数可以调整循环灯的亮度。

2. 如果8只LED发光二极管改为8只LED数码管,使用类似于循环灯方式,循环点亮8只LED数码管,若要正常显示没有频闪,每只LED数码管显示的时间不能超过毫秒?

10

单片机原理实验

实验三、I/O口输入输出实验

――LED数码管动态显示与按键去抖程序设计

一、

实验目地

1. 掌握LED数码管动态显示电路工作原理及其驱动程序设计方法。 2. 掌握软件处理按键去抖动的算法原理及其程序设计方法。 3. 学习模块化程序设计方法。

二、 实验设备

PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。

三、 实验原理

1. LED数码管动态显示电路工作原理

在实验二中,我们观察到当循环灯的总循环周期为20mS(每盏灯亮的时间为2.5mS)时,循环灯亮成一条直线。这个现象是由于眼睛有视觉惰性,即光像一旦在视网膜上形成,视觉将会对这个光像的感觉维持一个有限的时间,这种生理现象叫做视觉暂留性,光亮度越大视觉暂留时间越长,对中等亮度的光刺激,视觉暂留时间约为0.05至0.2秒。循环灯完成一次循环称为一帧图像,由于LED的亮度较低,当每秒超过40帧图像时,循环灯亮成一条直线,无频闪感觉。

P00P01P02P03P04P05P06P07470R7~14SEG4abcdefghgfedcbah109124675gfedcbahT49012gfedcbah109124675gfedcbahT39012SEG3gfedcbah109124675gfedcbahT29012SEG2gfedcbah109124675gfedcbahT19012SEG1共阳hhhhcomcomcomcomcomcom数码显示电路+5VR184K7CS3383838+5VR174K7CS2+5VR164K7CS1+5VR154K7CS038comcom

+5VT59012R194K7CS4LD8LD7LD6LD5LD4LD3LD2LD1 hfgedcba

图3.1 LED数码管动态显示电路

LED数码管动态显示电路如图3.1所示,其工作原理也是基于眼睛的视觉暂留效应,与循环灯的工作原理相似。在图3.1中,SEG1~4为4只共阳极数码管,8只LED指示灯LD1~8也按共阳极联接,相当于1只共阳极数码管(记为SEG5),每只数码管均通过开关管9012控制阳极电源,电路中电阻R7~14、开关管T1~5的选择方法与实验二所述方法相同。LED数码管动态显示采用循环点亮(或扫描)数码管,当每秒的总循环超过40次时,即每秒40帧像以上,将产生每个数码管“连续点亮”的视觉效果。

11

单片机原理实验

≤25mS DSW=1 DSW=2 DSB1 七段码 DSB2 七段码 ≤25mS DSW=1 DSW=2 DSB1 七段码 DSB2 七段码 DSW=0 P0.0~.7 CS0 CS1 CS2 CS3 CS4

DSB0 七段码 DSW=3 DSW=4 DSB3 七段码 DSB4 灯状态 DSW=0 DSB0 七段码

图3.2:5位LED数码管的动态显示时序

2. 显示驱动程序设计方法

若在单片机内部RAM中指定1个字节作为扫描循环变量(记为DSW)和5个字节的显示缓冲区(记为DSB0~4),其中DSB0~3分别保存个、十、百、千位数码的显示数据,DSB4保存8个指示灯的状态(每位对应一个指示灯状态,该字节应可位寻址),则5位LED数码管的动态显示时序如图3.2所示。若主程序循环中每隔5mS调用一次LED数码管动态显示子程序,如图3.3所示,则5位LED数码管动态显示子程序的算法流图如3.4所示,部分程序清单如下。 ;====5位数码管扫描子程序====

初始化 DISP: ORL P2,#1FH ;关闭数码显示器

MOV A,DSW ;根据扫描循环变量转移

N ANL A,#07H 5mS到? RL A Y MOV DPTR,#DSTAB 调用读键状态及去抖 JMP @A+DPTR 处理子程序 DSTAB: AJMP DIS0 AJMP DIS1

调用数码管动态扫描 AJMP DIS2

显示子程序 AJMP DIS3

AJMP DIS4 AJMP DIS0 ┅┅ AJMP DIS0 AJMP DIS0

图3.3:主程序循环

DIS0: MOV A,DSB0 ;扫描个位数码管 ANL A,#0FH MOV DPTR,#LED7 ;查显缓个位值的七段码表 MOVC A,@A+DPTR

12

单片机原理实验

MOV P0,A ;七段码送P0口 CLR CS0 ;点亮个位数码管

关闭数码显示器 MOV DSW,#01H ;扫描指针指向下十位 RET

根据扫描循环变量(DSW)转移 DIS1: …… ;扫描十位数码管

(DSW)=0 DIS2: …… ;扫描百位数码管

扫描个位数码管 DIS3: …… ;扫描千位数码管

DIS4: MOV A,DSB4 ;扫描指示灯 (DSW)=1 扫描十位数码管 CPL A

MOV P0,A (DSW)=2 CLR CS4 扫描百位数码管 MOV DSW,#00H

(DSW)=1 RET 扫描千位数码管 ;====LED段码表====

(DSW)=2 LED7: DB 0C0H,…… ;0~9,a~f共16个七段码 扫描指示灯 3. 键去抖动的软件处理方法

在实验二中,我们还观察到以下两现象,其一

返回 是,点击SW1和SW2键时,单片机有时可检测到按键,有时检测不到按键;其二是,点击一次按键时,图3.4:5位LED数码管动态单片机有时会检测到多次按键。前者是由于在实验显示子程序流图 二的“循环速度可键控循环灯”项目中,每换一盏

键状态 原始键状态 灯主程序循环一次,读一次键状态,当循环时间较

长时(超过点出按键时间),将漏过键状态变化,若

去抖后采用图3.3所示的主程序循环,每5mS读一次键状

键状态 态,本问题将得到解决。后者是由于键的抖动,所有的按键在按下的初始时间段内,触点未达到稳定

t 20mS 接触,连接按键的端口的电平不稳定,CPU读到的

键状态稳定 键状态不稳定,此即所谓的键抖动,如图3.5所示,键按下时刻 通常键抖动发生在键按下的最初20mS内。键去抖动图3.5:键抖动及处理 处理方法有多种,软件延时去抖是最常用的方法,

其算法原理是CPU一旦检测到键状态有变化表明有键按下,延时一段时间(不小于20mS)后,待键状态稳定后,再读取有效的键状态。

在内部RAM指定1字节用于保存键状态,记为KEY,该字节应是可位寻址,以便主程序对键状态的查询;另指定1字节作为键去抖延时器,记为KTMR。若采用图3.3所示的主程序循环,由于系统每5mS调用一次读键状态及去抖处理子程序,因此每次读键状态后,先暂存键状态,若键状态发生变化则启动去抖延时器(实际是记录子程序调用次数,每调用1次相当5mS),延时未到则放弃不稳定的键状态,仍延用原来的键状态;若延时已到则启用新的键状态,键去抖算法如图3.6所示。

在一个微机系统中,按键可以有两种用法。其一是不论键按下有多久,按一下只

13

单片机原理实验

起一次作用,这种按键是键状态变化的前沿起作用,不妨将这种键称为前沿型 (或触发型) 键。其二是键只在按下时才有作用,一旦键松开其作用也消失,不妨称这种键为开关型键。如前所述KEY保存键状态,它保存的是开关型的键状态(按下为1,抬起为0),因此在读键状态及处理子程序中添加了键状态变化前沿提取功能,前沿提取算法如下:若前后两次键状态有变化(异或为1),且本次键状态也为1,则表明键状态发生了正跃变。在内部RAM中另指定1字节用于保存

读键、转正逻辑 前沿型的键状态,记为EKEY。

新的键状态暂存 ;====读独立按键子程序(延时去抖)====

RDKEY: ORL P1,#0C0H ;先置1,后读口

去抖延 MOV A,P1 ;读键 N 键状态变? 时器加 ANL A,#0C0H ;接独立键盘的位保留

载初值 Y XRL A,#0C0H ;求反转正逻辑

Y MOV R7,A ;新的键状态暂存R7

过了延时 CJNE A,KEY,RDK0 ;键状态变化则转移

时间? MOV KTMR,#05H ;去抖延时器加载初值

N SJMP RDK1

放弃不稳定的键状RDK0: MOV A,KTMR ;过了延时时间?

态、延用原键状态 JZ RDK1

DEC KTMR ;延时未结束 MOV R7,KEY ;放弃不稳定的键状态

键前沿提取 RDK1: MOV A,KEY ;键前沿提取

启用新的键状态 XRL A,R7 ANL A,R7

返回 MOV EKEY,A MOV KEY,R7 ;启用键的新状态 图3.6:读键状态及去抖等处理 RET 子程序流图

4. 模块化程序设计方法

实际的应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成。每一程序模块都能完成一个明确的任务,实现某个具体功能,如发送、接收、延时、显示等。采用模块化的程序设计方法,有以下优点:

①单个模块程序的功能单一,易于编写、调试和修改;

②便于分工,可使多个程序员同时进行程序的编写和调试,加快软件研制进度; ③程序可读性好,便于功能扩充和版本升级;

④对程序的修改可局部进行,其他部分可以保持不变;

⑤对于使用频繁的子程序可以建立子程序库,便于移植到其它工程项目中。 在进行模块划分时,应首先弄清楚每个模块的功能,确定其数据结构以及与其他模块的关系;其次是对主要任务进一步细化,将一些专用的子任务交由下一级子模块完成,按这种方法一直细分成易于理解和实现的小模块为止。模块的划分应遵循下述原则:

14

单片机原理实验

①每个模块应具有独立的功能,完成一个明确的任务。

②模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换的频繁程度。

③模块长度适中。模块语句的长度通常在20条~100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,也不合适。

例,如图3.3所示程序结构框架,可将模块分成主程序、初始化模块、读键状态及去抖处理子程序、数码管动态扫描显示子程序4个模块。采用汇编语言编程时,主程序清单如下(文件名MAIN.ASM): ;====变量定义段==== CS0 BIT P2.0 ;个位位选 CS1 BIT P2.1 ;十位位选 CS2 BIT P2.2 ;百位位选 CS3 BIT P2.3 ;千位位选 CS4 BIT P2.4 ;LED灯位选 DSW EQU 30H ;位选计数 DSB0 EQU 31H ;显示缓冲单元个位 DSB1 EQU 32H ;显示缓冲单元十位 DSB2 EQU 33H ;显示缓冲单元百位 DSB3 EQU 34H ;显示缓冲单元千位 DSB4 EQU 20H ;显示缓冲单元指示灯状态 LD1 BIT DSB4.0 ;指示灯LD1控制位 ???? ;指示灯LD2~7控制位 LD8 BIT DSB4.7 ;指示灯LD8控制位 KEY EQU 21H ;键状态字 SW1 BIT KEY.6 ;SW1键 SW2 BIT KEY.7 ;SW2键 EKEY EQU 22H ;键前沿字 ESW1 BIT EKEY.6 ;SW1键前沿 ESW2 BIT EKEY.7 ;SW2键前沿 KTMR EQU 35H ;键去抖延时器 ;================== ORG 0000H LJMP MAIN ORG 0030H

MAIN: INCLUDE \添加初始化模块 MLOOP: LCALL DELAY ;延时5ms LCALL RDKEY ;读键

15

单片机原理实验

LCALL DISP ???? ;主程序中的其它任务 M05: LJMP MLOOP

;====延时子程序(2*R7+3)*R6+5=5ms==== DELAY: MOV R6,#0AH DL01: MOV R7,#0F8H DL02: DJNZ R7,DL02 DJNZ R6,DL01 RET

;====通用子程序段==== INCLUDE \ ;添加读键状态及去抖处理子程序 INCLUDE \ ;添加数码管动态扫描显示子程序

END

与高级语言编程不同,当用汇编语言编程时,程序员必须对CPU资源进行统筹规划,因此在主程序的开始处必须有变量定义段,该段中包含IO口定义、所有程序模块所用变量的定义。各程序模块、子程序中所用变量一般不使用各变量的地址,而使用变量的名称(或符号),将所有变量集中在主程序开始处定义,便于CPU资源的统筹规划、调整和修改。各模块、子程序均以文件形式单独编辑和调试,主程序使用伪指令将各模块添加到指定位置,主程序、模块、子程序通常放在同一工作文件夹中。

在上述程序清单中, 5mS延时子程序仅有5行,因此未将其作成1个独立模块。

四、 实验内容

1. 5位LED数码管动态显示驱动子程序设计 参照图3.4,将“实验原理2”的“5位LED数码管动态显示子程序”中用“??”表示的十、百、千位数码管扫描部分程序行、以及程序最后1行的七段码码表写完整。

建立工作文件夹“E:\\学号\\实验三”,启动“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑5位LED数码管动态显示子程序,编辑完成后,在工作文件夹中,以文件名“DISP.ASM”保存文件。

2. 独立键盘读键状态及去抖动处理子程序设计

点击“新建文件”快捷按钮,在打开的文件窗口中编辑“实验原理3”中的“读独立按键子程序(延时去抖)”,编辑完成后,在工作文件夹中,以文件名“RDKEY.ASM”保存文件。

3. 按键控制4位显示数码加减程序设计

以图3.3的框图为基础,设计1个工程项目,实现以下功能:①上电最初阶段完成下列操作(即初始化),设置内部RAM中60H~7FH单元为堆栈区,清除内部RAM中的20H~7FH单元,在LED数码显示器中显示“学号”的低4位1秒,之后清除5个显示缓冲单元(这样进入主循环后先显示0000)。②在主循环中“??”添加内容,以实现“每按1次SW1键,显示数值十进制加1,每按1次SW2键,显示数值十进制减1。”

功能②可按如下方法实现,在内部RAM中定义1个变量(比如记为,

16

单片机原理实验

无符号、双字节、压缩BCD码);当CPU查询到SW1键(前沿型),则十进制加1;当CPU查询到SW2键(前沿型),则十进制加9999(等价于减1);将加减1后的送入显示缓冲单元DSB3~0。

按工程项目的功能要求和上述算法,完成以下任务:①将图3.3的主程序流程画完整,写出完整的主程序清单;②用“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑主程序,编辑完成后,在工作文件夹中,以文件名“MAIN.ASM”保存文件,用同样方法建立初始化模块“INITIAL.ASM;③在工作文件夹中,以“PROJECT1”文件名创建工程项目,将MAIN.ASM添加到模块文件中,编译项目直至通过;④将编译通过的目标程序下载到实验板中,取下下载器,通电试运行;⑤若目标程序运行不能达到预期效果,用实验一、所述方法进行模拟仿真,查找算法、程序错误,再编译、下载、运行目标程序直至达到预期效果,完成调试。

五、 实验报告要求

实验报告要求写明实验目的,并提交以下内容。

1. 简述“按键控制4位显示数码加减程序设计”的控制算法原理,提交所有程序流图、汇编语言源程序清单。

2. 回答思考题。

六、 思考题

1. “按键控制4位显示数码加减程序设计”项目中,若查询SW1或SW2键时采用开关型键状态,会出现什么现象?可修改程序,在实验板中运行程序,观察现象。

2. 把5mS软件延时改用定时器/计数器定时,如何实现?并说明两种方法的优缺点。

17

单片机原理实验

实验四、定时器应用实验

――LED数码显示与矩阵键盘赋值程序设计

一、

1. 2. 3. 4.

实验目地

掌握定时器/计数器定时设计方法。

掌握矩阵键盘工作原理及读矩阵键盘和去抖程序设计方法。 掌握LED数码显示与矩阵键盘赋值程序设计方法。

进一步学习模块化的程序设计方法,掌握状态及其转移分析方法。

二、 实验设备

PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。

三、 实验原理

1. 定时器及其中断 在实验三中,我们采用调用处延时程序实现5位LED数码管动态显示,并采用独立键盘对显示内容进行加1和减1设置。我们发现在这样一个简单的设计中,CPU很忙,每时每刻都在执行不可缺省的指令,没有时间作完成其它任务。若要增加系统的功能必须在主程序中增加模块,也就增加了CPU执行相应模块的时间,这将导致主程序每次循环的时间超过5mS,且每次循环的时间可能不相同。当系统增加的功能消耗CPU时间不多,主程序循环时间偏离5mS的误差较小,这样的设计方法仍不失是一种可行的方法,反之应放弃该方法。

解决上述问题的方法可以采用单片机的定时/计数器,若将定时/计数器T0设置为方式1定时器,定时时长为4mS,则定时/计数器工作方式寄存器TMOD=01H;若系统晶体振荡器频率为12MHz,则定时器初值为:

M?65536?定时时长?65536-4000?F060H

机器周期即TH0=F0H、TL0=60H。

2. 矩阵键盘工作原理及读键盘和去抖处理 在实验三中,独立键盘SW1和SW2的每个键均接独立K11K10K9ROW2接1条IO口,当系统所需按键较多,若每个按键均占用1条K7K6K5ROW1IO端口,则按键占用的CPU资源过多,系统实现难度较大。

K3K2K1ROW0解决上述问题的方法可以

CS3CS2CS1采用矩阵键盘电路。图4.1是

3*4矩阵键盘电路,其中K0~图4.1:3*4矩阵键盘电路

18

K8K4K0CS0 单片机原理实验

K3四键、K4~K7四键、K8~K11四键组成矩阵键盘的第0、1、2行,各行分别由选择控制口ROW0、ROW1、ROW2控制;(K0,K4,K8)三键、(K1,K5,K9)三键、(K2,K6,K10)三键、(K3,K7,K11)三键组成矩阵键盘的第0、1、2、3列,分别由4条数据线读取键状态。

由图4.1可见,读取键状态的4条数据线CS0~3与LED数码管动态显示电路5条扫描线中的4条共用。之所以能够共用CS0~3端口,是由于CPU读取按键状态所需时间很短(几十微秒),而LED数码管动态显示每个数码管的点亮时间为几个毫秒,因此先短暂关闭数码显示(=1111),读取按键状态;然后关闭矩阵键盘(=111),打开数码显示,并不会影响数码显示的视觉效果,或者说矩阵键盘与数码管动态显示分时复用CS0~3端口。

矩阵键盘各行按键的键状态也是分时读取的。首先置=110,选择第0行四个按键,此时若K0~K3中有键按下,CS0~3端口线的相应位为0,其它位为1,而另两行的按键如有键按下不会影响上述逻辑,此时从CS0~3读取的数据为第0行四个按键的键状态。然后置=101,选择第1行四个按键,读取第1行四个按键的键状态。再后然后置=011,选择第2行四个按键,读取第2行四个按键的键状态。如前所述,上述所有按键的键状态读取仅需几十微秒。

图3.6所示的读键状态及去抖等处理子程序流图对矩阵键盘仍然适用,所不同的是在内部RAM中应指定2字节KEY1和KEY2用于保存开关型的键状态;指定2字节EKEY1和EKEY2用于保存前沿型的键状态。KEY1和KEY2

关闭数码显示器 共可以保存16个键状态,而本实验板中矩阵键盘只有12个键,因此可以将2个独立按键的状态也

扫描0行按键=110、并入这2个字节中。这样,矩阵键盘和独立按键

读K3~0键状态、新的键状态暂的读键状态及去抖处理子程序框仍可延用图3.6

存R6低4位 的流图,只需将图3.6中第一个功能框“读键、

转正逻辑、新的键状态暂存”可细化,如图4.2

扫描1行按键=101、所示。部分程序如下:

读K7~4键状态、新的键状态暂;====读矩阵、独立按键子程序(延时去抖)====

存R6高4位 RDKEY: ORL P2,#0FFH ;关闭LED数码显示器

CLR ROW0 ;ROW0=0,扫描K0~3键

扫描2行按键=011、 NOP ;延时,键盘线越长延时越长

读K11~8键状态、新的键状态 NOP

暂存R7低4位 MOV A,P2 ANL A,#0FH ;K0~3键位保留

XRL A,#0FH ;求反转正逻辑 MOV R6,A ;新的键状态暂存R6 ORL P2,#0FFH CLR ROW1 ;ROW1=0,扫描K4~7键 ???? ;扫描第1、2行按键等

19

关闭矩阵键盘=111、读独立按键SW1和SW2键状态、新的键状态暂存R7低4图4.2:“图3.6读键、转正逻辑、新的键状态暂存”细化

单片机原理实验

ORL P2,#0FFH;关闭矩阵键盘 ORL P1,#0C0H

MOV A,P1 ;读独立按键

ANL A,#0C0H ;接独立键盘的位保留 XRL A,#0C0H ;求反转正逻辑 ADD A,R7

MOV R7,A ???? ;键状态变化判断、延时去抖、键前沿提取等 RET

3. 模块化程序设计方法――系统状态及其转移分析方法

单片机应用系统和程序构架与系统所要实现的功能有关,模块化程序设计方法仍是常用的方法。程序员首先要分析系统的功能,将系统分解为几个不同的工作状态,并用代码表示系统的工作状态,保存状态代码的内部RAM单元称为状态字(不妨记态字为STA),处在不同工作状态时,系统执行不同的程序模块,实现不同的功能;其次要分析实现这些功能的控制量有哪些,包括按键、开关量(或逻辑信号)和模拟量(或模拟量)等,找出系统的工作状态发生变化的条件,即控制量满足什么条件时工作状态将发生什么变化,得出系统的状态转移表。在此基础上,利用“JMP @A+DPTR”指令,根据工作状态字STA的不同取值进行间接长转移(或称为散转),从而实现系统工作状态的转移,完成工作任务的调度。下面举简例说明之。

在实验板上设计一个系统,实现以下功能:①上电时4位数码管显示“8952”1秒,指示灯全亮。②紧接着显示“学号”(低4位),同时LD1灯亮表示当前显示内容为“学号”,此时按键K0~11无效,SW1和SW2键有效。③若按SW2键一次,LD2亮表示此时可以利用数码显示和按键K0~9进行赋值,K0~9键代表“0~9”数值键,每按1次数值键后,原4位显示数值在显示器上左移1位,新输入的数值从右边进入,输入数值的位数不限,但从显示器左边移出的数值不保留;若再按“SW2”键一次,显示器上显示的数值保存,重新显示“学号”,LD1亮。④在显示“学号”,LD1亮的情况下,若按下SW1键一次,系统显示最后输入的4位数值供查询,LD3亮表示查询,此时不能对显示数值进行修改,5秒后自动重新显示“学号”,LD1亮;若在自动重新显示“学号”之前,按住SW1键不抬起,将暂停5秒计时,按键松开后恢复计时,从而推迟重新显示“学号”。

对上述的系统功能进行分析,“功能①”规定了系统上电后1秒内的行为,这此功能可归为上电复位初始化内容;分析其它功能,可将系统分解为3个工作状态:第1种状态为待机状态,(STA)=0,显示“学号”、LD1亮;第2种状态为赋值状态,(STA)=1,显示输入的值、LD2亮;第3种状态为查询状态,显示最后输入的4位数值、LD3亮。在待机状态下,系统只响应SW1和SW2的键前沿,若按SW2键1次则系统转入赋值状态,若按SW1键1次则系统转入查询状态;在赋值状态下,系统响应K0~9和SW2的键前沿,若按K0~9中的任一键则进行赋值,若按SW2键则系统转回待机状态;在查询状态下,系统只响应SW1的键状态,若按SW1键不松开则暂停5秒计时,推迟返回待机状态。由上面的分析可得到系统的状态转移表,如表4.1所示。

20

单片机原理实验 表4.1:状态转移表举例

状态 显示及执行任务 可响应的控制量及其作用 状态转移及其条件 有SW1键则转入查询状态 有SW2键则转入赋值状态 待机状态 显示“学号”(低SW1和SW2键前沿,用于(STA)=0 4位)、LD1亮。 控制状态转移。 赋值状态 显示当前的输入(STA)=1 值、LD2亮。 K0~9和SW2的键前沿,分有SW2键则返回待机状态 别用于赋值和状态转移。 计时到则返回待机状态 查询状态 最后输入的4位SW1的键状态,用于控制5(STA)=2 数值、LD3亮。 秒计时器工作。 根据状态转移表,可以容易得到系统程序流程图,如图4.3所示,部分主程序清单如下:

;====变量及常数定义段====

复位入口 INCLUDE \ ;添加变量等定义模块

;=============== ORG 0000H 初始化 LJMP MAIN

N ORG 000BH 4mS到? LJMP T0SER ;转T0中断服务子程序

Y ORG 0030H

清定时标志,4mSMAIN: INCLUDE \;添加初始化模块

定时重设;读键状MLOOP: JNB TF0,$ ;4mS到?

态及去抖处理;数 CLR TF0 ;清定时标志

码管动态显示 MOV TH0,#0F0H ;4mS定时重设 MOV TL0,#60H LCALL RDKEY ;调用读键状态及去抖处理 ??(如其它控制 LCALL DISP ;调用数码管动态显示 量读取等) MOV A,STA ;根据状态值散转相应模块 ANL A,#03H

根据状态值散转相 RL A

应模块 MOV DPTR,#MTAB JMP @A+DPTR STA=0 待机模块 MTAB: AJMP WORK0 ;转移到待机模块

STA=1 AJMP WORK1 ;转移到赋值模块

赋值模块 AJMP WORK2 ;转移到查询模块

STA=2 AJMP WORK0 ;冗余

查询模块 ;====待机模块==== WORK0: ???? 图4.3:系统程序流图 AJMP MLOOP

21

单片机原理实验

;====赋值模块==== WORK1: ???? AJMP MLOOP ;====查询模块==== WORK2: ???? AJMP MLOOP

;====其它非通用子程序==== ????;详见赋值模块细化的DSBUPT ;====T0中断服务子程序==== T0SER: RETI

;====通用子程序段====

INCLUDE \添加读键状态及去抖处理子程序 INCLUDE \添加数码管动态扫描显示子程序 END

由图4.3及上述主程序清单可见,一般情况下,采用模块化方法设计程序时,程序有以下三个特点。其一是,每个模块只有唯一的入口和唯一的出口。其二是执行各模块只有2种方法,或用调用指令调用子程序模块,完成特定任务后返回调用处;或根据状态值,用间接长转移指令散转至相应工作模块,各工作模块执行后用无条件转移指令回到程序主循环的起点MLOOP处。其三是不能使用无条件转移指令由一个工作模块直接转入另一模块;工作模块间的转移是只能通过修改状态值,在下一次主循环中自动转入所需模块,详见以下对“赋值模块”的细化和相应程序清单。

在本系统中,有2个数据是必须保存的,其一是“学号”的低4位,其二是键盘输入的4位数值,这2个数据都是双字节的压缩DCB码。为此,在内部RAM中开辟4个字节单元用于存储这2个数据,其中存储第1个数据(First Number),存储第2个数据(Second Number),每个数据均存储在2个连续地址单元,高位字节存储在低地址。此外还必须在内部RAM中开辟2字节的单元用于查询模块中的5秒计时,不妨记为SEC和SECL,其中SEC为秒计时单元,SECL 为不足1秒的计时单元,SECL以4mS为基准计时(处在查询状态时,系统每4mS进入查询模块一次),SECL计满250为1秒。

在本系统中,由于系统比“实验三”复杂,需要定义更多的变量,如键状态字2字节KEY1和KEY2、键前沿字2字节EKEY1和EKEY2、14个键状态位、14个键前沿位等,因此可将变量及常数的定义独立为1个模块“VARDFN.ASM”。

上面,我们从系统的角度分析了系统的状态,得到了状态转移表和模块化的主程序流图,也对系统的所有变量、数据格式进行定义,在此基础上可进一步细化各工作模块。在3个工作模块中“赋值模块”相对最复杂,下面此模块为例来讨论模块的细化问题。由表4.1的状态转移表可得“赋值模块”的流程图,如图4.4所示,程序清单如下。

WORK1: MOV R0,#SNUM0 ;数据2送显缓 ACALL DSBUDT

22

单片机原理实验

MOV DSB4,#02H ;LD2亮 JNB ESW2,WK11 MOV STA,#00H ;下次主循环返回WORK0模块 SJMP WK13 WK11: CLR A ;查询\键 JB EK0,WK12 INC A ;查询\键 JB EK1,WK12 ???? INC A ;查询\键 JNB EK9,WK13 WK12: XCH A,SNUM1 ;键值从数据2的右边移入 SWAP A MOV R7,A ANL A,#0F0H ORL SNUM1,A MOV A,R7 ANL A,#0FH XCH A,SNUM0 ANL A,#0FH SWAP A ORL SNUM0,A WK13: AJMP MLOOP ;====将双字节压缩BCD码(R0)(R0+1)送显缓==== DSBUDT: MOV A,@R0 ANL A,#0FH MOV DSB2,A MOV A,@R0 ANL A,#0F0H SWAP A MOV DSB3,A INC R0 MOV A,@R0 ANL A,#0FH MOV DSB0,A MOV A,@R0 ANL A,#0F0H SWAP A MOV DSB1,A

23

数据2送显缓、LD2点亮 N 无SW2键? Y (A)=0 Y 有K0键? N (A)=(A)+1 Y 有K1键? N ???? (A)=(A)+1 有K9键? Y 键值(A)从数据2的右边移入 (STA)=0 N 回到主循环的起点MLOOP处 图4.4:赋值模块流图 单片机原理实验

RET

从状态表4.1中可看出,在3个工作状态中都规定了数码显示器的显示信息,只要将等显示的压缩BCD码送给显示缓冲单元DSB3~0,即可实现显示内容更新,因此3个工作状态都有显示内容更新的操作,这些操作都是相似的,可由子程序DSBUPT(DISPLAY BUFFER UPDATE)完成,该子程序将(R0)为首地址的双字节压缩BCD码送往显示缓冲单元。

四、 实验内容

1. 矩阵键盘和独立按键读键状态及去抖处理程序设计 参照图3.6和图4.2,将“实验原理2”的“读矩阵、独立按键子程序(延时去抖)”中用“??”表示的扫描第1、2行按键等和键状态判断、延时去抖、键前沿提取等部分程序行写完整。

建立工作文件夹“E:\\学号\\实验四”,启动“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑读矩阵、独立按键子程序(延时去抖),编辑完成后,在工作文件夹中,以文件名“RDKEY.ASM”保存文件。

2. 程序移植 将“实验三”中建立的5位LED数码管动态显示子程序DISP.ASM复制到当前工作文件夹。

点击“新建文件”快捷按钮,在打开的文件窗口中编辑变量及常数定义子程序,编辑时可将实验三主程序MAIN.ASM的变量定义段的有关内容复制粘贴到当前编辑窗口中,删去与本项目无关的行,添加本项目新增的各变量的定义,并对各变量在内部RAM中的分配作统一规划。编辑完成后,在工作文件夹中,以文件名“VARDFN.ASM”保存文件。

将“实验三”中建立的初始化子程序INITIAL.ASM复制到当前工作文件夹,用“打开文件”快捷按钮打开该文件,修改初始化模块。堆栈设置、内部RAM清0不变,增加变量赋值(学号低4位),并将上电初始1秒显示的内容改为“8952”,设置定时器,将软件延时改为定时器延时。编辑完成后,保存文件。

在做程序移植时,移植过来的程序行若与本项目无关务必要删除干净,尤其是变量及常数定义子程序,该程序均由伪指令构成,没有删除干净可能不会影响程序的编译与运行,但会大大降低程序的可读性。

3. 系统程序设计与调试

将待机模块和查询模块细化,画出各自的流程图,写出程序清单;将赋值模块流程图中“????”部分画完整,并写出相应的程序行。

点击“新建文件”快捷按钮,在打开的文件窗口中编辑系统程序,编辑完成后,在工作文件夹中,以文件名“MAIN.ASM”保存文件。

在工作文件夹中,以“PROJECT”文件名创建工程项目,将MAIN.ASM添加到模块文件中,编译项目直至通过。将编译通过的目标程序下载到实验板中,取下下载器,通电试运行。若目标程序运行不能达到预期效果,用实验一、所述方法进行模拟仿真,查找算法、程序错误,再编译、下载、运行目标程序直至达到预期效果,完成调试。

24

单片机原理实验

五、 实验报告要求

实验报告要求写明实验目的,并提交以下内容。

1. 总结应用模块化方法设计系统程序的主要步骤及状态转移表应包含哪些要素?

2. 提交RDKEY.ASM、VARDFN.ASM二个模块文件的清单。

3. 提交待机模块、赋值模块细化的程序流图、汇编语言源程序清单。 4. 回答思考题。

六、 思考题

1. 估算你所编写的系统程序执行一次主循环的最长时间,即从执行“CLR TF0”到执行“AJMP MLOOP”转移等待MLOOP处所需的最长时间,如果该最长时间超过4mS会出现什么情况?

2. 为什么不能使用无条件转移指令由一个工作模块直接转移到另一个工作模块?

25

单片机原理实验

实验五、计数器应用实验

――基于热敏电阻和555电路的简易温度报警系统设计

一、 实验目地

1. 掌握定时器/计数器综合应用设计方法。

2. 掌握基于热敏电阻和555时基电路的简易温度计设计方法。 3. 进一步学习模块化程序设计方法,巩固状态及其转移分析方法。

4. 进一步学习程序移植方法,巩固变量定义、初始化、数码管动态显示、读键状态及去抖处理等子程序(或子模块)的调整与应用。

二、 实验设备

PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。

三、 实验原理

1. 温度测量原理

常用的温度传感器有热电偶温度传感器、二极管温度传感器、半导体集成温度传感器、热敏电阻温度传感器,本实验采用热敏电阻和555时基电路构成简易的温度传感器,电路构成如图5.1所示。

图5.1是由555时基电路组成自激多谐振荡电路,电路的工作有三个过程。①上电时电容C5的电压uC5?0,555

+5V555IC448R63K762C5103C7104RESETDISCHGVCCOUT35C6104T1RTNTC/10KTHOLDCVOLTTRIGGND1输出高电平、放电端“DSI”关断,此时 电源通过电阻R6及RT向电容C5充电,图5.1:由555时基电路组成自激多谐振荡器 当充电至uC5?13VCC时,555状态不变仍输出高电平,继续充电。②电容C5从uC5?13VCC电平处通过R6及RT充电,此时输出为高电平;当充电至

表5.1:555时基电路逻辑功能表 TH OUT DIS TR R × × L H H H L L H 导通 导通 关断 ?1 ?23VCC3VCC ?1 ?23VCC3VCC× ?13VCCuC5?23VCC时,555状态翻转,输出低

电平、放电端“DIS”对地导通,电容

C5通过电阻RT放电;这个充电过程的时长T1满足:

23原状态 原状态 VCC?VCC?23VCCexp??T1(R6?RT)C5?,即T?(R16?RT)C5ln2 (1)

③电容C5从uC5?2此时输出为低电平;当放电至uC5?1V电平处通过RT放电,3VCC3CC

26

单片机原理实验

时,555状态翻转,输出高电平、放电端“DSI”关断,电源又通过电阻R6及RT向电容C5充电,这个放电过程的时长T2满足:

13VCC?23VCCexp??,即T?T2RTC52?RTC5ln2 (2)

此后,电路双重复②③两过程,输出矩形脉冲波,周期T为:

T?(R6?2RT)C5ln2?0.69(R6?2RT)C5 (3)

若电阻RT采用热敏电阻,当温度变化时,振荡器输出脉冲频率FT变化,将振荡器输出信号与单片机T1计数器输入引脚相连,通过测量恒定时间间隔内脉冲的个数,由该脉冲计数值可换算出相应的温度。

表4.2:NTC10K热敏电阻温度与电阻值对应关系及振荡器100mS产生脉冲数 T(℃) RT(KΩ) 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 100mS 100mS 100mS 100mS T(℃) RT(KΩ) T(℃) RT(KΩ) T(℃) RT(KΩ) 脉冲数 脉冲数 脉冲数 脉冲数 32.5030 213 25.0 10.0000 630 50.0 3.5870 1424 75.0 1.4619 2447 30.9026 224 26.0 9.5718 654 51.0 3.4525 1463 76.0 1.4136 2487 29.3896 235 27.0 9.1642 680 52.0 3.3238 1502 77.0 1.3672 2527 27.9590 246 28.0 8.7760 705 53.0 3.2005 1542 78.0 1.3225 2567 26.6058 258 29.0 8.4063 731 54.0 3.0824 1581 79.0 1.2795 2607 25.3254 270 30.0 8.0541 758 55.0 2.9692 1621 80.0 1.2381 2646 24.1135 283 31.0 7.7184 786 56.0 2.8608 1662 81.0 1.1983 2686 22.9661 296 32.0 7.3985 814 57.0 2.7568 1702 82.0 1.1599 2724 21.8795 310 33.0 7.0935 843 58.0 2.6572 1743 83.0 1.1229 2763 20.8502 324 34.0 6.8026 873 59.0 2.5616 1784 84.0 1.0873 2801 19.8747 339 35.0 6.5251 903 60.0 2.4700 1825 85.0 1.0530 2838 18.9502 354 36.0 6.2604 934 61.0 2.3820 1867 86.0 1.0199 2876 18.0735 370 37.0 6.0077 965 62.0 2.2977 1908 87.0 0.9880 2913 17.2421 387 38.0 5.7666 997 63.0 2.2167 1950 88.0 0.9573 2949 16.4534 404 39.0 5.5363 1030 64.0 2.1390 1991 89.0 0.9277 2985 15.7049 421 40.0 5.3164 1063 65.0 2.0644 2033 90.0 0.8991 3020 14.9944 439 41.0 5.1064 1097 66.0 1.9928 2075 91.0 0.8715 3056 14.3198 458 42.0 4.9057 1131 67.0 1.9240 2116 92.0 0.8450 3090 13.6792 477 43.0 4.7140 1166 68.0 1.8579 2158 93.0 0.8193 3124 13.0705 497 44.0 4.5307 1202 69.0 1.7944 2200 94.0 0.7945 3158 12.4922 518 45.0 4.3554 1238 70.0 1.7334 2241 95.0 0.7707 3191 11.9425 539 46.0 4.1878 1274 71.0 1.6747 2283 96.0 0.7476 3224 11.4198 561 47.0 4.0275 1311 72.0 1.6183 2324 97.0 0.7253 3256 10.9227 583 48.0 3.8742 1348 73.0 1.5641 2365 98.0 0.7038 3288 10.4499 606 49.0 3.7275 1386 74.0 1.5120 2406 99.0 0.6831 3319 NTC10K负温度系数热敏电阻,其温度与电阻值的对应关系是非线性的,标称值10K是指该热敏电阻在25℃时的电阻值为10KΩ,测温范围为-20~100℃,表4.2第1和2栏给出NTC10K温度与电阻值的对应关系,此对应关系由厂商提供,可精确到0.5℃,考虑到电路其它元件的误差,本简易温度测量方法的误差不可能小于1℃,因此表4.1仅给出0℃以上的整数(℃)温度值所对应的电阻值。通常情况下,热系统的温度变化

27

单片机原理实验

较缓慢,100mS测一次热系统的温度已可满足绝大多数应用要求,按图5.1电路所给出的参数,由(3)式可计算出振荡电路输出信号在100mS内脉冲数与温度之间的关系,如表4.2第3栏所示。

2. 脉冲计数值换算为温度的算法原理

按前述的测温原理,单片机能够直接测量的是100mS内振荡器输出脉冲的个数,由于NTC10K热敏电阻的非线性,要将100mS的脉冲数转换成相应温度只能采用反函数的查表方法(只适用于单调的函数)。反查函数(单调上长)表的方法如下:①由0℃到99℃,从表中逐一取出各温度点的脉冲数;②求出“当前脉冲数-某温度点脉冲数”的差,若“差”≥0则取下一个温度点的脉冲数,再求“差”,直至“差”<0时转下一步骤;③上一步骤确定当前温度在相邻的两温度点之间,还应判断当前温度与这两温度点中的哪个点更接近,判断方法如下:若“当前脉冲数-前个温度点脉冲数”(正)+“当前脉冲数-后个温度点脉冲数”(负,补码)≥0(有进位),则表明当前温度更接近后一个温度点。

←0 例如T1计数器记录的当前脉冲数为693

←0 (2B5H),查表4.2可知该脉冲数的大小介于

27℃的脉冲数680(2A8H)和28℃的脉冲数705

由TEMP1查表取出某温度(2C1H)之间,因此“当前脉冲数-前个温度点

点脉冲数;←当前脉冲数”=000DH,“当前脉冲数-后个温度点脉

脉冲数-某温度点脉冲数 冲数”=FFF4H,两者之和为0001H,进位位=1,表明当前温度更接近28℃。

若将当前脉冲数暂存在,“当前脉冲数-前个温度点脉冲数”暂存在,“当前脉冲数-后个温度点脉冲数”暂存在,转换结果当前温度保存在中,则上述算法可用图5.2所示流图表示,程序清单如下。

;====脉冲计数值查表转换为温度==== ;入口条件=当前脉冲计数值

;出口=温度值(压缩BCD码) ;使用R2~R7,ACC,PSW,B,DPTR FTEMP: CLR A

MOV TEMP1,A MOV R6,A MOV R7,A

MOV DPTR,#TTAB

FTP0: MOV A,TEMP1 ;读某温度脉冲数 RL A

MOVC A,@A+DPTR MOV R4,A

28

“差”≥0? Y N +1 N TEMP1=99? Y + N 非进位? 0则减1 Y 转压缩BCD码 返回 图5.2:脉冲数转换温度算法流程

单片机原理实验

MOV A,TEMP1 RL A INC A

MOVC A,@A+DPTR MOV R5,A

CLR C ;=当前脉冲数-某温度脉冲数 MOV A,R3 SUBB A,R5 MOV R5,A MOV A,R2 SUBB A,R4 MOV R4,A

JC FTP2 ;\当前脉冲数<某温度脉冲数\则转移 MOV A,R5 ;= MOV R7,A MOV A,R4 MOV R6,A MOV A,TEMP1 CJNE A,#99,FTP1 SJMP FTP3 FTP1: INC TEMP1 SJMP FTP0 FTP2: MOV A,R5 ADD A,R7 MOV A,R4 ADDC A,R6 JC FTP3 MOV A,TEMP1 JZ FTP3

DEC TEMP1

FTP3: MOV A,TEMP1 ;温度值转换为压缩BCD码 MOV B,#10 DIV AB SWAP A ADD A,B MOV TEMP1,A RET

TTAB: DW 213,224,235,246,258,270,283,296,310,324 DW 339,354,370,387,404,421,439,458,477,497

29

单片机原理实验

DW 518,539,561,583,606,630,654,680,705,731 DW 758,786,814,843,873,903,934,965,997,1030

DW 1063,1097,1131,1166,1202,1238,1274,1311,1348,1386 DW 1424,1463,1502,1542,1581,1621,1662,1702,1743,1784 DW 1825,1867,1908,1950,1991,2033,2075,2116,2158,2200 DW 2241,2283,2324,2365,2406,2447,2487,2527,2567,2607 DW 2646,2686,2724,2763,2801,2838,2876,2913,2949,2985 DW 3020,3056,3090,3124,3158,3191,3224,3256,3288,3319

3. 内部RAM的统筹规划

在实验三中,我们曾经强调:用汇编语言编程时,程序员必须对CPU资源进行统筹规划,必须在主程序的开始处对所有IO口和变量进行定义,于方便CPU资源的统筹规划、调整和修改;实验四中将IO口和变量定义部分独立成1个子程序模块。IO口的分配与硬件设计有关,不能随意更改,而内部RAM分配则由程序员安排,有很大的调整空间,然而内部RAM分配一般应遵循以下原则:①00H~1FH单元为工作寄存器区,即4个组的R0~R7,R0~R7一般用于保存各种运算的中间结果或循环控制变量,这些量只对某个模块有意义,退出该模块后其内保存的数据已没有意义,因而各模块均可重复使用这些工作寄存器。由于中断请求的断点是随机的,因此主程序、不同优先级的中断服务子程序不能使用同一组工作寄存器。②20H~2FH单元为可位寻址区,该区域一般用于存储位控制变量或用户自定义状态标志位,如键状态位等。③30H~7FH单元为可直接寻址区,该区应分为30H~XXH段和XXH+1~7FH段,前者用于保存重要变量,程序频繁访问这些存储单元,用于控制程序运行;后者为堆栈区,用于程序断点保护、中断现场保护及模块间数据的传递。两段的分界XXH应视系统对堆栈深度的要求而定,涉及主程序所调用的子程序中最大的嵌套级数、中断是否有优先级设定、中断现场保护的数据量、中断服务程序内是否有子程序调用、用堆栈进行模块间数据传递的数量等。如,某系统主程序所调用子程序中最多有二级嵌套(需4个堆栈单元),中断有二个优先级,高优先级中断服务程序不需保护现场(需2个堆栈单元),低优先级中断服务程序需要保护ACC和PSW且内嵌单级子程序调用(需6个堆栈单元),没有用堆栈进行模块间数据传递,则该系统所需堆栈深度为12个单元。④80H~FFH(52系列)只能间接寻址,用于数量相对较大、程序较不频繁访问的数据存储,如串口数据收发等。

四、 实验内容

1. 温度测量及超上限报警系统设计

在实验板上设计一个系统,实现以下功能:①上电时4位数码管显示“8952”1秒,指示灯全亮。②紧接着显示当前测量的温度值,同时LD1灯亮表示当前显示内容为实测温度,此时按键K0~11无效,SW1和SW2键有效。③若按SW2键一次,可开始对报警上限温度(有效范围0000~0099)进行设置,LD2亮表示此时可以利用数码显示和按键K0~9进行上限温度赋值,K0~9键代表“0~9”数值键,每按1次数值键后,原4位显示数值在显示器上左移1位,新输入的数值从右边进入,输入数值的位数不限,但显示器的最高两位始终为零;若再按“SW2”键一次,显示器上显示的数值保存,重

30

单片机原理实验

新显示实测温度,LD1亮。④在显示实测温度、LD1亮的情况下,若按SW1键一次,转换为温度报警器,此时显示器高两位显示设置的上限温度,低两位显示实测温度,LD3亮表示具有温度超限报警,此时不能对显示数值进行修改;一旦实测温度达到或超过设置的上限温度则LD8亮,否则LD8灭;再按SW1键一次重新显示温度,LD1亮。

请根据上述功能描述,用实验四所述的“状态分析法”对系统的状态、状态转移条件进行分析,得出系统的状态及其转移表;画出系统主程序框图、各工作状态细化流程图,写出主程序、各工作模块程序清单。

建立工作文件夹“E:\\学号\\实验五”,使用“WAVE 3.2”集成开发软件,以“MAIN.ASM”文件名建立源程序文件,录入、编辑“温度测量及超限报警系统”主程序。

2. 脉冲计数值换算为温度子程序设计

以“FTEMP.ASM”文件名建立源程序文件,录入、编辑脉冲计数值转换为温度值子程序。

3. 程序移植

将“实验四”中建立的5位LED数码管动态显示子程序DISP.ASM、初始化子程序INITIAL.ASM、变量及常数定义子程序VARDFN.ASM复制到当前工作文件夹。其中变量及常数定义子程序VARDFN.ASM需作适当的修改,添加温度测量值存储单元、100mS定时计数单元

4. 软件调试

在工作文件夹中,以“PROJECT”文件名创建工程项目,将MAIN.ASM添加到模块文件中,编译项目直至通过。将编译通过的目标程序下载到实验板中,取下下载器,通电试运行。若目标程序运行不能达到预期效果,用实验一、所述方法进行模拟仿真,查找算法、程序错误,再编译、下载、运行目标程序直至达到预期效果,完成调试。

五、 实验报告要求

实验报告要求写明实验目的,并提交以下内容。

1. 简要表述本简易温度报警系统的状态、状态转移条件的分析过程,提交状态及其转移表。

2. 提交主程序、各工作模块子程序流图及程序清单(赋值模块除外)。 3. 回答思考题。

六、 思考题

1. 试从充放电过程的暂态方程出发说明为什么555振荡器输出高、低电平的时间为什么满足(1)、(2)式。

2. 在所有程序中多次使用工作寄存器,试述为什么可以这样作? 3. 试简述你的设计、调试体会。

31

单片机原理实验

实验六、中断实验 ――简易温度控制器设计

一、

实验目地

1. 掌握中断及中断服务程序的设计方法。

2. 掌握可控硅导通角控制方法和简易温度控制器设计方法。

3. 进一步学习程序移植方法、模块化程序设计方法,巩固状态及其转移分析方法。

二、 实验设备

PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。

三、 实验原理

1. 可控硅导通角控制方法

用单片机控制可控硅导通角的控制电路如图6.1所示,电路可分成可控硅导通角控制电路(即加热功率调整电路)和工频同步电路二个部分。

可控硅是可控硅整流元件的简称,是一种具有三个PN 结的四层结构的大功率半导体器件,亦称为晶闸管。具有体积小、结构相对简单、功能强等特点,是比较常用的半导体器件之一。该器件被广泛应用于各种电子设备和电子产品中,如可控整流、逆变、变频、交流负载调压、无触点开关等。一般来说,可控硅主要用于强电电路,单片机系统对可控硅的控制应采用光隔离,单片机先控制光耦合可控硅(如MOC3021,100mA/400V),由光耦合可控硅再驱动大功率的可控硅。本实验板仅从控制原理角度出发,暂不考虑大功率可控硅驱动问题。如图6.1所示,采用100Ω/2W的功率电阻作为加热器,使用9Vac的交流电源,并将实验五所述的热敏电阻紧贴功率电阻,由单片机实时监测温度,直接控制光耦合可控硅,调整加热器功率,实现温度自动控制。

D1~4组成全波整流电路,为电源电路和工频同步电路所共用。D5将全波整流电路与电容滤波和稳压电路隔离(参见附录二总原理图),经隔离后A点的电压如图6.2(b)所示(若没有隔离,由于滤波电容的支撑,A点电位在任何时刻都不可能降为零)。全波整流电压经R2、R3和光耦合器IC2,后形成工频同步脉冲,如图6.2(c)

R5100/2WIC3MOC3021JP212CON29VACD44007工频交流电同步电路AD54007D340071D24007D14007C1470uF2IC2TLP521R21K+5VR310K43INT0u2加热功率调整电路+5VR4330KKG图6.1:可控硅导通角控制电路 32

单片机原理实验

所示。当A点电位低于1.1V(光耦合器发光管为红外管,其正向导通电压约为1.1V)时,光敏三极管截止,集电极输出高电平;当A点电位略高于1.1V时,光敏三极管导通,集电极 输出低电平。将工频同步脉冲接到,INT0端,由脉冲下降沿触发“外部中断0”在“外部中断0”服务程序设置定时器,延时一定时间后输出控制脉冲从而实现导通时间(或导通角)的控制,如图6.2(d)和(e)所示,脉冲控制方式下单片机输出的控制脉冲必须与工频交流电同步,才能使可控硅的导通角稳定。

单片机对光耦合可控硅的控制也可采用电平(或开关)控制方式,如图6.2(f)和(g)所示,此时光耦合可控硅相当于一个交流开关。当某时间段单片机输出一个电平信号时,可控硅导通;当单片机的输出控制电平降为零时,可控硅将延迟至交流电压过零时关断。

2. 可控硅脉冲控制方式的控制原理

在实验五中,已将T0定时器用作为主程序循环的4mS定时,T1计数器已用于温度/频率转换电路(即555振荡电路)的输出脉冲计数,因此只能使用外部中断INT0和T2定时器配合才能实现可控硅导通时间的控制。具体方法如下:①在主程序中根据给定的控制温度和温度的实标测量值,由二者的误差计算好控制时间,并开放外部中断

图6.2:可控硅控制电路有关信号

(a)交流电压;(b)全波整流电压; (c)同步脉冲;(d)导通角控制脉冲;

(e)导通角控制时负载电压; (f)电平控制;(g)电平控制时负载电压 (f) (e) 控制时间 uKKG t uA u2 (a) t (b) uINT0 宽度约1.2mS t (c) uKKG t (d) uR5 导通时间 t t uR5 (g) t INT0,如图6.2(e)所示;②交流电过零时,产生同步信号,其下降沿向CPU请求中

断;③在外部中断服务程序中,将主程序预先算好的控制时间设置T2定时器的初值,开放T2定时器中断;④T2定时器定时时间到时,向CPU请求中断;⑤在T2中断服务程序中输出控制脉冲,触发光耦可控硅导通。

上述控制方法的核心问题是:如何由给定的控制温度和温度的实标测量值之间的误差计算控制时间?由于系统每100mS测量温度一次,每测量一次温度,根据误差对可控硅的控制时间作一次相应的调整。记tctrl(n?1)为上次温度测量后可控硅的控制时间,tctrl(n)为本次温度测量后可控硅的控制时间,若采用比例控制,则控制时间可表

33

单片机原理实验

示为:

tct(n)?KC[Cm(n)?Cg] (1) r)l?tct(nr?l1其中Cm(n)为本次测得温度脉冲数、Cg为设定温度脉冲数,二者的差值为本次温度的控制误差,KC为误差放大倍数(或控制的比例系数)。(1)式表明:若当前没得温度比设定温度低,即Cm(n)?Cg,则tctrl(n)?tctrl(n?1),即减小可控硅控制时间(或增大导通时间),增大加热器功率,最终导致温度上升;反之,若当前测得温度比设定温度高,即Cm(n)?Cg,则tctrl(n)?tctrl(n?1),即增大可控硅控制时间(或减小导通时间),减小加热器功率,最终导致温度下降;因此采用(1)式计算可控硅的控制时间,可实现温度的负反馈控制,可实现温度的稳定控制。

如前所述,在INT0外部中断中,根据tctrl(n)的值设置T2定时器的初值tini(n),并开放T2中断,在T2中断服务程序中输出控制脉冲可实现导通时间的控制,采用12M晶振时,tctrl(n)?216?tini(n),因此有

tini(n)?216?tctrl(n?1)?KC[Cg?Cm(n)] (2)

tini(n)?tini(n?1)?KC[Cg?Cm(n)] (3)

其中tini(n?1)?216?tctrl(n?1)上次温度测量后设置T2定时器的初值。

由图6.2(c)可见,由于我们采用的同步电路较简单,因此同步脉冲的宽度约为1.2mS,理论上tctrl(n)的取值范围为:0?tctrl(n)?9.4mS。此外,当可控硅的导通角很小时,负载获得的功率很小。本实验板使用9Vac的交流电,导通角为25°时,导通瞬间交流电压的瞬时值为1.414?9?sin25?5.3V,扣除可控硅的导通压降后,负载电压的有效值仅约0.3V,功率很小。因此tctrl(n)的有效取值范围可定为:

?0.2mS?tctrl(n)?8.0mS,即

E0C0H?tini(n)?FF00H (4)

由(3)、(4)二式可得计算tini(n)的程序流图,如图6.3所示。若设定温度保存在

单元,当前测得的脉冲数保存在单元,本次测温后求得的定时器T2的初值保存在单元,最大控制时间(即T2初值的最小值)的高位和低位分别记为TCMAX0和TCMAX1,控制比例系数记为KC2,常数TCMAX0、TCMAX1、KC2在“变量及常数定义”子模块VARDFN.ASM中定义,则计算tini(n)的算法子程序清单如下。比例系数KC2越大,控制精度越高,但也容易引起振荡,该系数的取值应通过实验确定,经调试可取KC2=10,以下程序要求常数KC2<127。

;====求控制时间或T2定时器初值子程序==== ;入口条件=当前测得的脉冲数 ;出口条件=T2定时器初值 ;使用ACC、B、PSW、DPTR、R2~R5

FTCTRL:MOV A,SNUM1 ;设定温度(压缩BCD)转二进制 MOV R5,A

34

单片机原理实验

SWAP A 将设定温度转换为二进制; ANL A,#0FH 查表转换为脉冲数;计算误差 MOV B,#0AH =设定脉冲数-测量脉冲数 MUL AB N Y XCH A,R5 误差为负? ANL A,#0FH Y Y ADD A,R5 偏差>256? 偏差<-256? MOV R5,A N N MOV DPTR,#TTAB ;查设定温度脉冲数 计算=KC2*本次误差 RL A 计算=+ MOVC A,@A+DPTR MOV R4,A Y N MOV A,R5 被加数为正? RL A Y Y INC A 和<最大值? 和>最小值? MOVC A,@A+DPTR N N CLR C ;=本次误差 =最大值 =最小值 SUBB A,R3 MOV R3,A 关闭外中断INT0;= MOV A,R4 恢复外中断INT0设置;返回 SUBB A,R2 MOV R2,A 图6.3:控制时间相应的定时器初值计算 JB ACC.7,PDTC0 ;误差为负则转移 JNZ FTC2 ;偏差>256则转移 SJMP FTC1 FTC0:CPL A

JNZ FTC5 ;偏差<-256则转移 FTC1:MOV A,R3 ;=KC2*本次误差 MOV B,#KC2 MUL AB MOV R5,A MOV R4,B MOV A,R2 MOV B,#KC2 MUL AB ADD A,R4 MOV R4,A

MOV A,R5 ;=+ ADD A,TCTRL1

35

单片机原理实验

MOV R5,A 中断入口0003H转移 MOV A,R4 INT0中断服务子程序 JB ACC.7,FTC4 ;被加数为正?负则转移 ADDC A,TCTRL0 根据主程序中计算结 MOV R4,A 果设置T2定时器初值 JNC FTC3 ;和<最大值? FTC2:MOV R4,#0FFH ;=最大值 启动T2工作;允许T2FTC3:CJNE R4,#0FFH,FTC6 中断;清T2举出标志 MOV R5,#00H SJMP FTC6 返回 FTC4:ADDC A,TCTRL0 MOV R4,A (a) CLR C ;和>最小值?

中断入口002BH转移 MOV A,R5

T2中断服务子程序 SUBB A,#TCMAX1

MOV A,R4

KKG引脚输出20uS负 SUBB A,#TCMAX0

脉冲;关闭T2;禁止 JNC FTC6

T2中断;清T2举出举FTC5:MOV R4,#TCMAX0 ;=最小值

出标志 MOV R5,#TCMAX1

FTC6:MOV C,EX0 ;保存外中断INT0设置 CLR EX0 ;关闭外中断INT0 返回 MOV TCTRL0,R4 ;=

(b)

MOV TCTRL1,R5

图6.4:中断服务子程序 MOV EX0,C ;恢复外中断INT0设置

(a)外部中断;(b)T2中断 RET

3. 中断服务子程序

如前所述,可控硅控制时间(或导通时间)的控制需外部中断INT0和定时器T2中断配合使用才能实现,中断服务子程序是主程序的一部分。中断服务子程序应尽量简捷,避免将复杂的运法和逻辑判断放在中断服务子程序中,以使中断响应后需要现场保护的内容尽可能地少。图6.4为本实验的中断服务子程序流图,程序清单如下,由于中断服务子程序未使用到主程序可能使用的任何寄存器资源,因此不需要进行中断现场保护。

;====中断服务子程序====

INTS:MOV TL2,TCTRL1 ;外部中断;开启T2并允许中断 MOV TH2,TCTRL0 SETB TR2 SETB ET2 ;允许T2中断 CLR TF2

36

单片机原理实验

RETI

T2SER:CLR KKG ;T2中断触发可控硅 CLR TR2 CLR TF2 CLR ET2 NOP ???? ;共16个NOP指令 NOP

SETB KKG RETI

T0SER: RETI

四、 实验内容

1. 简易温度控制器设计

在实验板上设计一个系统,实现以下功能:①上电时4位数码管显示“8952”1秒,指示灯全亮。②紧接着转换为温度计模式,关闭加热器,显示当前测量的温度值,同时LD1灯亮表示当前显示内容为实测温度,此时按键K0~11无效,SW1和SW2键有效。③在温度计模式下,若按SW2键一次,转换为设置控制温度模式,此时关闭加热器,可开始对控制温度(有效范围0000~0099)进行设置,LD2亮表示此时可以利用数码显示和按键K0~9进行控制温度赋值,K0~9键代表“0~9”数值键,每按1次数值键后,原4位显示数值在显示器上左移1位,新输入的数值从右边进入,输入数值的位数不限,但显示器的最高两位始终为零。④在设置控制温度模式下,若再按“SW2”键一次,显示器上显示的数值保存,重新回到温度计模式,显示实测温度,LD1亮。⑤在温度计模式、LD1亮的情况下,若按SW1键一次,转换为开关方式温度控制器模式,此时显示器高两位显示设置的控制温度,低两位显示实测温度,LD3亮表示系统工作于开关式温控器模式,此时若实测温度达不至设定温度,则打开加热器及点亮LD8,反之关闭加热器及熄灭LD8。⑥在开关方式温度控制器模式下,再按SW1键一次,转换为脉冲式温度控制模式,此时显示器高两位显示设置的控制温度,低两位显示实测温度,LD4亮表示系统工作于脉冲式温控器模式,单片机根据控制误差实时调整可控硅控制时间(即调整加热器功率),实现温度控制。⑦在反馈式温控器模式下,按SW1键一次,重新回到温度计模式,关闭加热器,显示温度,LD1亮。

请根据上述功能描述,用实验四所述的“状态分析法”对系统的状态、状态转移条件进行分析,得出系统的状态及其转移表;画出系统主程序框图、各工作状态细化流程图,写出主程序、各工作模块程序清单。

建立工作文件夹“E:\\学号\\实验六”,使用“WAVE 3.2”集成开发软件,以“MAIN.ASM”文件名建立源程序文件,录入、编辑“温度控制器系统”的主程序。

2. 可控硅控制时间算法子程序设计

以“FTCTRL.ASM”文件名建立源程序文件,录入、编辑可控硅控制时间算法子程序。

3. 程序移植

37

本文来源:https://www.bwwdw.com/article/zu4.html

Top