单片机实验指导.docx
《单片机实验指导.docx》由会员分享,可在线阅读,更多相关《单片机实验指导.docx(92页珍藏版)》请在冰豆网上搜索。
单片机实验指导
LCA51软件快速入门
完成一个单片机应用系统软件的设计,一般要经过软件流程设计,程序编写,程序编译,程序调试,程序修改,程序再编译再调试等反复的过程,直到软件按预期要求符合应用系统的需要。
本章主要通过一个简单的示例程序,使用户对LCA51软件能快速上手。
例子程序Demo51.asm实现的功能是在P1口输出周期性的方波。
该程序仅是示例程序,可能没有什么实际价值。
本章还讲述如何创建一个含有C51语言,汇编语言的工程化管理的例子。
该例子仅让用户懂得如何使用工程,并嵌入汇编模块。
所有例子程序都在LCA51所在的目录夹中。
1.启动LCA51
用户双击桌面上的LCA51软件的图标,即可直接进入本软件。
软件的主界面如图2-1所示。
第一次启动LCA51,用户需设置仿真机型号、状态和通讯端口。
退出LCA51时,会自动保存用户最后一次的设置。
用户选择“设置——仿真机”菜单项,在弹出的对话框中,根据使用的仿真机型号,选择相应的类型。
用户选择“设置——通讯口”菜单项,在弹出的对话框中,选择相应的通讯串口和通讯波特率。
最高通讯波特率由仿真机型号决定。
点击测试串口按钮,检查通讯口是否可用。
2.程序编写
选择“文件——新文件”菜单项,将新建一个空的编辑窗口。
用户在编辑窗口中输入如图4-1所示的程序。
输入完毕,选择“文件——另存为”菜单项,把该文件保存为Demo51.asm。
因为编译器不支持长文件名,用户不能把该文件保存在如“我的文档”之类的目录夹中,否则编译器将找不到该文件。
用户可以直接选择“文件——打开”菜单项打开该文件。
源程序如下:
;系统晶振是11.0592MHz
ORG0000H
AJMPSTART
ORG001BH;T1中断入口地址
AJMPINT_T1
ORG0100H
START:
MOVSP,#60H
MOVTMOD,#10H;置T1为方式1
MOVTL1,#00H;延时50mS的时间常数
MOVTH1,#4BH
MOVR0,#00H;记录端口输出值
MOVR1,#20;记录定时器中断次数
SETBTR1
SETBET1
SETBEA;开中断
SJMP$
INT_T1:
;T1中断服务子程序
PUSHACC;保护现场
PUSHPSW
PUSHDPL
PUSHDPH
CLRTR1;关中断
MOVTL1,#00H;延时50mS常数
MOVTH1,#4BH
SETBTR1;开中断
DJNZR1,EXIT
MOVR1,#20;延时一秒的常数
MOVA,R0;读取R2寄存器值
CPLA;取反
MOVR0,A;保存取反结果
MOVP1,A;送P1口
EXIT:
POPDPH;恢复现场
POPDPL
POPPSW
POPACC
RETI
END
3.程序编译
编译是检查源文件的语法错误,如果源文件没有语法错误,编译器将生成源文件的目标代码,对于单汇编文件,编译产生的目标代码可以直接加载调试,对于高级语言的源文件,编译结束还要连接才能产生可加载的目标代码。
用户选择“编译——编译当前文件”菜单项,将编译当前活动窗口中的源文件,编译结果的信息显示在输出窗口中。
用户可以根据输出窗口中错误信息直接定位到源文件的相应位置。
4.程序调试
调试是检查源程序的逻辑错误。
任何程序的错误都在所难免,语法错误可以通过编译器检查并修改,而逻辑错误必须通过调试,发现程序中和预期设想不相同的原因所在。
对于部分逻辑错误,用户可以根据错误现象,直接找到错误的原因。
但是,大多数逻辑错误却不太明白错误原因,这时,调试就尤其重要。
用户可以使用单步,断点,全速,变量察看等调试命令,跟踪程序的执行,直到找到错误原因。
相关的调试方法和调试技巧,可以参考第三章。
用户选择“调试——加载调试”菜单项,加载当前活动窗口中的源文件所产生的目标文件到仿真机。
加载完毕,用户选择调试——全速运行菜单项,窗口左上角的图标开始不停变动。
用户通过示波器可以观察到P1口的方波。
如果没有观察到方波,可以使用第三章的调试方法,查找逻辑错误。
5.工程示例
LCA51软件支持单文件方式和工程化管理两种模式。
对于编写小型的程序,使用单文件方式就可以了。
对于大型的项目,用工程管理,可以将程序分为几个独立的模块,分别编辑调试,对于某些和硬件关系较大的模块还可以使用汇编语言编写。
各个模块尽量做成功能独立的模块,这样方便模块的重用和程序的管理。
LCA51软件支持工程的混合调试,用户可以跟踪进入不同的模块,还可以跟踪进入用户编写的汇编模块。
5.1安装高级语言编译器
使用高级语言调试前要保证安装好高级语言编译器。
安装见高级语言安装一节。
5.2创建工程/打开工程
首先启动LCA51软件。
第一次启动LCA51,用户需设置仿真机型号、状态和通讯端口。
选择“工程——新建”菜单项,将创建一个新工程。
工程页面窗口打开。
常用命令在工程右键菜单中。
用户选择“工程——打开”菜单项,可以打开已经存在的工程文件。
5.3添加工程项目文件/删除工程项目文件
选择“工程——添加项目文件”菜单项,或者先选中工程页面窗口中工程文件,点击右键,在右键菜单中选择添加项目文件菜单项。
用户在弹出的对话框中添加工程项目文件。
工程项目文件可以是任何类型的文件。
但是只有扩展名为C、PLM、A51、OBJ的文件会被编译和连接。
其它文件只是方便对工程的管理。
如用户可以添加readme.txt之类的文件,用来描述该工程的具体功能等。
用户选中要删除的项目文件,点击右键,在弹出的右键菜单中选择删除项目文件菜单项,就可以删除指定的项目文件。
在工程例子中用户添加项目文件Demop511.C、Demop512.C、Demop513.A51到工程中。
这些项目文件都在LCA51所在的目录夹中。
5.4设置工程参数
选择“工程——设置”菜单项,在弹出的设置对话框中用户设置高级语言编译器和连接器的各种参数。
每个参数的含义见相关的高级语言编译器使用手册。
在工程例子中按缺省设置。
5.5保存工程
选择“工程——保存”菜单项,将当前的工程项目文件信息和工程参数保存到工程文件中。
注意不要保存在长路径目录下。
5.6编译/连接工程
选择“编译——编译并连接”菜单项,编译/连接当前的所有可以编译的项目文件。
在编译连接通过后就可以加载调试了。
第一部软件实验
实验一数据排序
一、实验目的
1、了解数据排序的算法
2、掌握数据有序和无序的概念
3、学会将单片机与数学相结合
二、实验说明
有序的数列更有利于查找,本程序用“冒泡排序“法,给出一组随机数储存在所指定的单元里,将此数据排列顺序,使之成为有序数列。
其算法是将一个数与后面的每一个数相比较,如果后面的数大,则交换,如此操作下去,将所有的数都比较一遍,最大的数就会在数列的最后面。
然后取第二个数,再进行下一轮比较,找出第二大数,循环下去,直至全部数据有序。
三、实验流程图
设置数据区长度
设置数据区地址
清除交换标志
当前地址取数A
地址+1
当前地址取数B
否
A<=B?
数据比较完
是
否是
全部有序?
设置交换标志
否
交换A、B数位置
是
结束
实验二二进制数转换成ASCII码
一、实验目的
1、了解BCD码和ASCII码的区别
2、掌握如何将BCD码转换成ASCII码
3、掌握如何查表进行数值转换及快速计算
二、实验说明
此实验主要了解数值BCD码和ASCII码的区别,利用查表功能快速进行数值转换,进一步掌握数值的各种表达方式。
现给出一个BCD数,将其转换成ASCII码:
将累加器A的值拆为两个ASCII码,并存入Result开始的两个单元。
三、实验流程图
给出要转换数BCD码
取出BCD码高四位
结束
保存低位ASCII码
查表得到ASCII码
查表得到ASCII码
实验三内存块移动
一、实验目的
1、了解内存的移动方法
2、加深对存储器读写的认识
二、实验说明
块移动是单片机常用操作之一,多用于大量的数据复制和图像操作。
本程序是给出起始地址,用地址加一方法移动块,将指定源地址和长度的存储块移动到指定目标地址为起始地址的单元中去。
移动3000H→4000H,256字节。
三、实验流程图
设置块的源地址
源地址+1
保存到目标地址
否
实验四数据传送子程序
一、实验目的
掌握RAM中的数据操作。
二、实验内容
把(R2、R3)源RAM区首址内的(R6、R7)个字节数据,传送到(R4、R5)目的RAM区。
三、实验流程图
开始
源地址内容送A
(A)送目标地址
否
实验五查找相同数个数
一、实验目的
熟悉汇编语言编程。
二、实验内容
在7000H——700FH单元中放入随机数,其中几个单元中输入零。
在7000H——700FH中查出有几个字节是零,统计“00”的个数再显示在数码管上。
三、实验流程图
否
实验六脉冲计数(定时/计数器实验)
一、实验目的
熟悉8031定时/计数功能,掌握定时/计数初始化编程方法。
二、实验内容
对定时器0外部输入的脉冲进行计数,并送显示器显示
三、实验流程图
二进制转十进制子程序
是
第二部分硬件实验
实验一扩展存储器读写实验
一.实验要求
编制简单程序,对实验板上提供的外部存贮器(62256)进行读写操作。
二.实验目的
1.学习片外存储器扩展方法。
2.学习数据存储器不同的读写方法。
三.实验电路及连线
将P1.0接至L1。
CS256连GND孔。
四.实验说明
1.单片机系统中,对片外存贮器的读写操作是最基本的操作。
用户藉此来熟悉MCS51单片机编程的基本规则、基本指令的使用和使用本仿真实验系统调试程序的方法。
用户编程可以参考示例程序和流程框图。
本示例程序中对片外存贮器中一固定地址单元进行读写操作,并比较读写结果是否一致。
不一致则说明读写操作不可靠或该存储器单元不可靠,程序转入出错处理代码段(本示例程序通过熄灭一个发光二极管来表示出错)。
读写数据的选用,本例采用的是55(0101,0101)与AA(1010,1010)。
一般采用这两个数据的读写操作就可查出数据总线的短路、断路等,在实际调试用户电路时非常有效。
用户调试该程序时,可以灵活使用单步、断点和变量观察等方法,来观察程序执行的流程和各中间变量的值。
2.在I状态下执行MEM1程序,对实验机数据进行读写,若L1灯亮说明RAM读写正常。
3.也可进入LCA51的调试工具菜单中的对话窗口,用监控命令方式读写RAM,在I状态执行SX0000↓55,SPACE,屏幕上应显示55,再键入AA,SPACE,屏幕上也应显示AA,以上过程执行效果与编程执行效果完全相同。
注:
SX是实验机对外部数据空间读写命令。
4.本例中,62256片选接地时,存储器空间为0000~7FFFH。
五.实验程序框图
六.实验程序:
ORG0000H
LJMPSTART
ORG0040H
START:
MOVSP,#60H
MOVDPTR,#0000H;置外部RAM读写地址
MOVA,#55H;测试的数据一
MOVB,A
MOVX@DPTR,A;写外部RAM
MOVXA,@DPTR;读外部RAM
XRLA,B;比较读回的数据
JNZERROR
MOVA,#0AAH;测试的数据二
MOVB,A
MOVX@DPTR,A
MOVXA,@DPTR
XRLA,B
JZPASS;测试通过
ERROR:
SETBP1.0;测试失败,点亮LED
SJMP$
PASS:
CPLP1.0;LED状态(亮/灭)转换
MOVR1,#00H;延时
DELAY:
MOVR2,#00H
DJNZR2,$
DJNZR1,DELAY
LJMPSTART;循环测试
END
_
实验二P1口输入、输出实验
一.实验要求
1.P1口做输出口,接八只发光二极管,编写程序,使发光二极管循环点亮。
2.P1口做输入口,接八个扭子开关,以实验机上74LS273做输出口,编写程序读取开关状态,将此状态,在发光二极管上显示出来。
二.实验目的
1.学习P1口的使用方法。
2.学习延时子程序的编写和使用。
三.实验电路及连线
实验一时,P1.0-P1.7接L0-L7。
实验二时,P1.0-P1.7接K0-K7,PO0-PO7接L0-L7。
CS273接8300H。
四.实验说明
1.P1口是准双向口。
它作为输出口时与一般的双向口使用方法相同。
由准双向口结构可知当P1口作为输入口时,必须先对它置高电平使内部MOS管截止。
因为内部上拉电阻阻值是20KΩ~40KΩ,故不会对外部输入产生影响。
若不先对它置高,且原来是低电平,则MOS管导通,读入的数据是不正确的。
2.延时子程序的延时计算问题
对于程序
DELAY:
MOVR0,#00H;1个周期
DELAY1:
MOVR1,#0B3H;256×1个周期
DJNZR1,$;0B3×256×2个周期
DJNZR0,DELAY1;256×2个周期
查指令表可知MOVRn,#data指令需用一个机器周期,DJNZ指令需用两个机器周期,而一个机器周期时间长度为12/11.0592MHz,所以该段程序执行时间为:
(0B3×256×2+256×2+256×1+1)×12÷11059200=100.278mS
五.程序框图:
主程序框图
(一)主程序框图
(二)
六.实验程序
(一)
ORG0000H
LJMPSTART
ORG0040H
START:
MOVSP,#60H
MOVA,#0FEH
ROTATE:
MOVP1,A;写P1口
RLA;循环左移
LCALLDELAY;延时
NOP
SJMPROTATE
DELAY:
;延时子程序(1秒)
MOVR0,#0AH
DELAY1:
MOVR1,#00H
DELAY2:
MOVR2,#0B2H
DJNZR2,$
DJNZR1,DELAY2
DJNZR0,DELAY1
RET
END
实验程序
(二):
ORG0000H
LJMPSTART
ORG0040H
START:
MOVDPTR,#8300H;并行输出口地址
MOVP1,#0FFH;因P1口是准双向口,所以把P1口作为
;输入口时,应先置高电平.
READ:
MOVA,P1;读开关状态
MOVX@DPTR,A;把读入的数据输出
AJMPREAD
END
实验三P3口输出控制继电器实验
一.实验要求
利用P3.5输出高低,控制继电器的开合,实现对外部装置的控制。
二.实验目的
掌握继电器控制的基本方法和经验。
三.实验电路及连线
P3.5接JD。
R-MID接L1灯,R-CLOSE接GND。
四.实验说明
现代自动控制设备中,都存在一个电子电路与电气电路的互相连接问题,一方面要使电子电路的控制信号能够控制电气电路的执行元件(电动机,电磁铁,电灯等),另一方面又要为电子线路的电气电路提供良好的电隔离,以保护电子电路和人身的安全。
电子继电器便能完成这一桥梁作用。
继电器电路中一般都要在继电器的线圈两头加一个二极管以吸收继电器线圈断电时产生的反电势,防止干扰。
本电路的控制端为JD,当JD为高电平时,继电器不工作,当JD为低电平时,继电器工作,常开触点吸合。
执行时,对应的LED将随继电器的开关而亮灭。
五.实验程序框图
主程序框图
六.实验程序:
ORG0000H
LJMPSTART
ORG0040H
START:
MOVSP,#60H
JD:
CPLP3.5;P3.5取反
LCALLDELAY;延时
NOP
SJMPJD
DELAY:
;延时子程序(1秒)
MOVR0,#0AH
DELAY1:
MOVR1,#00H
DELAY2:
MOVR2,#0B2H
DJNZR2,$
DJNZR1,DELAY2
DJNZR0,DELAY1
RET
END
实验四简单I/O实验(交通灯控制)
一.实验要求
以74LS273作为输出口,控制4个双色LED灯(可发红,绿,黄光),模拟交通灯管理。
二.实验目的
1.学习在单片机系统中扩展简单I/O接口的方法。
2.学习数据输出程序的设计方法。
3.学习模拟交通灯控制的方法。
4.学习双色灯的使用。
三.实验电路及连线
PO0-PO3接DG1-DG4,PO4-P07接DR1-DR4。
CS273接8300H。
四.实验说明
1.因为本实验是交通灯控制实验,所以要先了解实际交通灯的变化规律。
假设一个十字路口为东西南北走向。
初始状态0为东西红灯,南北红灯。
然后转状态1南北绿灯通车,东西红灯。
过一段时间转状态2,南北绿灯闪几次转亮黄灯,延时几秒,东西仍然红灯。
再转状态3,东西绿灯通车,南北红灯。
过一段时间转状态4,东西绿灯闪几次转亮黄灯,延时几秒,南北仍然红灯。
最后循环至状态1。
2.双色LED是由一个红色LED管芯和一个绿色LED管芯封装在一起,公用负端。
当红色正端加高电平,绿色正端加低电平时,红灯亮;红色正端加低电平,绿色正端加高电平时,绿灯亮;两端都加高电平时,黄灯亮。
五.实验程序框图:
主程序框图
六.实验程序
ORG0000H
LJMPSTART
ORG0040H
START:
MOVSP,#60H
LCALLSTATUS0;初始状态(都是红灯)
CIRCLE:
LCALLSTATUS1;南北绿灯,东西红灯
LCALLSTATUS2;南北绿灯闪转黄灯,东西红灯
LCALLSTATUS3;南北红灯,东西绿灯
LCALLSTATUS4;南北红灯,东西绿灯闪转黄灯
LJMPCIRCLE
STATUS0:
;南北红灯,东西红灯
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
MOVR2,#10;延时1秒
LCALLDELAY
RET
STATUS1:
;南北绿灯,东西红灯
MOVDPTR,#08300H
MOVA,#5AH;南北绿灯,东西红灯
MOVX@DPTR,A
MOVR2,#50;延时5秒
LCALLDELAY
RET
STATUS2:
;南北绿灯闪转黄灯,东西红灯
MOVDPTR,#8300H
MOVR3,#03H;绿灯闪3次
FLASH:
MOVA,#5FH
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
MOVA,#5AH
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
DJNZR3,FLASH
MOVA,#0AH;南北黄灯,东西红灯
MOVX@DPTR,A
MOVR2,#10;延时1秒
LCALLDELAY
RET
STATUS3:
;南北红灯,东西绿灯
MOVDPTR,#8300H
MOVA,#0A5H
MOVX@DPTR,A
MOVR2,#50;延时5秒
LCALLDELAY
RET
STATUS4:
;南北红灯,东西绿灯闪转黄灯
MOVDPTR,#8300H
MOVR3,#03H;绿灯闪3次
FLASH1:
MOVA,#0AFH
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
MOVA,#0A5H
MOVX@DPTR,A
MOVR2,#03H
LCALLDELAY
DJNZR3,FLASH1
MOVA,#05H;南北红灯,东西黄灯
MOVX@DPTR,A
MOVR2,#10;延时1秒
LCALLDELAY
NOP
RET
DELAY:
;延时子程序
PUSH2
PUSH1
PUSH0
DELAY1:
MOV1,#00H
DELAY2:
MOV0,#0B2H
DJNZ0,$
DJNZ1,DELAY2;延时100mS
DJNZ2,DELAY1
POP0
POP1
POP2
RET
END
实验五外部中断实验(急救车与交通灯)
一.实验要求
在实验四内容的基础上增加允许急救车优先通过的要求。
有急救车到达时,两向交通信号为全红,以便让急救车通过。
假定急救车通过路口时间为10秒,急救车通过后,交通灯恢复中断前状态。
本实验以按键为中断申请,表示有急救车通过。
二.实验目的
1.学习外部中断技术的基本使用方法。
2.学习中断处理程序的编程方法。
三.实验电路及连线
PO0-PO3接DG1-DG4,PO4-P07接DR1-DR4。
CS273接8300H。
K7接P3.2。
四.实验说明
中断服务程序的关键是:
1.保护进入中断时的状态,并在退出中断之前恢复进入时的状
态。
2.必须在中断程序中设定是否允许中断重入,即设置EX0位。
本例中使用了INT0中断,一般中断程序进入时应保护PSW,ACC以及中断程序使用但非其专用的寄存器。
本例的INT0程序保护了PSW,ACC,2等三个寄存器并且在退出前恢复了这三个寄存器。
另外中断程序中涉及到关键数据的设置时应关中断,即设置时不允许重入。
本例中没有涉及这种情况。
实验开始时K7应在H(高电平)端,要产生中断时先拨向L(低电平)端再拨回H端。
五.实验程序框图
主程序框图
六.实验程序
ORG0000H
LJMPSTART
ORG0003H;INT0中断入口地址
LJMPINT0
ORG0040H
START:
MOVSP,#60H
SETBEX0;INT0中断有效
SETBIT0
SETBEA
LCALLSTATUS0;初始状态(都是红灯)
CIRCLE:
LCALLSTATUS1;南北绿灯,东西红灯
LCALLSTATUS2;南北绿灯闪转黄灯,东西红灯
LCALLSTATUS3;南北红灯,东西绿灯
LCALLSTATUS4;南北红灯,东西绿灯闪转黄灯
LJMPCIRCLE
INT0:
PUSHPSW;保护现场
PUSH2
PUSHACC
MOVDPTR,#8300H
MOVA,#0FH;南北,东西都亮红灯
MOVX@DPTR,A