版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机原理实验单片机原理实验讲义郭海燕周小方编漳州师范学院物理与电子信息工程系2010年11月ii前言随着微电子技术的发展,当前各种电子设备中几乎都能见到微控制器的身影,单片机原理课程是电子信息科学与技术、电子信息工程、电气工程及其自动化等本科专业学生的重要专业课,是这些专业学生首次学习与微控制器有关的课程,学好本课程内容,掌握单片机应用系统程序设计方法,养成良好的设计规范,对学生进一步学习其它功能更强、复杂性更高的微控制器(或微处理器)有重要意义。课程主要讲述51系列单片机的内部结构、指令系统和编程设计方法,是一门实践性很强的课程。本实验讲义共安排六个实验,分别为:实验一、单片机集成开发环境
2、入门;实验二、I/O口输入输出实验循环灯程序设计;实验三、I/O口输入输出实验LED数码管动态显示与按键去抖程序设计;实验四、定时器应用实验LED数码动态显示与矩阵键盘赋值程序设计;实验五、计数器应用实验基于热敏电阻和555电路的简易温度报警系统设计;实验六、中断实验简易温度控制器设计。其中实验一是入门实验,为基础性实验,另五个实验为设计性、综合性实验。围绕“简易温度控制器”这个实际应用系统的设计的各个环节展开,每个实验完成最终系统的一个或二个子模块的设计,最终将各模块集成为一个完整系统。本实验采用自制实验板,三名学生领用1套实验板和1条下载线,组成讨论小组,以个人电脑为设计平台,利用课外时间
3、完成设计、仿真和调试等前期工作,在利用课内2课时时间集中进行点评和设计总结。五个设计性、综合性实验均采用“WAVE 3.2”集成开发环境完成程序设计、仿真,并最终下载到自制的系统板中运行,其设计、仿真、调试过程与真实的工程设计无异,全方位实践CDIO工程教育理念,突出“构思(Conceive)、设计(design)、实现(implement)”三个重要环节,对提高学生工程创新能力、综合应用所学知识解决实际工程问题的能力有重要作用。在单片机应用系统设计中,最核心的问题如何构建系统监控程序,最重要的程序设计方法是模块化程序设计法,最重要的系统分析方法是状态及转移分析法。本讲义的五个设计性实验的设计
4、内容着重突出状态及转移分析法和模块化程序设计法,力图让学生初步建立单片机应用系统程序的宏观结构框架,而不过分纠缠各种算法子程序的微观结构及编程技巧。就前者而言,未能应用系统程序的宏观结构框架,意味着课程教学目标未能达到;就后者而言,建立后者需经长期专业工作的积累,对初学者不能要求过高,且有各种资料可供参考。目录前言实验一、单片机集成开发环境入门实验二、I/O口输入输出实验循环灯程序设计实验三、I/O口输入输出实验LED数码管动态显示与按键去抖程序设计实验四、定时器应用实验LED数码动态显示与矩阵键盘赋值程序设计实验五、计数器应用实验基于热敏电阻和555电路的简易温度报警系统设计实验六、中断实验
5、简易温度控制器设计附录一、WAVE 3.2集成开发环境菜单及其功能说明附录二、AT89S52实验板硬件原理图附录三、单片机ISP下载编程软件及USB下载器简介附录四、“简易温度控制器”设计项目程序汇总单片机原理实验实验一、单片机集成开发环境入门一、 实验目地1 掌握单片机集成开发软件“WAVE 3.2”的开发环境配置。2 掌握单片机集成开发软件“WAVE 3.2”的基本功能,了解MCS-51系列单片机应用系统的软件开发过程。l 掌握创建工程项目和管理工程项目的方法。l 掌握MCS-51系列单片机汇编程序的编辑、编译方法。l 掌握MCS-51系列单片机汇编程序的仿真调试方法和观察窗口的使用。二、
6、 实验设备PC 兼容机一台,操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”。三、 实验原理1 单片机集成开发软件“WAVE 3.2”简介单片机应用程序的设计步骤通常可分为以下几步:(1)根据单片机应用系统的功能进行算法构思和设计,画出程序流程图;(2)用单片机汇编语言、C语言或PLM语言(初学者一般应采用汇编语言)编写源程序;(3)将源程序翻译成单片机可执行的机器码程序,即所谓的目标程序,该过程称为汇编或编译;(4)程序调试,将目标程序下载到目标单片机(即应用系统板中的单片机),运行目标程序,对运行结果进行监控。若运行结果与预期结果相符,程序正确,调试结束;否则由结
7、果的差异分析算法或程序的可能错误,重复步骤2至4,修改源程序、重新汇编、再调试,直至程序正确。以上步骤2至4可应用单片机集成开发软件在个人计算机上完成。“WAVE 3.2”是一款功能强大的单片机集成开发软件,可开发多个系列的单片机应用系统。该软件主要功能有:(1)集成了文本编辑器,可对源程序进行编辑、修改;(2)集成了汇编器,可对源程序进行汇编,自动查找源程序中的语法错误,并将无语法错误的源程序翻译成目标程序;(3)集成了仿真调试器,可对目标系统进行在线仿真调试,也可在个人计算机上对目标程序进行模拟仿真调试。在线仿真调试,必需借助硬件仿真器,PC机通过硬件仿真器与目标系统相连,可用PC机监控目
8、标程序的运行,目标单片机内部RAM和特殊功能寄存器的值可实时反馈回PC机。程序员通过分析目标单片机内部RAM和特殊功能寄存器的值、观测目标程序与单片机应用系统的配合情况,判断系统的软硬件是否正确。模拟仿真调试是一种纯软件模拟,它直接利用PC机的资源,在PC机上模拟目标程序的运行,并显示虚拟单片机内部RAM和特殊功能寄存器的值,程序员通过分析虚拟单片机内部RAM和特殊功能寄存器的值仅能判断与硬件无关的那部分软件的正确与否,无法判断单片机应用系统的硬件是否正确,目标程序与系统硬件是否匹配。由于在线仿真调试需要硬件仿真器,设备成本较高,使用较复杂,不利于普及。因此,本课程的实验将采用模拟仿真调试与硬
9、件无关的部分软件(这部分软件所占比例很大),采用将目标程序下载到目标系统中实际运行,进行软硬件综合调试。2 集成开发软件“WAVE 3.2”的界面图1.1:WAVE集成开发环境界面启动“WAVE 3.2”后,集成开发软件的界面如图1.1所示,菜单功能见附录一。主菜单工具栏项目窗口观察窗口窗口编辑窗口(30H)十进制加1(30H)=50H ?调用10mS延时子程序YN循环变量(30H)=0图1.3:50mS延时子程序返回P1.0求反调用500mS延时子程序初始化图1.2:产生方波流程图开始3 单片机应用程序设计及调试方法以下举例说明51系列单片机应用程序设计及调试的主要方法,主要步骤如下:创建工
10、程项目,编辑源程序;汇编或编译;使用软件模拟器及观察窗口调试程序。以实现“从P1.0口输出1Hz方波”程序为例。先进行算法设计,若每隔500mS将P1.0求反,则P1.0口将输出频率为1Hz的方波,程序流图如图1.2和图1.3所示。为了能在本例中能尽可能多地实践程序调试方法,我们故意将500mS延时子程序复杂化,采用二级子程序嵌套,并引入十进制加法运算。该程序的汇编源程序清单如下ORG 0000HLJMP MAINORG 0030HMAIN:MOV SP,#60H;初始化MAIN1: XRL P1,#01H;P1.0求反ACALL DELAY;调用500mS延时子程序SJMP MAIN1DEL
11、AY:MOV 30H,#0;500mS延时子程序DELAY1:ACALL D10MS;调用10mS延时子程序MOV A,30HADD A,#01HDA AMOV 30H,ACJNE A,#50H,DELAY1RETD10MS:MOV R6,#20 ;延时(2*R7+4)*R6+5=10005机器周D10MS1:MOV R7,#248NOPDJNZ R7,$DJNZ R6,D10MS1RETEND3.1 创建工程项目建立一个工作文件夹(不妨取为E:学号实验一)用于保存与本例的工程项目有关的各种文件。启动WAVE软件,系统将自动打开最近使用过的工程项目,将所有窗口全部关闭。编辑源程序,选择菜单文件
12、|新建文件功能,出现一个文件名为NONAME1 的源程序编辑窗口,在此窗口中输入上述程序,选择菜单文件|保存文件或文件|另存为功能,将文件保存到工作目录中,文件名自定义,如取为eg1.asm,文件保存后,程序窗口上文件名变成了:E:学号实验一eg1.asm。建立新的项目,选择菜单文件|新建项目功能,自动打开项目名为UNTITLED的项目窗口,并弹出加入模块文件对话框,选择eg1.asm源程序文件,点击打开。紧接着弹出加入包含文件对话框,因没有需要添加的其它文件,点击取消钮。再接着弹出保存项目对话框,键入工程项目的名称project,点击保存钮,项目窗口中的项目名称显示为project.prj。
13、注意:工程项目文件、源程序文件等要保存在同一文件夹中。设置项目,选择菜单设置|仿真器设置功能或按“仿真器设置”快捷图标或双击项目窗口的第一行来打开“仿真器设置”对话框。由于本课程实验没有使用硬件仿真器,自制实验板的CPU型号为AT89S52,因此在“仿真器”栏中应如下设置仿真器:在仿真器标签中任意选取仿真器和仿真头,只要所选仿真器和仿真头可仿真的CPU列表中有8032或8732即可,并选择其中一款CPU,然后选中“使用伟福软件模拟器,并设置晶体频率1200000Hz。在“语言”栏中,由于本课程实验均采用汇编语言编写程序,因此“编译器选择”选择“伟福汇编器”。当仿真器设置好后,再次保存项目,完成
14、项目创建。3.2 汇编(或编译)程序选择菜单项目|编译功能或按编译快捷图标,编译你的项目。在编译过程中,如果源程序有语法错误,将自动弹出信息窗口,显示错误所在行号及错误编号等信息,双击错误信息,可以在源程序中定位所在行。纠正错误后,再次编译直到没有错误。在编译之前,软件会自动将项目和程序存盘。在编译没有错误后,打开工作文件夹,可以看到文件夹中产生eg1.lst、project.bin、project.hex三个文件,第1个是源程序eg1.asm的汇编列表文件,可用记事本编辑器打开该文件,解读该文件提供的信息;第2和3个文件是该工程项目的二种格式的目标程序(.bin和.hex格式)。3.3 汇编
15、程序的仿真调试方法和观察窗口的使用如前所述,模拟仿真调试的方法是在PC机上模拟目标程序的运行,并显示虚拟单片机内部RAM和特殊功能寄存器的值,程序员通过分析虚拟单片机内部RAM和特殊功能寄存器的值仅能判断与硬件无关的那部分软件的正确与否。常用先打开合适的观察窗口,用跟踪、单步、执行到光标处等方式来调试程序。比如 打开CPU窗口、数据窗口(DATA窗口)、外设端口,适当调整各窗口位置和大小,如图1.4所示。图1.4:WAVE软件工作环境在主窗口下方的状态栏中显示CPU的当前状态,包括PC、DPTR、ACC、PSW、SP的值及上次程序执行(跟踪、单步、或执行到光标处)的时间。在CUP窗口中,第一栏
16、显示每条指令的地址、机器码、反汇编结果、对应的源程序行,若该栏未显示正确指令,可重新编译;第二栏显示SFR及其值,第三栏显示被选中的SFR名位的值,被选中的SFR的名称和值的显示格为立体框样式。点击跟踪快捷图标,程序转移到“MAIN”标号行,此时在源程序窗口最左边出现“o”和“=”符号,其中“o”代表此行为有效程序,此行产生了可以执行的机器码,伪指令不产生机器码;“=”所指的行(被点亮的行)就是下次将要执行的程序指令行。数据窗口逐行显示内部RAM的内容,每行16字节。端口显示P0、P1、P2、P3的状态,“”表示高电平(即逻辑1)。由于待调试程序仅涉及SFR中的ACC、PSW、SP和RAM中R
17、6、R7、30H单元、堆栈(60H7FH),为了便于观察这些单元的内容变化,可在CPU窗口中关闭无关的SFR的显示,添加R6、R7、30H单元的显示。选择菜单仿真器|设置汇编预定义符号功能,弹出符号定义对话框;例如要关闭DPL,则双击DPL,将DPL的用途由“预定义符号SFR窗口显示”改为“预定义符号”,确认修改;例如要添加R6,则点击“添加”钮,输入名称R6、地址06H,图1.5:经修改后CPU窗口中的第二、三栏用途选择为“预定义符号SFR窗口显示”,确认修改。所有修改完后,关闭CPU窗口,再重新打开CPU窗口,此时窗口第二、三栏的显示内容如图1.5所示,添加30H单元时,将该单元取名为XR
18、1。跟踪法调试程序。在“=”指向“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
19、窗口SP值的变化及RAM窗口62H、63H内容的变化,这些变化反映子程序二级嵌套的断点保护。继续点击跟踪快捷图标6次,每次均观察CPU窗口的变化,从第5次开始,循环执行“DJNZ R7,$”指令,若继续用跟踪法调试程序,还需点击245次才能结束循环,调试效率太低,可用以下的“断点”法调试。跟踪及断点调试法。用鼠标左键点击“DJNZ R6,D10MS1”程序行,光标移至该行,点击鼠标右键,打开快捷菜单,选择“执行到光标处”,观察“=”和程序执行时间的变化。继续点击跟踪快捷图标4次,每次均观察CPU窗口R6、R7的变化,从第4次开始又进入“DJNZ R6,D10MS1”循环。至此,根据程序执行情况
20、,已可判断10mS延时程序编写基本正确,用鼠标左键点击D10mS子程序的“RET”行,选择“执行到光标处”,观察观察CPU窗口R6、R7的变化和执行时间。点击跟踪快捷图标,执行“RET”,结束子程序调用,观察SP值的变化和程序的转向,这些情况反映子程序返回时的断点击栈情况。继续点击跟踪快捷图标5次,每次均观察CPU窗口变化,第5次执行“CJNE A,#50H,DELAY1”指令,“=”指向“DELAY1:ACALL D10MS”,由于前面的调试已表明D10MS子程序正确,若再采用前述的调试方法,调试效率太低,可采用以下的单步调试方法。单步调试法。点击单步快捷图标1次,观察“=”的指向和执行时间
21、;继续点击单步快捷图标5次,每次均观察CPU窗口的变化。至此,500mS延时子程序调试基本完成,仅剩(30H)单元十进制加1的算法逻辑是否正确无法判断,采用以下方法可提高调试效率。先双击CPU窗口的XR1,将XR1值修改为49H,然后继续点击单步快捷图标,并观察CPU窗口的变化,直至执行“DELAY”子程序的返回指令“RET”。至此500mS延时子程序调试完毕。返回主程序以后,继续重复点击单步快捷图标,观察每一单步执行的结果和执行时间,判断主程序的逻辑是否正确。模块化程序的调试程序设计通常采用模块化的结构,因此程序调试一般也按模块进行调试。通常先调试子程序,再逐模块调试各功能模块,在子程序或模
22、块程序调试时,常采用修改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中。试进行算法设计,画出程序流图,写出汇编语言源程
23、序。按“实验原理”中所述,完成该程序的项目创建、编译程序、程序调试等内容。五、 实验报告要求实验报告要求写明实验目的,并提交以下内容。1 提交“实验内容2”中的程序流图、汇编语言源程序清单。2 简述“实验内容2”中的程序的调试方法。实验二、I/O口输入输出实验循环灯程序设计一、 实验目地1 掌握51系列单片机I/O端口操作方法,I/O端口控制程序的编写。2 了解数码管动态显示的工作原理,了解按键抖动的现象。3 掌握51系列单片机目标程序的下载方法。4 掌握循环速度可键控循环灯控制程序设计方法。二、 实验设备PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为Wind
24、owsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。三、 实验原理1 AT89S52单片机实验板简介本实验采用自制实验板,实验板硬件原理图参见附录二。该实验板的主芯片为AT89S52,含有稳压电源电路、CPU及时钟电路、复位电路、在线编程接口电路、独立键盘电路、数码显示电路、矩阵键盘电路、循环灯(指示灯)电路、工频交流电同步电路、温度测量电路、加热功率调整电路、扩展EEPROM电路、扩展串口电路、扩展数字电位器(或D/A)电路、扩展四通道A/D转换器电路。其中稳压电源电路、CPU及时钟电路、复位电路、在线编程接口电路、独立键盘电路都是典型电路,其原理不再赘述,其它模块将在
25、实验二至六中使用,各模块电路的工作原理在各实验中介绍。2 循环灯(指示灯)电路工作原理表2.1:发光管真值表CS4P0.0LD1H灭LH灭LL亮图2.1:循环灯电路工作原理如图2.1所示,8只红色发光管LED接成共阳极形式,开关管T5控制8只共阳极发光管的电源,当CS4(P2.4)引脚输出0时,T5导通,发光管阳极得到5V电源,CS4为循环灯(或指示灯)模块的选择控制端。各发光管的阴极分别经限流电阻R714后由P0口控制,当CS4=0时,P0口某位(如P0.0)为0时,与该端口相连接的发光管(如LD1)点亮,反之发光管熄灭。循环灯(指示灯)真值表如表2.1所示。当CS4=0,P0.0=0时,L
26、D1点亮,若忽略开关管T5和P0.0口内部MOS管的饱和电压降,则流过LD1的正向电流为式中为发光管正向导通电压,红色发光管的,因此。若只发光管全部点亮,则通过开关管T5的电流为54.4mA,T5选用9012(200mA/50V)可以满足要求。当CS4(P2.4)=0时,若P2.4引脚内部MOS管的饱和电压降,则T5基极控制电流为0.9mA,该基极电流要驱动54.4mA的集电极电流,T5管的放大倍数需超过60倍,通常9012均能满足此要求。发光管的亮度与流过发光管的正向电流大小有关,也与发光管的发光效率有关,按发光效率区分,光发管通常可分为超高亮度(用于室外)、高亮度(用于室内)、普通亮度(用
27、于较暗背景)3种,根据不同的亮度要求,3发光管的正向电流可设定在范围内。3 定速循环灯的软件设计开始(转主程入口)选择循环灯模块(CS4=0)熄灭所有LEDP0S赋初值P0S值从P1输出P0S左循移延时0.5秒图2.2:循环灯流程图若采用软件延时的方法使8盏LED灯从右至左(LD1LD2LD8LD1)循环点亮,循环速度固定,每盏灯亮的时间0.5秒。根据循环灯控制要求和真值表2.1,用RAM的1个单元(如记为P0S,地址31H)来记录8个LED的状态,P0S的每位对应有尽有只LED,从低位到高位分别对应LD1到LD8,某位的逻辑值为0表示相应LED为亮(负逻辑)。P0S的初始值为0FEH(LD1
28、亮,其它灭),每隔0.5秒P0S的值左循移1位,并将P0S的值从P1口输出,从而实现循环灯控制,程序流图如图2.2所示,程序清单如下;=程序首“ORG 0000H”前定义各变量=CS4BIT P2.4P0SEQU 31H;P0口的输出状态;=ORG 0000HLJMP MAINORG 0030HMAIN:CLR CS4MOV P0,#0FFH;LED灯全灭MOV P0S,#0FEH;右边第一个亮MLOOP:MOV A,P0SMOV P0,ARL AMOV P0S,ALCALL DELAY;延时0.5秒AJMP MLOOP;=延时0.5S子程序=DELAY:MOV R5,#200;延时(2*R7
29、+3)*R6+5)*R50.5SDL00:MOV R6,#05DL01:MOV R7,#250DL02:DJNZ R7,DL02DJNZ R6,DL01DJNZ R5,DL00RETEND图2.2:独立键盘接口电路4 独立健盘使用实验板中配有两个独立按键,如图2.2所示。由于P1口内部有上拉电阻(2040k),当按键SW1(或SW2)按下时,端口P1.6(或P1.7)为低电平,而按键松开时,端口P1.6为高电平。将P1口的状态读至ACC,可以判断是否有键按下,ACC.6=0(或ACC.7=0)表示有SW1(或SW2)键下,此种状态表示为负逻辑表示,A求反后可得正逻辑表示。若用RAM的1个单元(
30、如记为KEY,地址30H)来记录独立按键的状态,则可采用以下子程序读取、并保存按键的状态。;=程序首“ORG 0000H”前定义各变量=KEYEQU 20H;保存按键的状态SW1BITKEY.6;SW1键要内部RAM的映射SW2BITKEY.7;SW2键要内部RAM的映射;=读独立键盘子程序=RDKEY:ORL P1,#0C0H;读I/O,先置1再读入 MOV A,P1 XRL A,#0C0H;第6和7位求反,转为正逻辑MOV KEY,A;保存键状态RET四、 实验内容1 定速循环灯项目调试建立定速循环灯项目建立工作文件夹“E:学号实验二”,采用实验一所述方法完成以下任务,建立定速循环灯项目、
31、建立源程序文件、编辑源程序、编译。按实验一所述方法,使用伟福软件模拟器对定速循环灯项目进行模拟仿真。将软件模拟调试通过的目标程序下载到目标实验板的CPU(AT89S52)上,下载方法参见附录三。取下下载器,上电试运行,观察循环灯运行情况。2 循环速度可键控循环灯项目设计设计一个可以用按键控制循环灯循环速度的工程项目,该项目可实现以下功能:开始时,循环灯从右到左循环点亮,每盏灯亮的时间为2.5mS,采用软件延时的方法实现;通过独立按键SW1和SW2可改变循环灯循环速度,每盏灯亮的时间从2.5mS至0.5S可步进调整,每按一次SW1键,每盏灯亮的时间增加2.5mS;每按一次SW2键,每盏灯亮的时间
32、减少2.5mS。本设计项目算法的核心是编写一个延时时间可调的延时子程序,延时时间从2.5mS至0.5S可键控步进调整,步进值2.5mS。可采用以下方法实现:在内部RAM中定义1个变量,如TDL、地址30H、初值为#01H,在主程序的每一次循环中都读一次独立按键的状态,并根据SW1(或SW2)键的状态对TDL进行加1(或减1)控制;将“定速循环灯”控制程序中延时子程序的“MOV R5,#200”指令改为“MOV R5,TDL”,即可实现循环灯循环速度键控。项目程序设计完后,完成以下任务:建立循环速度可键控循环灯项目,建立项目、建立源程序文件、编辑源程序、编译。使用伟福软件模拟器对循环速度可键控循
33、环灯项目进行模拟仿真。将软件模拟调试通过和目标程序下载到目标实验板的CPU(AT89S52)上,取下下载器,上电试运行,观察循环灯运行情况、按键SW1和SW2对循环速度的控制作用。注意观察以下现象。其一是,当总循环周期为20mS(每盏灯亮的时间为2.5mS)时,循环灯亮成一条直线,当循环周期大于40mS时,循环灯或逐个点亮、或亮成一条抖动的直线(即频闪现象)。其二是,点击SW1和SW2键时,单片机有时可检测到按键,有时检测不到按键。其三是,点击一次按键时,单片机有时会检测到多次按键。五、 实验报告要求实验报告要求写明实验目的,并提交以下内容。1 简述“循环速度可键控循环灯”控制算法原理,提交程
34、序流图、汇编语言源程序清单。2 对在实验板运行“循环速度可键控循环灯”项目目标程序所观察到的现象进行分析,解释其原因。3 回答思考题。六、 思考题1 调整哪些电路参数可以调整循环灯的亮度。2 如果8只LED发光二极管改为8只LED数码管,使用类似于循环灯方式,循环点亮8只LED数码管,若要正常显示没有频闪,每只LED数码管显示的时间不能超过毫秒?实验三、I/O口输入输出实验LED数码管动态显示与按键去抖程序设计一、 实验目地1. 掌握LED数码管动态显示电路工作原理及其驱动程序设计方法。2. 掌握软件处理按键去抖动的算法原理及其程序设计方法。3. 学习模块化程序设计方法。二、 实验设备PC 兼
35、容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。三、 实验原理1 LED数码管动态显示电路工作原理在实验二中,我们观察到当循环灯的总循环周期为20mS(每盏灯亮的时间为2.5mS)时,循环灯亮成一条直线。这个现象是由于眼睛有视觉惰性,即光像一旦在视网膜上形成,视觉将会对这个光像的感觉维持一个有限的时间,这种生理现象叫做视觉暂留性,光亮度越大视觉暂留时间越长,对中等亮度的光刺激,视觉暂留时间约为0.05至0.2秒。循环灯完成一次循环称为一帧图像,由于LED的亮度较低,当每秒超过40帧图像时,
36、循环灯亮成一条直线,无频闪感觉。图3.1 LED数码管动态显示电路LED数码管动态显示电路如图3.1所示,其工作原理也是基于眼睛的视觉暂留效应,与循环灯的工作原理相似。在图3.1中,SEG14为4只共阳极数码管,8只LED指示灯LD18也按共阳极联接,相当于1只共阳极数码管(记为SEG5),每只数码管均通过开关管9012控制阳极电源,电路中电阻R714、开关管T15的选择方法与实验二所述方法相同。LED数码管动态显示采用循环点亮(或扫描)数码管,当每秒的总循环超过40次时,即每秒40帧像以上,将产生每个数码管“连续点亮”的视觉效果。DSB0七段码DSB1七段码DSB2七段码DSB3七段码DSB
37、4灯状态DSW=0DSW=1DSW=2DSW=3DSW=425mSDSB0七段码DSB1七段码DSB2七段码DSW=0DSW=1DSW=225mSP0.0.7CS0CS1CS2CS3CS4图3.2:5位LED数码管的动态显示时序2 显示驱动程序设计方法若在单片机内部RAM中指定1个字节作为扫描循环变量(记为DSW)和5个字节的显示缓冲区(记为DSB04),其中DSB03分别保存个、十、百、千位数码的显示数据,DSB4保存8个指示灯的状态(每位对应一个指示灯状态,该字节应可位寻址),则5位LED数码管的动态显示时序如图3.2所示。若主程序循环中每隔5mS调用一次LED数码管动态显示子程序,如图3
38、.3所示,则5位LED数码管动态显示子程序的算法流图如3.4所示,部分程序清单如下。初始化5mS到?调用读键状态及去抖处理子程序调用数码管动态扫描显示子程序图3.3:主程序循环YN;=5位数码管扫描子程序=DISP:ORL P2,#1FH;关闭数码显示器MOV A,DSW;根据扫描循环变量转移ANL A,#07H RL AMOV DPTR,#DSTABJMP A+DPTRDSTAB:AJMP DIS0AJMP DIS1AJMP DIS2AJMP DIS3AJMP DIS4AJMP DIS0AJMP DIS0AJMP DIS0DIS0:MOV A,DSB0;扫描个位数码管 ANL A,#0FHM
39、OV DPTR,#LED7;查显缓个位值的七段码表MOVC A,A+DPTRMOV P0,A;七段码送P0口关闭数码显示器扫描个位数码管图3.4:5位LED数码管动态显示子程序流图根据扫描循环变量(DSW)转移(DSW)=0扫描十位数码管(DSW)=1扫描百位数码管(DSW)=2扫描千位数码管(DSW)=1扫描指示灯(DSW)=2返回CLR CS0;点亮个位数码管MOV DSW,#01H;扫描指针指向下十位RETDIS1:;扫描十位数码管DIS2:;扫描百位数码管DIS3:;扫描千位数码管DIS4:MOV A,DSB4;扫描指示灯 CPL AMOV P0,ACLR CS4MOV DSW,#00
40、HRET;=LED段码表=LED7:DB 0C0H,;09,af共16个七段码3 键去抖动的软件处理方法t键状态键按下时刻键状态稳定20mS图3.5:键抖动及处理原始键状态去抖后键状态在实验二中,我们还观察到以下两现象,其一是,点击SW1和SW2键时,单片机有时可检测到按键,有时检测不到按键;其二是,点击一次按键时,单片机有时会检测到多次按键。前者是由于在实验二的“循环速度可键控循环灯”项目中,每换一盏灯主程序循环一次,读一次键状态,当循环时间较长时(超过点出按键时间),将漏过键状态变化,若采用图3.3所示的主程序循环,每5mS读一次键状态,本问题将得到解决。后者是由于键的抖动,所有的按键在按
41、下的初始时间段内,触点未达到稳定接触,连接按键的端口的电平不稳定,CPU读到的键状态不稳定,此即所谓的键抖动,如图3.5所示,通常键抖动发生在键按下的最初20mS内。键去抖动处理方法有多种,软件延时去抖是最常用的方法,其算法原理是CPU一旦检测到键状态有变化表明有键按下,延时一段时间(不小于20mS)后,待键状态稳定后,再读取有效的键状态。在内部RAM指定1字节用于保存键状态,记为KEY,该字节应是可位寻址,以便主程序对键状态的查询;另指定1字节作为键去抖延时器,记为KTMR。若采用图3.3所示的主程序循环,由于系统每5mS调用一次读键状态及去抖处理子程序,因此每次读键状态后,先暂存键状态,若
42、键状态发生变化则启动去抖延时器(实际是记录子程序调用次数,每调用1次相当5mS),延时未到则放弃不稳定的键状态,仍延用原来的键状态;若延时已到则启用新的键状态,键去抖算法如图3.6所示。在一个微机系统中,按键可以有两种用法。其一是不论键按下有多久,按一下只起一次作用,这种按键是键状态变化的前沿起作用,不妨将这种键称为前沿型 (或触发型) 键。其二是键只在按下时才有作用,一旦键松开其作用也消失,不妨称这种键为开关型键。如前所述KEY保存键状态,它保存的是开关型的键状态(按下为1,抬起为0),因此在读键状态及处理子程序中添加了键状态变化前沿提取功能,前沿提取算法如下:若前后两次键状态有变化(异或为
43、1),且本次键状态也为1,则表明键状态发读键、转正逻辑新的键状态暂存键状态变?放弃不稳定的键状态、延用原键状态键前沿提取启用新的键状态图3.6:读键状态及去抖等处理子程序流图YN过了延时时间?NY返回去抖延时器加载初值生了正跃变。在内部RAM中另指定1字节用于保存前沿型的键状态,记为EKEY。;=读独立按键子程序(延时去抖)=RDKEY:ORL P1,#0C0H;先置1,后读口MOV A,P1 ;读键ANL A,#0C0H ;接独立键盘的位保留XRL A,#0C0H ;求反转正逻辑 MOV R7,A ;新的键状态暂存R7CJNE A,KEY,RDK0;键状态变化则转移 MOV KTMR,#05
44、H;去抖延时器加载初值SJMP RDK1RDK0: MOV A,KTMR;过了延时时间? JZ RDK1DEC KTMR;延时未结束 MOV R7,KEY;放弃不稳定的键状态RDK1: MOV A,KEY;键前沿提取 XRL A,R7 ANL A,R7 MOV EKEY,AMOV KEY,R7;启用键的新状态RET4 模块化程序设计方法实际的应用程序一般都由一个主程序(包括若干个功能模块)和多个子程序构成。每一程序模块都能完成一个明确的任务,实现某个具体功能,如发送、接收、延时、显示等。采用模块化的程序设计方法,有以下优点:单个模块程序的功能单一,易于编写、调试和修改;便于分工,可使多个程序员
45、同时进行程序的编写和调试,加快软件研制进度;程序可读性好,便于功能扩充和版本升级;对程序的修改可局部进行,其他部分可以保持不变;对于使用频繁的子程序可以建立子程序库,便于移植到其它工程项目中。在进行模块划分时,应首先弄清楚每个模块的功能,确定其数据结构以及与其他模块的关系;其次是对主要任务进一步细化,将一些专用的子任务交由下一级子模块完成,按这种方法一直细分成易于理解和实现的小模块为止。模块的划分应遵循下述原则:每个模块应具有独立的功能,完成一个明确的任务。模块之间的控制耦合应尽量简单,数据耦合应尽量少,这就是模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交
46、换方式、交换量的多少及交换的频繁程度。模块长度适中。模块语句的长度通常在20条100条的范围较合适。模块太长时,分析和调试比较困难,失去了模块化程序结构的优越性;过短则模块的连接太复杂,也不合适。例,如图3.3所示程序结构框架,可将模块分成主程序、初始化模块、读键状态及去抖处理子程序、数码管动态扫描显示子程序4个模块。采用汇编语言编程时,主程序清单如下(文件名MAIN.ASM):;=变量定义段=CS0BIT P2.0;个位位选CS1BIT P2.1;十位位选CS2BIT P2.2;百位位选CS3BIT P2.3;千位位选CS4BIT P2.4;LED灯位选DSWEQU 30H;位选计数DSB0
47、EQU 31H;显示缓冲单元个位DSB1EQU 32H;显示缓冲单元十位DSB2EQU 33H;显示缓冲单元百位DSB3EQU 34H;显示缓冲单元千位DSB4 EQU 20H;显示缓冲单元指示灯状态LD1 BIT DSB4.0 ;指示灯LD1控制位;指示灯LD27控制位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键前沿KTMREQU 35H ;键去抖延时器;=OR
48、G 0000H LJMP MAINORG 0030HMAIN: INCLUDE INITIAL.ASM;添加初始化模块MLOOP:LCALL DELAY;延时5msLCALL RDKEY ;读键LCALL DISP;主程序中的其它任务M05:LJMP MLOOP;=延时子程序(2*R7+3)*R6+5=5ms=DELAY:MOV R6,#0AHDL01:MOV R7,#0F8HDL02:DJNZ R7,DL02DJNZ R6,DL01RET;=通用子程序段= INCLUDE RDKEY.ASM;添加读键状态及去抖处理子程序 INCLUDE DISP.ASM;添加数码管动态扫描显示子程序END与
49、高级语言编程不同,当用汇编语言编程时,程序员必须对CPU资源进行统筹规划,因此在主程序的开始处必须有变量定义段,该段中包含IO口定义、所有程序模块所用变量的定义。各程序模块、子程序中所用变量一般不使用各变量的地址,而使用变量的名称(或符号),将所有变量集中在主程序开始处定义,便于CPU资源的统筹规划、调整和修改。各模块、子程序均以文件形式单独编辑和调试,主程序使用伪指令将各模块添加到指定位置,主程序、模块、子程序通常放在同一工作文件夹中。在上述程序清单中, 5mS延时子程序仅有5行,因此未将其作成1个独立模块。四、 实验内容1 5位LED数码管动态显示驱动子程序设计参照图3.4,将“实验原理2
50、”的“5位LED数码管动态显示子程序”中用“”表示的十、百、千位数码管扫描部分程序行、以及程序最后1行的七段码码表写完整。建立工作文件夹“E:学号实验三”,启动“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑5位LED数码管动态显示子程序,编辑完成后,在工作文件夹中,以文件名“DISP.ASM”保存文件。2 独立键盘读键状态及去抖动处理子程序设计 点击“新建文件”快捷按钮,在打开的文件窗口中编辑“实验原理3”中的“读独立按键子程序(延时去抖)”,编辑完成后,在工作文件夹中,以文件名“RDKEY.ASM”保存文件。3 按键控制4位显示数码加减程序设计以图3.3的框图为基
51、础,设计1个工程项目,实现以下功能:上电最初阶段完成下列操作(即初始化),设置内部RAM中60H7FH单元为堆栈区,清除内部RAM中的20H7FH单元,在LED数码显示器中显示“学号”的低4位1秒,之后清除5个显示缓冲单元(这样进入主循环后先显示0000)。在主循环中“”添加内容,以实现“每按1次SW1键,显示数值十进制加1,每按1次SW2键,显示数值十进制减1。”功能可按如下方法实现,在内部RAM中定义1个变量(比如记为,无符号、双字节、压缩BCD码);当CPU查询到SW1键(前沿型),则十进制加1;当CPU查询到SW2键(前沿型),则十进制加9999(等价于减1);将加减1后的送入显示缓冲
52、单元DSB30。按工程项目的功能要求和上述算法,完成以下任务:将图3.3的主程序流程画完整,写出完整的主程序清单;用“WAVE 3.2”软件,点击“新建文件”快捷按钮,在打开的文件窗口中编辑主程序,编辑完成后,在工作文件夹中,以文件名“MAIN.ASM”保存文件,用同样方法建立初始化模块“INITIAL.ASM;在工作文件夹中,以“PROJECT1”文件名创建工程项目,将MAIN.ASM添加到模块文件中,编译项目直至通过;将编译通过的目标程序下载到实验板中,取下下载器,通电试运行;若目标程序运行不能达到预期效果,用实验一、所述方法进行模拟仿真,查找算法、程序错误,再编译、下载、运行目标程序直至
53、达到预期效果,完成调试。五、 实验报告要求实验报告要求写明实验目的,并提交以下内容。1 简述“按键控制4位显示数码加减程序设计”的控制算法原理,提交所有程序流图、汇编语言源程序清单。2 回答思考题。六、 思考题1 “按键控制4位显示数码加减程序设计”项目中,若查询SW1或SW2键时采用开关型键状态,会出现什么现象?可修改程序,在实验板中运行程序,观察现象。2 把5mS软件延时改用定时器/计数器定时,如何实现?并说明两种方法的优缺点。实验四、定时器应用实验LED数码显示与矩阵键盘赋值程序设计一、 实验目地1. 掌握定时器/计数器定时设计方法。2. 掌握矩阵键盘工作原理及读矩阵键盘和去抖程序设计方法。3. 掌握LED数码显示与矩阵键盘赋值程序设计方法。4. 进一步学习模块化的程序设计方法,掌握状态及其转移分析方法。二、 实验设备PC 兼容机1台、目标程序下载接口电路1套、AT89S52实验板1套;操作系统为WindowsXP,安装有单片机集成开发软件“WAVE 3.2”和下载器驱动软件。三、 实验原理1 定时器及其中断在实验三中,我们采用调用处延时程序实现5位LED数码管动态显示,并采用独立键盘对显示内容进行加1和减1设置。我们发现在这样一个简单的设计中,CPU很忙,每时每
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省湛江市雷州市雷州市第五中学集团2025-2026学年七年级上学期11月期中联考语文试题(含答案)(含答案)
- 全国范围内节能减排政策解读:绿色发展理念普及试卷
- 《GB-T 30853-2014牵引电机用铜及铜合金锻环》专题研究报告
- 2026年湖北省抗菌药物临床应用管理办法试题及答案
- 2026年兰州现代职业学院单招职业适应性考试题库附参考答案详解(完整版)
- 2026年南充文化旅游职业学院单招职业技能测试题库含答案详解(b卷)
- 2026年保险职业学院单招职业适应性测试题库含答案详解(典型题)
- 2026年内蒙古交通职业技术学院单招综合素质考试题库附参考答案详解(b卷)
- 2026年华北理工大学轻工学院单招职业倾向性测试题库附答案详解(培优b卷)
- 2026年兰考三农职业学院单招职业技能测试题库附答案详解(研优卷)
- (2025年)焊工(初级)考试题库及答案
- 北京市丰台区2025-2026学年上学期八年级期末英语试卷(原卷+解析)
- 终末期患者恶心呕吐的护理干预策略优化研究
- 2026 年民政局制式离婚协议书正式范本
- 田地种菜出租合同范本
- 2025-2030传统滋补品现代化转型与年轻化营销及投资价值研判
- 神经重症患者的气道管理策略
- 急性前壁再发心肌梗死的护理查房
- 装修避坑知识
- 《风景谈》(教学课件)-统编版高中语文选择性必修下册
- 谈恋爱被骗民事起诉状范本
评论
0/150
提交评论