51单片机的指令系统及试验
- 格式:docx
- 大小:21.53 KB
- 文档页数:11
第三章MCS51单片机的指令系统和汇编语言程序示例(第5、6、7节)1.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1)MOV A,#19HADD A,#66H(2)MOV A,#5AHADD A,#6BH2.已知:A=85H,R0=30H,(30H)=11H, (31H)=0FFH,C=1,试计算单片机执行下列指令后累加器A和C中的值各是多少?(1)ADDC A,R0, (2)ADDC A,31H(3) ADDC A,@R0, (4) ADDC A,#85H3.已知M1和M2中分别存放两个16位无符号数的低8位,M1+1和M2+1中分别存放两个16位无符号数的高8位,计算两数之和(低8位存放在M1,高8位存放在M1+1,设两数之和不超过16位)。
4.试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?CLR CMOV A,#52HSUBB A,#0B4H5.已知:A=0DFH,R1=40H,R7=19H,(30H)=00H,(40H)=0FFH,试分析单片机执行下列指令后累加器A和PSW中各标志位的变化状况?(1) DEC A (2) DEC R7 (3) DEC 30H (4) DEC @R16.试写出能完成85+59的BCD加法程序,并对工作过程进行分析。
7.已知:两个8位无符号乘数分别放在30H和31H单元中,编程实现他们乘积的低8位存放在32H,高8位存放在33H。
8.已知:R0=30H,(30H)=0AAH,试分析执行下列指令后累加器A和30H单元的内容是什么?(1)MOV A, #0FFH ANL A, R0(2)MOV A, #0FH ANL A, 30H(3)MOV A, #0F0H ANL A, @R0(4)MOV A, #80H ANL 30H, A9.设:A=0AAH和P1=0FFH,试编程把累加器A的低四位送入P1口的低四位,P1口的高四位保持不变。
实验一:MCS-51单片机指令分析第一部分:位操作指令练习1、实验目的:学习并掌握MCS-51单片机程序开发系统操作方法,学习掌握Medwin仿真环境及其使用方法。
2、实验内容:万利仿真器开发环境Medwin使用练习。
3、实验仪器: PC机一台,万利仿真器Medwin开发环境。
4、实验步骤:第1步:实验准备:(1) 安装Medwin开发环境,并设置其相应的驱动。
(2) 打开Medwin开发环境,连接状态标志为绿色,说明开发环境与仿真器连接成功。
如未成功,检查连接、驱动程序设置等是否正确。
第2步:程序输入:首先在Medwin下新建一个项目,并新建一后缀名为.ASM的文件(.ASM表示汇编源文件),并添加入之前建立的项目中,在此文件中按照汇编语言语句规定的格式输入程序(只输源程序部分,具体程序参考下面的程序)。
第3步:程序运行和调试:(1) 程序编译输入源程序完毕后,可在“项目管理”窗口中点击“编译/汇编”选项,如果程序没有输入错误、语法错误等,则编译能够正确完成,在下面的消息窗口中,产生编译成功信息。
如果程序有输入错误,语法错误等,则消息窗口中会指出错误所在行及错误类型,此时必须返回源程序的错误行重新修改程序,修改完毕后,重新执行“编译/汇编”,直到程序没有输入错误、语法错误为止。
(2)产生代码并装入编译成功后,在“项目管理”窗口中点击“产生代码并装入”选项,对编译无误后产生的.OBJ文件进行连接,并把代码装入仿真器,代码装入仿真器后,才可以对程序实行仿真。
此时,可以在反汇编窗口中查看编译产生的机器码。
(3)程序的全速、单步执行在“调试”窗口中点击“全速”或者“单步”选项,完成程序的仿真运行,“全速”运行表示程序从头至尾一次运行结束,只能看到程序运行后所有寄存器的最终状态结果;“单步”运行表示程序按照指令逐行运行,此时可以查看每行指令运行后的寄存器的状态结果。
(4)查看单片机各种资源状态及内容在“察看”窗口中可以查看单片机内部及程序变量等各种资源,在单步或程序断点运行中可以实时观察单片机内部特殊功能寄存器、内部外部RAM、程序变量等内容,可以很方便的观测程序的运行状况。
实验一熟悉ADEK单片机教学实验系统一、实验目的1.熟悉 ADEK 单片机教学实验系统和仿真器的结构和功能。
2.了解如何安装 51MINI 仿真器驱动程序。
二、ADEK 单片机教学实验系统组成图 1-1 AEDK 单片机教学实验系统外观图如图 1-1 所示, ADEK-EAT598 单片机教学实验系统遵循了模块化的设计思路,有丰硕的接口,而且具有良好的扩展性,以下为组成模块和利用的要紧芯片。
1.步进电机2.直流电机3.温度操纵( DS18B20、热敏电阻 B3470)4.模数转换( ADC0809)5.串行实验区( EEPROM X25045、 AT24C08、时钟芯片 HT1380、数模转换 TLC5615、模数转换 TLC1543)6. RAM( HM62256)7. ROM( M27C512)8.地址译码( 74LS138)9.数模转换( DAC0832)10.仿真机通信口:原厂仿真器的串口通信口,这部份功能已不用。
11.串并转换( 74LS164)12.频率源( CD4020)213.扩展输出( 74LS273)14.扩展输入(74LS244)15.电源开关16.液晶显示(MSC-G12232DYEW-7N)17.语音录放(ISD1730)18.扩展通信口(D8251、HIN232)19.八位开关20.交通灯21.单脉冲(HD74LS240)22.继电器(946H-1C-5D)23.电辅音调(9012)24.蜂鸣器25.光耦(TLC521)26.电位器27.点阵显示28.PS2 接口29.并行接口(8255)30.键盘显示(8279)31.扩展实验区32.打印机接口33.单片机核心板(EAT598_31)34.带USB 接口的51MINI 仿真器三、实验内容1.熟悉整个实验箱的硬件资源。
2.利用51MINI仿真器连接电脑,在电脑的设备治理器中可找到以下图所示的COM口。
实验二Keil集成开发环境练习一、实验目的1.把握开发环境Keil的安装方式。
1.闪烁灯1.实验任务如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
2.电路原理图图4.1.13.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。
4.程序设计内容(1).延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒机器周期微秒MOV R6,#202个机器周期2D1:MOV R7,#2482个机器周期22+2×248=49820×DJNZ R7,$2个机器周期2×248498DJNZ R6,D12个机器周期2×20=4010002因此,上面的延时程序时间为10.002ms。
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。
如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY:MOV R5,#20D1:MOV R6,#20D2:MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2).输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。
5.程序框图如图4.1.2所示图4.1.26.汇编源程序ORG0START:CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY:MOV R5,#20;延时子程序,延时0.2秒D1:MOV R6,#20D2:MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND7.C语言源程序#include<AT89X51.H>sbit L1=P1^0;void delay02s(void)//延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}2.模拟开关灯1.实验任务如图4.2.1所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。
51单片机的指令系统及试验在讲指令系统前我们先来复习一下数制的概念。
1.十进制(Decimal)基数是10,它有10个数字符号,即0,l,2,3,4,5,6,7,8,9。
其中最大数码是基数减1,即9,最小数码是0。
2.二进制(Binary)基数是2,它只有两个数字符号,即0和1。
这就是说,如果在给定的数中,除0和1外还有其它数,例如 1012,它就决不会是一个二进制数。
3、十六进制(Hexadecilnal)基数是16,它有16个数字符号,除了十进制中的10个数可用外,还使用了6个英文字母。
它的16个数字依次是0,l,2,3,4,5,6,7,8,9,A,B,C,D,E,F。
其中A至F分别代表十进制数的10至15,最大的数字也是基数减1。
4、二进制数与十六进制数的相互转换。
(1)、二进制转换为十六进制:整数部分,从低位开始,小数部分,从高位开始,每四位一组(不够四位的补0),转换为对应的十六进制数。
例:(1 0001 0011.1100 0111)2=(113.C7)H (2)、十六进制转换为二进制:将十六进制数的每一位分别转换为对应的四位二进制数。
例:(3E9D)H=(11 1110 1001 1101)B例:( 2ABE)H= 0010 1010 1011 1110B 以后我们在单片机编程方面采用十六进制,这个请大家注意了!MCS-51系列单片机的指令系统共有111条指令,其中49条是单字节指令,45条是双字节指令,17条是三字节指令。
MCS-51的指令系统共有33个功能,用汇编编程时只需要42个助记符就能指明这33个功能操作。
1、指令格式:MCS-51汇编语言指令格式与其他微机的指令格式一样,均由以下几部分组成:[标号:]操作码 [操作数][,操作数][;注释]标号:又称为指令地址符号,地址的符号化,一般由1到6个字符组成,以字母开头的字母数字串,与操作码之间用冒号分开。
操作码:是由助记符表示的字符串,它规定了指令的操作功能。
操作数:是指参加操作的数据和数据的地址。
注释:是为该条指令作说明,以便于阅读。
注意:[ ]中表示为可选项。
操作数可以为1、2、3个,也可以没有。
不同功能的指令,操作数作用不同,如:传送指令多数有两个操作数,写在左面的是目的操作数(表示操作结果存放的单元地址),写在右面的称为源操作数(指出操作数的来源)。
操作码和操作数之间必须用空格分隔,操作数与操作数之间必须用逗号“,”分隔。
带方括号项可有可无,称为可选项。
操作码是指令的核心不可缺少。
2、指令分类MCS-51的111条指令分为下面5类:(1)数据传送类指令29条,分为片内RAM,片外RAM、程序存储器的传送指令,交换及堆栈操作指令。
(2)算术运算类24条,分为加,带进位加,减,乘,除,加1,减1指令。
(3)逻辑运算类24条,分为逻辑与、或、异或、移位指令。
(4)控制程序转移类17条,分为无条件转移与调用,条件转移,空操作指令。
(5)布尔变量操作类17条,分为数据传送、位与、位或,位转移指令。
3. 指令代码:(1) 数据传送类MOV 传送数据指令格式:MOV A,#DATA;将立即数DATA送到累加器A中。
例:MOV P1,#11111110B;把立即数11111110B传送到P1口。
MOVX 片外数据存储器传送数据指令格式:MOVX A,@DPTR;将DPTR指向的地址单元中的内容传送至A中。
例:MOV DPTR,#1000H;将地址1000H传送到数据指针DPTR 中。
MOVX A,@DPTR;将DPTR指向的地址单元(1110H)中的内容传送至A中。
MOVC 程序存储器传送数据指令格式: MOVC A,@A+DPTR;例:MOV A,#00HMOV DPTR,#1000H;将地址1000H传送到数据指针DPTR中。
MOVC A,@A+DPTR;把累加器A的值和DPTR的值相加得到值作为地址,把这个程序存储器的地址单元中的内容传送到A中。
(2) 算术运算指令ADD 不带进位的加法类指令指令格式:ADD A,#DATA;把立即数DATA和累加器A的内容相加得到的值存放到累加器A中。
A+DATA→A例:SETB C;让累加器C置1MOV A,#01H;A=01HADD A,#01H;A=02HADDC 带进位的加法类指令指令格式:ADDC A,#DATA;把立即数DATA和累加器A的内容相加,再加上进位标志C得到的值存放到累加器A中。
A+DATA+C→A例:SETB C; 把累加器C置1MOV A,#01H ; A=01HADDC A,#01H;A+DATA+C→A ,A=03HSUBB带借位的减法类指令指令格式:SUBB A,#DATA;把累加器A的内容减去立即数DATA再减去进位标志C得到的值存放到累加器A中。
A-DATA-C→A例:SETB C; 让累加器C置1MOV A,#03H; A=03HSUBB A,#01H; A=01HINC加一指令指令格式:INC A ;把A的内容加1再存储到A中。
例:MOV A,#01H;A=01HINC A ;A=02HDEC 减1指令指令格式:DEC A ;把A的内容减1再存储到A 中。
例:MOV A,#03H ;A=03HDEC A ;A=02H(3) 逻辑运算指令CLR 清零指令指令格式:CLR A ;把A的内容清零再存储到A中,A=00H。
MOV A,#00000001B;A=00000001BCLR A ;A=00000000BCPL 按位取反指令格式:CPL A ;把A的内容按位取反后再存储到A中。
例:MOV A,#00000001B;A=00000001BCPL A ;A=11111110BANL 按位取与指令格式:ANL A ;把A的内容按位取与后再存储到A中。
例:MOV A,#01000001B ; A=00000001BANL A,#01001111B ;A=01000001BORL 按位取或指令格式:ORL A ;把A的内容按位取或后再存储到A中。
例:MOV A,#00000001B ;A=00000001BORL A,#10001111B ;A=10001111BXRL 按位取异或,相同为0,不同为1。
指令格式:XRL A ;把A的内容按位取异或后再存储到A中。
例:MOV A,#00000001B;A=00000001BXRL A,#00001111B ;A=00001110BRL左移位指令指令格式:RL A ;把A的内容按位左移后再存储到A中。
例:MOV A,#00000001B;A=00000001BRL A ;A=00000010BRL A ;A=00000100BRL A;A=00001000BRR右移位指令指令格式:RR A ;把A的内容按位右移后再存储到A中。
例:MOV A,#00000001B ;A=10000000BRR A ;A=01000000BRR A ;A=00100000BRR A ;A=00010000B(4) 位操作指令SETB 置1指令,只能对位操作,不可以对字节操作。
指令格式:SETB BIT ;对位BIT置1。
例:SETB P1.0 ;P1.0=1CLR 清零指令,可对位操作,也可对字节操作。
指令格式:CLR BIT ;对位BIT置0。
SETB CMOV A,#11110000BCLR C CLR ACPL 取反,可对位操作,也可对字节操作。
指令格式:CPL BIT ;对位BIT取反。
SETB CMOV A,#11110000BCPL CCPL A(5) 控制及转移指令LJMP 长跳转指令指令格式:LJMP 标号;程序将跳转到标号处执行。
LCALL长调用子程序指令,常与RET配合使用。
指令格式: LCALL 标号;调用为标号的子程序去执行。
RET子程序返回指令。
DJNZ 条件转移类指令(自减一指令)指令格式: LOOP:DJNZ R7,LOOP执行分两步:(1)将R7的内容减一后再送到R7中。
(2)判断R7是不是等于0如果是等于0,顺序执行下面的程序。
如果不等于0,跳转到标号为LOOP的地方去执行。
例:MOV R7,#3;送循环次数。
CLR A;对A清零。
LOOP:INC A;对A加1。
DJNZ R7,LOOP;先让R7自减1,后判断是否等于0。
;不等于0跳转,等于零往下执行。
END运行上面的程序后累加器A的值是多少?答案:A=03H学完了指令系统现在我们来实战一下,一个单片机最小系统的制作单片机最小系统制作一、确定任务开发单片机最小系统二、任务分析:该系统具有的功能:(1)具有2位LED数码管显示功能。
(2)具有八路发光二极管显示各种流水灯。
(3)可以完成各种奏乐,报警等发声音类实验。
(4)具有复位功能。
三、功能分析(1)两位LED数码管显示功能,我们可以利用单片机的P0口接两个数码管来现这个功能;(2)八路发光二极管显示可以利用P1口接八个发光二极管实现这个功能;(3)各种奏乐、报警等发声功能可以采用P2.0这个引脚接一蜂鸣器来实现。
(4)利用单片机的第9脚可以设计成复位系统,我们采用按键复位;利用单片机的18、19脚可以设计成时钟电路,我们利用单片机的内部振荡方式设计的。
四、设计框图五、硬件电路设计根据本系统的功能,和单片机的工作条件,我们设计出下面的电路图。
六、元件清单的确定:数码管:共阴极2只(分立)电解电容:10UF的一只30PF的电容2只220欧的电阻9只4.7K的电阻一只1.2K的电阻一只4.7K的排阻一只,12MHZ的晶振一只有源5V蜂名器一只AT89S51单片机一片常开按钮开关1只紧锁座一只(方便芯取下来的,绿色的)发光二极管(5MM 红色)8只万能板电路版15*17CMS8550三极管一只4.5V 电池盒一只,导线若干。
七、硬件电路的焊接按照原理图把上面的元件焊接好,详细步骤省略。
八、相关程序编写针对上面的电路原理图,设计出本系统的详细功能:(1)、第一个发光二极管点亮,同时数码管显示“1”。
(2)、第二个发光二极管点亮,同时数码管显示“2”。
(3)、依次类推到第八个发光二极管点亮,同时数码管显示“8”。
以上出现的是流水灯的效果(4)、所有的发光二极管灭了,同时数码管现实“0”。
(5)、数码管显示“1”。
(6)、数码管显示“2、……”直到“9、A、B、C、D、E、F、Y”。
(7)、蜂鸣器发出九声报警声后重复上面所有步骤。
(8)程序如下:ORG 0000H;伪指令,定义下面的程序代码(机器代码)从地址为0000H的单元存放。
LJMP START;跳转到标号为START的地方去执行。
ORG 0030H;伪指令,定义下面的程序代码(机器代码)从地址为0030H的单元存放。