51单片机汇编程序集2
单片机课件MCS-51单片机汇编程序设计

规则:
(1)标号字段和操作字码段之间要有冒号“:”相隔; (2)操作码字段和操作数字段间的分界符是空格;
(3)双操作数之间用逗号相隔;
(4)操作数字段和注释字段之间的分界符用分号“;”相隔。 操作码字段为必选项,其余各段为任选项。
第3章 MCS-51单片机汇编语言程序设计
补充例1
下面是一段汇编语言程序的四分段书写格式
第3章 MCS-51单片机汇编语言程序设计 采用十六进制形式来表示 ,某些特殊场合才采用二进制或十进制的表 示形式 。 十六进制,后缀“H” 。 二进制,后缀“B” 。 十进制,后缀“D”,也可省略。 若十六进制的操作数以字符A~F中的某个开头时,则需在它前面加一个 “0”,以便在汇编时把它和字符A~F区别开来。 (2)工作寄存器和特殊功能寄存器的表示 采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。 例如,累加器可用A(或Acc)表示。也可用0E0H来表示,0E0H为累加器 A的地址。
第3章 MCS-51单片机汇编语言程序设计
汇编语言程序设计步骤 一.确定方案和计算方法 二.了解应用系统的硬件配置、性能指标 三.建立系统数学模型,确定控制算法和操作步骤 四.合理分配存储器单元和了解I/O接口地址 五. 编制源程序 1.按功能设计程序,明确各程序之间 的相互关系
开始
2. 用流程图表示程序结构和功能 3.程序中用注释说明指令在程序中的 作用,方便阅读、调试和修改
第3章 MCS-51单片机汇编语言程序设计
单片机原理及应用
第3章 MCS-51单片机汇编语言程序设计
内 容 提 要
★概述 ★伪指令 ★汇编语言程序设计步骤 ★顺序程序设计
★分支程序设计
★循环程序设计 ★位操作程序设计
51单片机汇编语言指令集

51汇编语言指令集符号定义表符号含义Rn R0~R7寄存器n=0~7Direct 直接地址,内部数据区的地址RAM(00H~7FH)SFR(80H~FFH) B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0@Ri 间接地址Ri=R0或R1 8051/31RAM地址(00H~7FH) 8052/32RAM地址(00H~FFH) #data 8位常数#data16 16位常数Addr16 16位的目标地址Addr11 11位的目标地址Rel 相关地址bit 内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位指令介绍指令字节周期动作说明算数运算指令1.ADD A,Rn 1 1 将累加器与寄存器的内容相加,结果存回累加器2.ADD A,direct 2 1 将累加器与直接地址的内容相加,结果存回累加器3.ADD A,@Ri 1 1 将累加器与间接地址的内容相加,结果存回累加器4.ADD A,#data 2 1 将累加器与常数相加,结果存回累加器5.ADDC A,Rn 1 1 将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDC A,direct 2 1 将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDC A,@Ri 1 1 将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDC A,#data 2 1 将累加器与常数及进位C相加,结果存回累加器9.SUBB A,Rn 1 1 将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBB A,direct 2 1 将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBB A,@Ri 1 1 将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBB A,#data 2 1 将累加器的值减常数值减借位C,结果存回累加器13.INC A 1 1 将累加器的值加114.INC Rn 1 1 将寄存器的值加l15.INC direct 2 1 将直接地址的内容加116.INC @Ri 1 1 将间接地址的内容加117.INC DPTR 1 1 数据指针寄存器值加1说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位18.DEC A 1 1 将累加器的值减119.DEC Rn 1 1 将寄存器的值减120.DEC direct 2 1 将直接地址的内容减121.DEC @Ri 1 1 将间接地址的内容减122.MUL AB 1 4 将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回B寄存器说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。
51单片机汇编语言实验程序集合

MOV P0,A
RET
DELAY: MOV R6,#60
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
RET TABLE: DB 0C0H, 0F9H, 0A4H, 0B0H
DB 99H, 92H, 82H, 0F8H
MOV A,#0FEH
LOOP2: MOV P0,A
ACALL DELAY
RL A
DJNZ R0,LOOP2
JMP START
A2: MOV R0,#8
MOV A,#0FCH
LOOP3: RR A
MOV P0,A
ACALL DELAY DJNZ R0,LOOP3
MOV A,P2
CJNE A,#0FFH,LP1
JMP LOOP
LP1: JNB P2.4,A1
JNB P2.5,A2
JNB P2.6,A3
JNB P2.7,A4
JMP START
A1: MOV R0,#8
END
******************************************************************** ORG 0
JMP START
START: MOV R4,#00H
L1: MOV R3,#0F7H
MOV R1,#00H
MOV P0,A
LCALL DELAY
DJNZ R0,LOOP3
DJNZ R3,LOOP1
POP PSW
POP ACC
RETI EXT1: PUSH ACC ; INT1
第3章_MCS-51单片机指令系统及汇编语言程序设计2

