单片机原理实验
栈(60H~7FH),为了便于观察这些单元的内容变化,可在CPU窗口中关闭无关的SFR的显示,添加R6、R7、30H单元的显示。
选择菜单[仿真器|设置汇编预定义符号]功能,弹出符号定义对话框;例如要关闭DPL,则双击DPL,将DPL的用途由“预定义符号+SFR窗口显示”改为“预定义符号”,确认修改;例如要添加R6,则点击“添加”钮,输入名称――R6、地址――06H,用途选择为“预定义符号+SFR窗口显示”,确认修改。所有修改完后,关闭CPU窗口,再重新打开CPU窗口,此时窗口第二、三栏的显示内容如图1.5所示,添加30H单元时,将该单元取名为XR1。
③跟踪法调试程序。
在“=>”指向“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窗口
中的第二、三栏
单片机原理实验
⑤单步调试法。
点击单步快捷图标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接成共阳极形式,开关管T5控制8只共阳极发光管的电源,当CS4(P2.4)引脚输出0时,T5导通,发光管阳极得到5V电源,CS4为循环灯(或指示灯)模块的选择控制端。各发光管的阴极分别CS4=0时,P0口某位(如P0.0)为0时,与该端口相连接的发光管(如LD1)点亮,反之发光管熄灭。循环灯(指示灯)P00P01P02P03P04P05P06P07+5VT59012R194K7CS4LD8LD7LD6LD5LD4LD3LD2LD1 hfgedcbaabcdefghR7~14470经限流电阻R7~14后由P0口控制,当
图2.1:循环灯电路工作原理 表2.1:发光管真值表 CS4 P0.0 LD1 H - 灭 L H 灭 L L 亮
真值表如表2.1所示。当CS4=0,P0.0=0时,LD1点亮,若忽略开关管T5和P0.0口内部MOS管的饱和电
压降,则流过LD1的正向电流为
ILD1?5?VF R7式中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 P0S
BIT P2.4 EQU 31H ORG 0000H LJMP MAIN ORG 0030H
;LED灯全灭
;P0口的输出状态
开始(转主程入口) 选择循环灯模块(CS4=0) 熄灭所有LED P0S赋初值 P0S值从P1输出 P0S左循移 延时0.5秒 ;============
MAIN: CLR CS4 MOV P0,#0FFH
MLOOP: MOV A,P0S MOV P0,A
RL A
MOV P0S,A LCALL DELAY
MOV P0S,#0FEH ;右边第一个亮
图2.2:循环灯流程图
;延时0.5秒
AJMP MLOOP ;======延时子程序====== DELAY: MOV R5,#200 ;延时((2*R7+3)*R6+5)*R5≈0.5S DL00: DL01: DL02:
MOV R6,#05 MOV R7,#250 DJNZ R7,DL02 DJNZ R6,DL01 DJNZ R5,DL00 RET
8
单片机原理实验
END
4. 独立健盘使用
实验板中配有两个独立按键,如图2.2所示。由于P1口内部有上拉电阻(20~40kΩ),当按键SW1(或SW2)按下时,端口P1.6(或P1.7)为低电平,而按键松开时,端口P1.6为高电平。将P1口的状态读至ACC,可以判断是否有键按下,ACC.6=0(或ACC.7=0)表示有SW1(或SW2)键下,此种状态表示为负逻辑表示,A求反后可得正逻辑表示。若用RAM的1个单元(如记为KEY,地址30H)来
P1.6SW1P1.7SW2 图2.2:独立键盘接口电路 记录独立按键的状态,则可采用以下子程序读取、并保存按键的状态。 ;==程序首“ORG 0000H”前定义各变量== KEY SW1 SW2
EQU 20H BIT KEY.6 BIT KEY.7
;保存按键的状态
;SW1键要内部RAM的映射 ;SW2键要内部RAM的映射 ;读I/O,先置1再读入 ;第6和7位求反,转为正逻辑 ;保存键状态
;======读独立键盘子程序====== RDKEY: ORL P1,#0C0H MOV A,P1 XRL A,#0C0H 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