3. 汇编语言的语句格式是什么?使用标号有什么限制?注释段起什么作用? 答案: MCS-51汇编语言的语句格式应符合下列结构: 【标号:】 操作码 【操作数】【;注释】 标号位于语句的开始,由以字母开头的字母和数字组成,它代表该语句的地址。 标号与操作码之间要用“:”隔开,标号与“:”之间不能有空格,“:”与操 作码之间可以有空格。 注释在语句的最后,以“;”开始,是说明性的文字,与语句的具体功能无关。 4. MCS-51汇编语言有哪几条常用伪指令?各起什么作用? 答案: ORG:汇编程序起始地址,用来说明其后程序段在存储器中存放的起始地址; EQU:赋值指令,用来给变量标号赋予一个确定的数值; DB:定义数据字节,指令按字节数的形式把数据存放在存储单元中; DW:定义数据字,按字(双字节)的形式把数据存放在存储单元中; DS:定义存储区,从指定的地址单元开始,保留一定数量的存储单元; BIT:位定义,其功能是把位地址赋给字符名称; END:汇编结束,表明汇编语言程序结束。
2.顺序程序
顺序程序是指程序中没有使用转移类指令的程序段,机器执行这 类程序时也只需按照先后顺序依次执行,中间不会有任何分支、循环, 也不需要调用子程序。 例:将一个单字节十六进制数转换成BCD码。 解:算法分析。单字节十六进制数在0~255之间,将其除以100后, 商为百位数;余数除以10,商为十位数,余数为个位数。 设单字节数存放在40H,转换后,百位数存放在R0中,十位数存 放在R1中,个位数存放在R2中,具体程序如下: ORG 0030H MOV A, 40H ;将单字节十六进制数送入A中 MOV B,#64H ;将100送入B中, #64H可直接写成#100 DIV AB MOV R0,A ;百位数送R0,余数在B中 XCH A,B ;余数送入A中 MOV B,#0AH ;将10送入B中, #0AH可直接写成#10 DIV AB ;商为十位数,余数为个位数 MOV R1,A MOV R2,B SJMP $
51单片机汇编程序2

§2.3.2软件结构及程序设计一、主程序及其说明ORG 0000HAJMP MAIN ;主程序ORG 0003HAJMP X0S ;外部中断入口ORG 000BHLJMP T0S ;定时器T0中断入口ORG 001BHAJMP T1S ;定时器T1中断入口ORG 0023HLJMP SSV ;串行中断入口ORG 0030HMAIN: CLR EAMOV SP, #50HMOV A, 48H ;48H、49H单元为冷热启动标志单元CJNE A, #0AAH, LRE ;如等于0AAH、55H,则说明为热启动MOV A, 49H ;否则,为冷启动,则进行自检CJNE A, #55H, LRESJMP HRELRE: LCALL ZJ ;冷启动,则自检SETD: MOV 48H,#0AAH ;自检完后,设置为热启动标志字节MOV 49H,#55HHRE: MOV A, P1 ;读判采样周期档位ANL A, #0FHXRL A, #09HJZ M17 ;数据掉电保护故不进行采样,分析原数据 SJMP M18M17: CLR P3.5AJMP M19M18: MOV R7, #00H ;非掉电保护方式,则将所有采样数据单元 MOV DPTR,#8020H ;清0MOV R6, #00HMOV A, R6M20: MOVX @DPTR,AINC R7INC DPTRCJNE R7,#00H, M20M21: MOV R7,#19HMOV DPTR, #8000HMOV A, #14HM1: MOVX @DPTR, AINC DPTRDJNZ R7,M1SETB IT0CLR P3.5MOV TMOD,#11HM0: MOV A, P1ANL A, #0FHJNZ M2MOV TH0,#0FFH ;由T0设置采样周期MOV TL0,#0F6HMOV 3EH,#02HAJMP M10M2: JB ACC.3,M10JB ACC.2,M8JB ACC.1,M7MOV TH0,#0FFHMOV TL0,#0CEHMOV 3EH,#00HM8: JB ACC.1,M6 JB ACC.0,M5 MOV TH0,#0FCH MOV TL0,#18H MOV 3EH,#10H AJMP M9M7: JB ACC.0,M4 MOV TH0,#0FFH MOV TL0,#9CH MOV 3EH,#01H AJMP M9M6: JB ACC.0,M3 MOV TH0,#0ECH MOV TL0,#78H MOV 3EH,#13H AJMP M9M5: MOV TH0,#0F8H MOV TL0,#30H MOV 3EH,#12H SJMP M9M4: MOV TH0,#0FEH MOV TL0,#0CH MOV 3EH,#03H SJMP M9M3: MOV TH0,#0D8H MOV TL0,#0F0H MOV 3EH,#11H SJMP M9M10: LCALL ERRM9: MOV 3CH,TL0MOV 3DH,TH0MOV A, 3EHMOV DPTR,#8019HMOVX @DPTR,AMOV IE, #8BHMOV IP, #02HCLR 00H ;等待INT0采样中断M11: JNB 00H,M11MOV IE, #88HM23: MOV DPTR,#0E000HMOVX A, @DPTRMOV A, P1ANL A, #0F0HMOV DPTR,#801AHMOVX @DPTR,AM19: MOV IE, #88HACALL ST2 ;建立TB2显示内容表ACALL CALS ;计算信号峰值、均值、脉宽 LCALL TRS ;工程量转换M12: MOV DPTR,#0F000HMOVX A, @DPTRMOV A, P1 ;读显示方式开关JB ACC.4, M13ACALL SD ;固定显示SJMP M12M13: JB ACC.5, M14LCALL XPD ;分页显示SJMP M12M14: JB ACC.6, M15LCALL SLD ;滑移显示SJMP M12M15: JB ACC.7, M16ACALL DCH ;字符显示,将分析结果显示在示波器上SJMP M12M16: JB P3.4, M12 ;是否通信?=0,说明要通信JB P3.3, M16 ;开始通信?=0,说明开始通信;数据通信,以便在上位机上进行数据硬拷贝、FFT分析等LCALL SENT ;数据向上位机发送通信SJMP M12外部中断INT0中断服务程序清单如下:X0S: MOV DPTR, #2000H ;启动A/D转换MOVX @DPTR, ASETB TR0 ;启动T0定时MOV 3AH, #20H ;存储区首地址0020HMOV 3BH, #00HMOV R7, #00H ;存储计数器送初值1024MOV R6, #04HCLR 70H ;系统自检标志清除,即为正常的工作程序而非自检X0S0: CLR 01HX0S1: JNB 01H, X0S1 ;等待T0定时中断CJNE R6, #00H, X0S0 ;1024个数据全部采样完成?CJNE R7, #00H, X0S0 ;否,则继续采集CLR TR0 ;是,则停T0CLR EX0 ;关外中断INT0SETB 00HRETI定时器TIMER0中断服务程序清单如下:T0S: JNB 70H, T0S1 ;判是否为系统自检(其中的中断系统)CLR 70H ;是,则清标志后直接返回RETIT0S1: SETB 01HCLR TR0 ;停止T0MOV TH0, 3DH ;送T0原时间常数MOV TL0, 3CHSETB TR0 ;启动T0定时MOVX A, @DPTR ;读入A/D结果MOV DPH, 3BH ;按指针存储MOV DPL, 3AHMOVX @DPTR, AINC DPTR ;指向下一个单元MOV 3BH, DPH ;指针保护MOV 3AH, DPLMOV DPTR, #2000H ;指向A/D接口DEC R7 ;存储计数器减1CJNE R7, #0FFH, T0S2DEC R6T0S2: RETI2.显示字符与汉字的程序实现;*********************************************************************** ;显示字符示例子程序,程序中的TB1、TB2、TB3三表分别为;TB1:各字符的显示点阵在字库中的首地址表,在内部EEPROM中;TB2:各字符的代码表,在外部RAM中,由子程序建立,例如:0AH代表“峰”;TB3:各字符的位置坐标,在内部EEPROM中;*********************************************************************** DCH: MOV R0, #00H ;当前显示字符序号指针DCH1: MOV DPTR, #0000H ;查TB2表得当前显示字符的代码MOV A, DPLADD A, R0MOV DPL,AJNC DCH2INC DPHDCH2: MOVX A, @DPTR ;送存30H单元MOV 30H,ACJNE A, #14H, DCH3 ;非空格码转DCH3AJMP DCH7 ;是空格码转DCH7DCH3: MOV A, R0 ;查TB3表得显示字符的位置坐标ADD A, 0E0HPUSH ACCMOV DPTR, #0630HMOVC A, @A+DPTRMOV 31H,A ;位置X坐标送存31HPOP ACCINC ACCMOVC A, @A+DPTRMOV 32H,A ;位置Y坐标送存32HMOV A, 30H ;查TB1表得字符点阵在字库中的地址ADD A, 30HPUSH ACCMOV DPTR, #0600HMOVC A, @A+DPTRMOV 33H,A ;地址高字节送33HPOP ACCINC ACCMOVC A, @A+DPTRMOV 34H,A ;地址低字节送34HMOV DPH,33H ;取本字符光点数送R1MOV DPL,34HMOV A, #00HMOVC A, @A+DPTRMOV R1, ADCH4: INC DPTR ;取光点坐标数据MOV A, #00HMOVC A, @A+DPTR ;光点X坐标送R7ANL A, #0F0HSW AP AADD A, 31HMOV R7, AMOV A, #00H ;光点Y坐标送R6MOVC A, @A+DPTRANL A, #0FHADD A, 32HMOV R6, APUSH DPHPUSH DPLMOV DPTR, #4000H ;输出光点X坐标MOV A, R7MOVX @DPTR,AMOV DPTR, #6000H ;输出光点Y坐标MOV A, R6MOVX @DPTR,AMOV DPTR, #8000H ;X、Y同时输出至CRTMOVX @DPTR, ADEC R1 ;光点计数器减1CJNE R1, #00H, DCH5 ;本字符显示完未成,转显示下个点SJMP DCH6DCH5: POP DPLPOP DPHAJMP DCH4DCH6: POP DPL ;恢复指针POP DPHDCH7: INC R0 ;序号指针增1CJNE R0, #19H, DCH8 ;一帧未完成转显示下个字符RET ;一帧完成,则返回DCH8: AJMP DCH15.程序设计示例;************************************************************************* ;滑移显示子程序,具有暂停功能,在CRT右上角显示对应页号.;************************************************************************* SLD:MOV DPTR,#0020H ;数据指针初值0020HMOV TH1, #0FFH ;送T1时间常数,每点50usMOV TL1, #0EEHMOV 46H, #0FFHMOV 45H, #0EEHSETB ET1 ;开放T1中断SLD0:MOV R7,#00H ;每帧点数计数器清零PUSH DPH ;保护数据指针PUSH DPLSETB TR1 ;启动T1SLD1:CLR 02HSLD2:JNB 02H,SLD2 ;等待T1中断MOVX A,@DPTR ;按指针取数PUSH DPHPUSH DPLMOV DPTR,#6000H ;向Y轴输出MOVX @DPTR, AMOV A, R7MOV DPTR, #4000H ;向X轴输出MOVX @DPTR, AMOV DPTR, #8000H ;同时联合输出到CRTMOVX @DPTR, APOP DPLPOP DPHINC DPTR ;指向下个数据INC DPTR ;计数器减1INC R7CJNE R7, #00H, SLD1 ;本帧(256个数据)未完成则循环SLD3: POP DPL ;恢复数据指针POP DPHMOV A, DPL ;判是否已到数据末地址(即最后一个数据)CJNE A, #20H, SLD4 ;未到,修改数据指针初值转显示下帧MOV A, DPHCJNE A, #04H, SLD4CLR ET1 ;滑移显示完成,关T1LR TR1RETSLD4: JNB P3.0, SLD0 ;是暂停?是则转SLD0INC DPTR ;否则继续滑移显示SJMP SLD0串行通信中断服务子程序清单及其说明如下:SSV: CLR TI ;清发送中断标志DEC R7 ;计数器减1CJNE R7, #0FFH, SSV1DEC R6SSV1: CJNE R6, #00H, SSV2 ;计数器非0,则转SSV2 CJNE R7, #00H, SSV2CLR ES ;为0,则发送完成,关串行中断SJMP SSV3SSV2: INC DPTR ;指向下一个数据MOVX A, @DPTR ;取数LCALL XSS ;补校验位后发送SSV3: RETI补校验位并发送子程序清单:XSS: ADD A, #00H ;加入校验位MOV C, PMOV TB8, CMOV SBUF, A ;发送RET。
51单片机汇编语言指令教程汇集

51单片机汇编语言指令教程汇集
1.MOV
MOV指令把源操作数的值复制到目的操作数。
格式如下:
MOV dest,src
dest :用于存储源操作数值的目的操作数。
src :用于取源操作数值的源操作数。
MOV指令可以把源操作数的值复制到目的操作数里,其中它的源操作数和目的操作数可以是内存单元,寄存器或立即数。
2.MVI
MVI指令把单字节立即数的值复制到其中一寄存器或内存单元。
格式如下:
MVI dest,data
dest :用于存放单字节立即数值的目的操作数。
data :用于取立即数值的立即数。
MVI指令可以把数据(data)复制到dest所指向的存储单元。
它的目的操作数可以是内存单元或寄存器,源操作数只能是8位立即数。
3.LXI
LXI指令可以把16位数据装载到左边和右边双字节寄存器中。
格式如下:
LXI rp,data
rp :用接受16位数据的双字节寄存器,它可以是BC,DE,HL或SP。
data :用于取16位立即数的立即数。
LXI指令可以把16位立即数data复制到双字节寄存器rp里。
4.LDA
LDA指令可以把存储单元中的数据装载到A寄存器中,格式如下:
LDA addr
addr :用于取存储单元数据值的存储单元地址。
LDA指令可以把存储单元addr中的数据复制到A寄存器中。
5.STA
STA指令可以把A寄存器的值存入指定的存储单元中,格式如下:
STA addr。
经典51单片机实用子程序库(二)
51单片机实用子程序库(二)MCS-51浮点运算子程序库及其使用说明本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合:1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。
2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、数制转换等子程序。
3.大型库(FQ51.ASM):包含本说明书中的全部子程序。
为便于读者使用本程序库,先将有关约定说明如下:1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节。
如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。
2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。
当尾数的最高位为1时,便称为规格化浮点数,简称操作数。
在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H。
若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。
3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。
当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH。
在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数。
例如有一个十进制浮点操作数存放在30H、31H、32H中,数值是 -0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H。
第4章 MCS-51单片机汇编语言程序设计(2)
XCH A,R3 INC A MOVC A,@A+DPTR MOV DPL,A MOV DPH,R3 CLR A JMP @A+DPTR TAB DW DW A0 A1
…………. DW AN
INC
DPTR
MOVX A,@DPTR SUBB A,R7 JNC XCH BIG1 A,R7
BIG0:INC DPTR
实现程序如下: 实现程序如下
START:CLR C : MOV DPTR,#ST1 , MOVX A,@DPTR , MOV R7,A
MOVX @DPTR,A RET BIG1:MOVX A,@DPTR SJMP BIG0
实现程序如下: 实现程序如下 MOV 30H, 20H ANL 30H,#00011111B MOV A,21H SWAP A RL A ANL A,#11100000B ORL 30H,A
第4章 MCS-51单片机汇编语言程序设计
实现程序如下: 实现程序如下 例 A,@R1 ADDC4.3 做3个字节的 无符号的加法. 无符号的加法.设一个加 MOV R0,#52H , MOV @R0,A 数存放在内部RAM 50H、 RAM的 数存放在内部RAM的50H、 MOV R1,#55H , DEC R0 51H、52H单元中 单元中, 51H、52H单元中,另一 DEC R1 RAM的53H、 MOV A,@R0 个加数存放在RAM 个加数存放在RAM的53H、 MOV A,@R0 54H、55H单元中 单元中, 54H、55H单元中,相加 ADD A,@R1 结果存内部RAM的50H、 结果存内部RAM的50H、 RAM ADDC A,@R1 51H、52H单元 单元, 51H、52H单元,均从高 MOV @R0,A 字节开始存放, 字节开始存放,进位存放 MOV 00H,C 在位寻址区的00H位中。 00H位中 在位寻址区的00H位中。 MOV @R0,A DEC DEC R0 R1
51单片机汇编程序设计 (2)
参考程序1: ORG 1000H
START: MOV A , 30H MOV DPTR , #TABLE MOVC A , @A+DPTR MOV 31H , A
TABLE: DB 0 , 1 , 4 , 9 , 16 DB 25 , 36 , 49 , 64 , 81 END
参考程序2: ORG 1000H
P3口输入加数、减数、乘数或除数,,以及结果的 高8位或余数。
键号存放在累加器A中。
程序流程图如图3-6所示。
参考程序如下: START: MOV P1 , #0FFH
MOV P3 , #0FFH MOV DPTR, #TABLE CLR C MOV A, R2 SUBB A,#04H JNC ERROR ADD A , #0-4H
【例3-9】 求符号函数的值 1 当X>0
Y= 0 当X=0 的值。 -1 当X<0
编程说明:设变量X存放在40H单元中,函数Y存 放在41H单元中。此程序为三分支程序。
程序流程图如图3-3所示。
编程如下: START: MOV A,40H
JZ COMP JNB ACC.7, POST MOV A,#81H ;表示-1 SJMP COMP POSI: MOV A,#01H ;表示+1 COMP: MOV 41H,A END
PRG1: MOV A,P1 CLR C SUBB A,P3 MOV P1,A
;进位位放入A中
CLR A RLC A ;借位放入A中 MOV P3,A RET
PRG2: MOV A,P1 MOV B,P3 MUL AB MOV P1,A MOV P3,B RET
PRG3: MOV A,P1 MOV B,P3 DIV AB MOV P1,A MOV P3,B RET
MCS51单片机指令系统与汇编语言程序设计
MCS51单片机指令系统与汇编语言程序设计MCS-51是一种非常常见的8位单片机系列,该系列包括了多种型号的单片机,如Intel 8051、8031、8052等。
MCS-51单片机指令系统是一组用于驱动该系列单片机的指令集,汇编语言程序设计是利用这些指令来编写程序。
MCS-51单片机指令系统包含了多种指令,可以执行诸如数据传输、算术逻辑运算、控制和数据访问等功能。
这些指令通过各种不同的寻址模式来操作数据,包括立即寻址、寄存器寻址、直接寻址、间接寻址和寄存器间接寻址等。
不同的寻址模式和指令组合可以实现不同的功能。
汇编语言程序设计通过将人类可读的汇编指令翻译成机器可执行的二进制指令来编写程序。
在MCS-51单片机中,汇编指令由操作码和操作数组成。
操作码指定了所执行的操作,如数据传输、算术运算或控制指令。
操作数则指定了指令要操作的数据。
下面以一个简单的例子来说明MCS-51单片机指令系统和汇编语言程序设计的基本原理。
假设我们要编写一个程序,将两个寄存器中的数据相加,并将结果存储到第三个寄存器中。
首先,我们需要将第一个寄存器的值加载到累加器A中,这可以通过MOV指令实现。
MOV指令的操作码为01,操作数为两个寄存器的地址。
例如,MOVA,R0将R0的值加载到A中。
接下来,我们需要将第二个寄存器的值加载到B寄存器中,同样可以使用MOV指令。
MOVB,R1将R1的值加载到B中。
然后,我们可以使用ADD指令将A和B中的值相加,并将结果存储到A中。
ADD指令的操作码为04,操作数为A的地址。
例如,ADDA将累加器中的值与A寄存器中的值相加,并将结果存储到A中。
最后,我们可以使用MOV指令将A中的结果移动到第三个寄存器中,例如,MOVR2,A将A的值移动到R2中。
通过组合使用这些指令,我们可以实现将两个寄存器中的值相加并存储到第三个寄存器中的功能。
总结来说,MCS-51单片机指令系统和汇编语言程序设计是一种用于编程控制该系列单片机的方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;辛普生积分程序;入口: DPTR,N,COUNT;占用资源: A CC,R3,R4,R6,R7;堆栈需求: 2字节;出口: R3,R4SJF : MOV R7,NMOVX A,@DPT RINC DPTRMOV R4,AMOV R3,#00HDEC R7SJF1 : MOVX A,@DPT R INC DPTRCLR CRLC AMOV R6,ACLR ARLC AXCH A,R7JNB ACC.0,SJF2XCH A,R6RLC AXCH A,R6XCH A,R7RLC AXCH A,R7SJF2 : XCH A,R7XCH A,R6ADD A,R4MOV R4,AMOV A,R6MOV R3,ADJNZ R7,SJF1SJF3 : MOVX A,@DPT R ADD A,R4MOV R4,ACLR AADDC A,R3MOV R3,AMOV R7,#COUNT LCALL NMUL21MOV A,NMOV B,#03HMUL ABMOV R7,ALCALL NDIV31RETNMUL21 : MOV A,R4 MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7MUL ABMOV R3,ACLR AADDC A,BMOV R2,ACLR OVRETNDIV31 : MOV B,#10H NDV311 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,A INC R4NDV313 : DJNZ B,NDV311 RET;内部RAM数据排序程序(升序) ;入口: R0(起始地址),N(数据个数) ;占用资源: A CC,B,R5,R6,R7;堆栈需求: 2字节;出口: R0ISELSORT : MOV R7,N DEC R7ISST1: MOV A,R7MOV R6,AMOV A,R0MOV R1,AMOV R2,AMOV B,@R1ISST2: INC R1MOV A,@R1CLR CSUBB A,BJC ISST3MOV A,R1MOV R2,AMOV B,@R1ISST3: DJNZ R6,ISST2XCH A,@R1MOV B,R2MOV R1,BMOV @R1,ADJNZ R7,ISST1RET;外部RAM数据排序程序(升序);入口: A DDPH,ADDPL(起始地址),N(数据个数) ;占用资源: A CC,B,R0,R1,R5,R7;堆栈需求: 2字节;出口: A DDPH-ADDPLESELSORT : MOV R7,NDEC R7ESST1: MOV A,R7MOV R6,AMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV R0,DPHMOVX A,@DPT RMOV B,AESST2: INC DPT RMOVX A,@DPT RSUBB A,BJC ESST3MOV R0,DPLMOV R1,DPHMOVX A,@DPT RMOV B,AESST3: DJNZ R6,ESST2MOVX A,@DPT RXCH A,BMOVX @DPT R,AMOV DPL,R0MOV DPH,R1MOV A,BMOVX @DPT R,ADJNZ R7,ESST1RET;外部RAM浮点数排序程序(升序);入口: A DDPH,ADDPL(起始地址),N(数据个数);占用资源: A CC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT ;堆栈需求: 5字节;出口: A DDPH,ADDPLFSORT: MOV A,NMOV NCNT,ADEC NCNTFST1 : MOV B,NCNT MOV DPL,ADDPL MOV R1,DPLMOV DPH,ADDPH MOV R0,DPH MOVX A,@DPT R MOV R2,AINC DPTRMOVX A,@DPT R MOV R3,AINC DPTRMOVX A,@DPT R MOV R4,AFST2 : INC DPTR MOVX A,@DPT R MOV R5,AINC DPTRMOVX A,@DPT R MOV R6,AINC DPTRMOVX A,@DPT R MOV R7,APUSH BLCALL FCMPPOP BJNC FST4MOV A,DPLCLR CSUBB A,#02HMOV R1,AMOV R0,DPHJNC FST3DEC R0FST3 : MOV A,R5 MOV R2,AMOV A,R6MOV R3,AMOV A,R7MOV R4,AFST4 : DJNZ B,FST2 MOV A,DPLCLR CSUBB A,#02HMOV DPL,AJNC FST5DEC DPHFST5 : MOV A,R2 MOVX @DPT R,A INC DPTRMOV A,R3MOVX @DPT R,AINC DPTRMOV A,R4MOVX @DPT R,AMOV A,R0MOV P2,AMOV A,R5MOVX @R1,AINC R1MOV A,R6MOVX @R1,AINC R1MOV A,R7MOVX @R1,ADJNZ NCNT,FST1RET;BCD小数转换为二进制小数(2位) ;入口: R0(低位首址),R7;占用资源: A CC,B,R5;堆栈需求: 2字节;出口: R3,R4PDT B : CLR AMOV R3,APDB1 : MOV A,R3 MOV B,#9AH MUL ABMOV R5,BXCH A,R4MOV B,#19H MUL ABADD A,R4MOV A,R5ADDC A,BMOV R5,AMOV A,@R0 MOV B,#9AH MUL ABADD A,R5MOV R4,ACLR AADDC A,BXCH A,R3MOV B,#19H MUL ABADD A,R4MOV R4,AMOV A,BMOV R3,AMOV A,@R0MOV B,#19HMUL ABADD A,R3MOV R3,ADEC R0DJNZ R7,PDB1RET;BCD小数转换为二进制小数(N位) ;入口: R1(低位首址),M,N;占用资源: A CC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0PDT BMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR APDBMN1 : MOV @R0,AINC R0DJNZ B,PDBMN1MOV A,NSWAP ARR AMOV R7,APDBMN2 : MOV A,R2 MOV R0,AMOV A,R3MOV R1,AMOV B,MCLR CPDBMN3 : MOV A,@R1 ADDC A,@R1DA AJNB ACC.4,PDBMN4 SETB CCLR ACC.4PDBMN4 : MOV @R1,A INC R1DJNZ B,PDBMN3MOV B,NPDBMN5 : MOV A,@R0 RLC AMOV @R0,AINC R0DJNZ B,PDBMN5DJNZ R7,PDBMN2MOV A,R2MOV R0,ARET;BCD整数转换为二进制整数(1位) ;入口: R0(高位地址),R7;占用资源: A CC,B;堆栈需求: 2字节;出口: R4IDTB1: CLR AMOV R4,AIDB11: MOV A,R4MOV B,#0AHMUL ABADD A,@R0INC R0MOV R4,ADJNZ R7,IDB11RET;BCD整数转换为二进制整数(2位) ;入口: R0(高位地址),R7;占用资源: A CC,B;堆栈需求: 2字节;出口: R3,R4IDTB2: CLR AMOV R3,AMOV R4,AIDB21: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ADJNZ R7,IDB21RET;BCD整数转换为二进制整数(3位) ;入口: R0(高位地址),R7;占用资源: A CC,B;堆栈需求: 2字节;出口: R2,R3,R4 IDTB3: CLR A MOV R2,AMOV R3,AMOV R4,AIDB31: MOV A,R4 MOV B,#0AH MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AH MUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,#0AH MUL ABADD A,R2MOV R2,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ACLR AADDC A,R2MOV R2,ADJNZ R7,IDB31RET;BCD整数转换为二进制整数(N位) ;入口: R1(高位地址),M,N;占用资源: A CC,B,R2,R7,NCNT,F0 ;堆栈需求: 2字节;出口: R0IDTBMN : MOV A,R0MOV R2,AMOV B,NCLR AIDBMN1 : MOV @R0,AINC R0DJNZ B,IDBMN1MOV A,R2MOV R0,AMOV A,MMOV NCNT,AIDBMN2 : MOV R7,N CLR ACLR F0IDBMN3 : XCH A,@R0 MOV B,#0AHMUL ABMOV C,F0ADDC A,@R0MOV F0,CMOV @R0,AINC R0MOV A,BDJNZ R7,IDBMN3 MOV A,R2MOV R0,AMOV A,@R1INC R1ADD A,@R0MOV @R0,ADJNZ NCNT,IDBMN2 RET;二进制小数(2位)转换为十进制小数(分离BCD码) ;入口: R3,R4,R7;占用资源: A CC,B;堆栈需求: 3字节;出口: R0PBT D : MOV A,R7PUSH APBD1 : MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV @R0,AINC R0DJNZ R7,PBD1POP AMOV R7,AMOV A,R0CLR CSUBB A,R7MOV R0,ARET;二进制小数(M位)转换为十进制小数(分离BCD码) ;入口: R1,M,N;占用资源: A CC,B,R2,R3,R7,NCNT;堆栈需求: 2字节;出口: R0PBT DMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV A,NMOV NCNT,APBDMN1 : MOV R7,MCLR ACLR F0PBDMN2 : XCH A,@R1MOV B,#0AHMUL ABMOV C,F0ADDC A,@R1MOV F0,CMOV @R1,AINC R1MOV A,BDJNZ R7,PBDMN2ADDC A,#00HMOV @R0,AINC R0MOV A,R3MOV R1,ADJNZ NCNT,PBDMN1MOV A,R2MOV R0,ARET;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4;占用资源: A CC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4;占用资源: A CC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOV R0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV B,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZ R7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码) ;入口: R2,R3,R4;占用资源: A CC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码) ;入口: R2,R3,R4;占用资源: A CC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0MOV R7,#04HCLR AIBD321 : MOV @R0,A INC R0DJNZ R7,IBD321 POP AMOV R0,AMOV R7,#18HIBD322 : PUSH A CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0 ADDC A,@R0DA AMOV @R0,ADJNZ B,IBD323POP AMOV R0,ADJNZ R7,IBD322RET;二进制整数(M位)转换为十进制整数(组合BCD码) ;入口: R1,M,N;占用资源: A CC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0IBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR AIBDMN1 : MOV @R0,AINC R0DJNZ B,IBDMN1MOV A,MSWAP ARR ACLR CMOV R7,AIBDMN2 : MOV A,R2 MOV R0,AMOV A,R3MOV R1,AMOV B,MIBDMN3 : MOV A,@R1 RLC AMOV @R1,AINC R1DJNZ B,IBDMN3MOV B,NIBDMN4 : MOV A,@R0 ADDC A,@R0DA AJNB ACC.4,IBDMN5 SETB CCLR ACC.4IBDMN5 : MOV @R0,A INC R0DJNZ B,IBDMN4 DJNZ R7,IBDMN2 MOV A,R2MOV R0,ARET;三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;入口: R2,R3,R4,R7;占用资源: A CC,B,F0;堆栈需求: 3字节;出口: (R2),R3,R4,R7,OVNDIV31 : MOV A,R2MOV B,R7DIV ABPUSH AMOV R2,BMOV B,#10HNDV311 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,AINC R4NDV313 : DJNZ B,NDV311 POP ACLR OVJZ NDV314SETB OVNDV314 : XCH A,R2MOV R7,ARET。