51单片机常见汇编语言指令(51单片机初学者,请用汇编语言,谢谢大家了!)

本文目录
51单片机初学者,请用汇编语言,谢谢大家了!
12mMHz,机器周期为1微秒,400微秒周期,需要200微秒定时==1F38H 设先输出高电平
ORG 0000H
SETB P1.7; P1.7输出高电平
MOV TMOD, #00000000B;设T1为方式0
SETB EA;打开全部中断
SETB ET1; 打开T1中断
LOOP: MOV TH1, #1FH
MOV TL1, #38H; z装入200微秒的定时初始值
SETB TR1; 启动 T1,开始计数定时
wait: JNB TF1, $; 查询TF1状态,计数不到200微秒TF1=0,就地计数定时等待
CPL P1.7; 计数200微秒后TF1=1,P1.7取反输出。
SJMP LOOP ;返回开始下一个200微秒定时
END
51单片机指令
TF1是定时器1溢出标志位,$是取地址。JNB TF1,$ 实现的功能是查询定时器1溢出标志位,如果为0,跳转到本条指令继续执行(即继续查询)直到定时时间到,TF1置位,才执行下一条指令。
给你注释一下:
MOV TMOD,#10H //设置定时器工作方式(定时器1,工作方式2)
SETB TR1 //开启定时器1
LOOP: MOV TH1,#0D8H //装初值D8F0H 即55536,定时10mS(晶振12M)时间随晶振改变
MOV TL1,#0F0H
JNB TF1,$ //查询等待定时器1中断
CLR TF1 //定时器溢出标志位清0(定时时间到后硬件自动给TF1置位,需软件清0)
CPL P1.1 //P1.1取反
SJMP LOOP //跳到LOOP处循环(是个死循环)
该段程序实现的功能是:每隔10mS对P1.1取反一次。(10mS当然是晶振为12M的情况下)
51单片机共有多少指令
MCS-51单片机的指令集
1、数据传送类指令
助记符 功能说明 字节数 振荡周期
MOVA,Rn 寄存器内容送入累加器 1 12
MOVA,direct 直接地址单元中的数据送入累加器 2 12
MOVA,@Ri 间接RAM中的数据送入累加器 1 12
MOVA,#data8 8位立即数送入累加器 2 12
MOVRn,A 累加器内容送入寄存器 1 12
MOVRn,direct 直接地址单元中的数据送入寄存器 2 24
MOVRn,#data8 8位立即数送入寄存器 2 12
MOVdirect,A 累加器内容送入直接地址单元 2 12
MOVdirect,Rn 寄存器内容送入直接地址单元 2 24
MOVdirect,direct 直接地址单元中的数据送入直接地址单元 3 24
MOVdirect,@Ri 间接RAM中的数据送入直接地址单元 2 24
MOVdirect,#data8 8位立即数送入直接地址单元 3 24
MOV@Ri,A 累加器内容送入间接RAM单元 1 12
MOV@Ri,direct 直接地址单元中的数据送入间接RAM单元 2 24
MOV@Ri,#data8 8位立即数送入间接RAM单元 2 12
MOVDPTR,#data16 16位立即数地址送入地址寄存器 3 24
MOVCA,@A+DPTR 以DPTR为基地址变址寻址单元中的数据送入累加器1 24
MOVCA,@A+PC 以PC为基地址变址寻址单元中的数据送入累加器1 24
MOVXA,@Ri 外部RAM(8位地址)送入累加器 1 24
MOVXA,@DPTR 外部RAM(16位地址)送入累加器 1 24
MOVX@Ri,A 累加器送入外部RAM(8位地址) 1 24
MOVX@DPTR,A 累加器送入外部RAM(16位地址) 1 24
PUSHdirect 直接地址单元中的数据压入堆栈 2 24
POPDIRECT 堆栈中的数据弹出到直接地址单元 2 24
XCHA,Rn 寄存器与累加器交换 1 12
XCHA,direct 直接地址单元与累加器交换 2 12
XCHA,@Ri 间接RAM与累加器交换 1 12
XCHDA,@Ri 间接RAM与累加器进行低半字节交换 1 12
2、算术操作类指令
助记符 功能说明 字节数 振荡周期
ADDA,Rn 寄存器内容加到累加器 1 12
ADDA,direct 直接地址单元加到累加器 2 12
ADDA,@Ri 间接RAM内容加到累加器 1 12
ADDA,#data8 8位立即数加到累加器 2 12
ADDCA,Rn 寄存器内容带进位加到累加器 1 12
ADDCA,dirct 直接地址单元带进位加到累加器 2 12
ADDCA,@Ri 间接RAM内容带进位加到累加器 1 12
ADDCA,#data8 8位立即数带进位加到累加器 2 12
SUBBA,Rn 累加器带借位减寄存器内容 1 12
SUBBA,dirct 累加器带借位减直接地址单元 2 12
SUBBA,@Ri 累加器带借位减间接RAM内容 1 12
SUBBA,#data8 累加器带借位减8位立即数 2 12
INCA 累加器加1 1 12
INCRn 寄存器加1 1 12
INCdirect 直接地址单元内容加1 2 12
INC@Ri 间接RAM内容加1 1 12
INCDPTR DPTR加1 1 24
DECA 累加器减1 1 12
DECRn 寄存器减1 1 12
DECdirect 直接地址单元内容减1 2 12
DEC@Ri 间接RAM内容减1 1 12
MULA,B A乘以B 1 48
DIVA,B A除以B 1 48
DAA 累加器进行十进制转换 1 12
3、逻辑操作类指令
助记符 功能说明 字节数 振荡周期
ANLA,Rn 累加器与寄存器相“与” 1 12
ANLA,direct 累加器与直接地址单元相“与” 2 12
ANLA,@Ri 累加器与间接RAM内容相“与” 1 12
ANLA,#data8 累加器与8位立即数相“与” 2 12
ANLdirect,A 直接地址单元与累加器相“与” 2 12
ANLdirect,#data8 直接地址单元与8位立即数相“与” 3 24
ORLA,Rn 累加器与寄存器相“或” 1 12
ORLA,direct 累加器与直接地址单元相“或” 2 12
ORLA,@Ri 累加器与间接RAM内容相“或” 1 12
ORLA,#data8 累加器与8位立即数相“或” 2 12
ORLdirect,A 直接地址单元与累加器相“或” 2 12
ORLdirect,#data8 直接地址单元与8位立即数相“或” 3 24
XRLA,Rn 累加器与寄存器相“异或” 1 12
XRLA,direct 累加器与直接地址单元相“异或” 2 12
XRLA,@Ri 累加器与间接RAM内容相“异或” 1 12
XRLA,#data8 累加器与8位立即数相“异或” 2 12
XRLdirect,A 直接地址单元与累加器相“异或” 2 12
XRLdirect,#data8 直接地址单元与8位立即数相“异或” 3 24
CLRA 累加器清0 1 12
CPLA 累加器求反 1 12
RLA 累加器循环左移 1 12
RLCA 累加器带进位循环左移 1 12
RRA 累加器循环右移 1 12
RRCA 累加器带进位循环右移 1 12
SWAPA 累加器半字节交换 1 12
4、控制转移类指令
助记符 功能说明 字节数 振荡周期
ACALLaddr11 绝对短调用子程序 2 24
LACLLaddr16 长调用子程序 3 24
RET 子程序返回 1 24
RETI 中断返回 1 24
AJMPaddr11 绝对短转移 2 24
LJMPaddr16 长转移 3 24
SJMPrel 相对转移 2 24
JMP@A+DPTR 相对于DPTR的间接转移 1 24
JZrel 累加器为零转移 2 24
JNZrel 累加器非零转移 2 24
CJNEA,direct,rel 累加器与直接地址单元比较,不等则转移 3 24
CJNEA,#data8,rel 累加器与8位立即数比较,不等则转移 3 24
CJNERn,#data8,rel 寄存器与8位立即数比较,不等则转移 3 24
(相等则执行本指令的下一条)
CJNE@Ri,#data8,rel 间接RAM单元,不等则转移 3 24
(但有时还想得知两数比较之后哪个大,哪个小,
本条指令也具有这样的功能,如果两数不相等,
则CPU还会反映出哪个数大,哪个数小,
这是用CY(进位标志位)来实现的。
如果左边的数(A,Rn,@Ri)大或者等于右边的数(direct,#date8),则CY=0;否则CY=1)
DJNZRn,rel 寄存器减1,非零转移 3 24
DJNZdirect,rel 直接地址单元减1,非零转移 3 24
NOP 空操作 1 12
控制转移指令共有17条,可分为“无条件转移指令” “有条件转移指令” “子程序调用指令” 及 “返回指令”。
5、布尔变量操作类指令
助记符 功能说明 字节数 振荡周期
CLRC 清进位位 1 12
CLRbit 清直接地址位 2 12
SETBC 置进位位 1 12
SETBbit 置直接地址位 2 12
CPLC 进位位求反 1 12
CPLbit 直接地址位求反 2 12
ANLC,bit 进位位和直接地址位相“与” 2 24
ANLC,/bit 进位位和直接地址位的反码相“与” 2 24
ORLC,bit 进位位和直接地址位相“或” 2 24
ORLC,/bit 进位位和直接地址位的反码相“或” 2 24
MOVC,bit 直接地址位送入进位位 2 12
MOVbit,C 进位位送入直接地址位 2 24
JCrel 进位位为1则转移(CY=O不转移,=1转移) 2 24
JNCrel 进位位为0则转移(和上面相反) 2 24
JBbit,rel 直接地址位为1则转移 3 24
JNBbit,rel 直接地址位为0则转移 3 24
JBCbit,rel 直接地址位为1则转移,该位清零 3 24
伪指令
助记符 功能说明
ORG 设置程序起始地址
END 标志源代码结束
EQU 定义常数
SET 定义整型数
DATA 给字节类型符号定值
BYTE 给字节类型符号定值
WROD 给字类型符号定值
BIT 给位地址取名
ALTNAME 用自定义名取代保留字
DB 给一块连续的存储区装载字节型数据
DW 给一块连续的存储区装载字型数据
DS 预留一个连续的存储区或装入指定字节。
INCLUDE 将一个源文件插入程序中
TITLE 列表文件中加入标题行
NOLIST 汇编时不产生列表文件
NOCODE 条件汇编时,条件为假的不产生清单
c51单片机控制交通灯要求用汇编语言
// 51单片机控制交通灯要求用汇编语言,仿真实例,可以参考一下
SNF EQU 00H ; 南北通行标志位
EWF EQU 01H ; 东西通行标志位
URF EQU 02H ; 紧急事件标志位
ORG 0000H
LJMP MAIN ; 上电转主程序
ORG 000BH ; 定时中断入口
LJMP DSZD
ORG 0003H ; 紧急中断入口
LJMP URZD
ORG 0030H
MAIN: LCALL INIT ; 调用初始化子程序
LOOP: LCALL DIS ; 循环执行显示子程序
AJMP LOOP
; *** *** *** 初始化程序
INIT: SETB SNF
SETB EWF
SETB URF
MOV R2,#20 ; 定时器中断20次为1s
MOV TMOD,#01H ; 初始化定时器
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA ; 开定时中断与紧急中断
SETB ET0
SETB TR0
SETB EX0
SETB IT0 ; 设置中断程控方式
MOV DPTR,#TAB ; 数值首地址放入DPTR中
MOV 40H,#40 ; 东南西北通行时间设置
MOV 41H,#40
MOV 30H,#40 ; 通行时间初始化
MOV 31H,#60
MOV P0,#4CH ; 初始化时南北通行并把交通灯状态分别放在32H和33H中
MOV 32H,#4CH
MOV P2,#15H
MOV 33H,#15H
RET
; *** *** *** 显示子程序
DIS: MOV P3,#0DFH ; 选中南北方向的十位数码管
MOV A,30H ; 把显示数据送人数码管显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A ;
LCALL D1MS
MOV P3,#0EFH ; 选中南北方向的个位数码管
MOV A,B ; 送入数码管显示
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#7FH ; 选中第东西方向的十位数码管
MOV A,31H ; 送入数码管显示
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
MOV P3,#0BFH ; 选中第东西方向的个位数码管
MOV A,B
MOVC A,@A+DPTR
MOV P1,A
LCALL D1MS
SETB P3.0
SETB P3.1
JNB P3.0,DIS_S ; 查询是否第一个按键按下
JNB P3.1,DIS_E ; 查询是否第二个按键按下
AJMP DIS_R ; 没有键按下则返回
DIS_S:LCALL D5MS ; 按键去抖
JNB P3.0,DIS_SN
AJMP DIS_R
DIS_SN:MOV 40H,#50 ; 对通行时间从新分配,南北通行时间加长
MOV 41H,#30
AJMP DIS_R
DIS_E:LCALL D5MS ; 按键去抖
JNB P3.1,DIS_EW
AJMP DIS_R
DIS_EW:MOV 40H,#30 ; 东西通行时间加长
MOV 41H,#50
DIS_R:RET
; *** *** *** 定时中断处理程序
DS_C: LJMP DS_R ; 接力跳转
DSZD: PUSH ACC ; 保护现场
PUSH PSW
CLR TR0 ; 关定时器及中断标志位并重新赋值
CLR TF0
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ R2,DS_C ; 判断1m时间是否到达
MOV R2,#20 ; 到达重新赋值
DEC 30H ; 南北方向通行时间减一
MOV A,30H ; 把减一后的时间送入显示存储单元
; *** *** *** 南北通行到达最后4秒时黄灯闪烁
DS_10:CJNE A,#4,DS_11 ; 如果通行时间剩余4秒
JNB SNF,DS_11 ; 判断是否是南北通行
MOV P0,#8AH
MOV 32H, #8AH ; 把交通灯状态存入存储单元(后面类似)
DS_11:CJNE A,#3,DS_12 ; 不是剩余3秒,返回
JNB SNF,DS_12 ; 不是南北通行时间,返回
MOV P0,#88H
MOV 32H, #88H
DS_12:CJNE A,#2,DS_13
JNB SNF,DS_13
MOV P0,#8AH
MOV 32H, #8AH
DS_13:CJNE A,#1,DS_14
JNB SNF,DS_14
MOV P0,#88H
MOV 32H, #88H
; *** *** ***
DS_14:JNZ DS_NE ; 通行时间没有结束转向改变东西方向的数码管
CPL SNF ; 如果通行时间结束则对标志位取反
JNB SNF,DS_1 ; 判断是否南北通行
MOV 30H,40H ; 是,点亮相应的交通灯
MOV P0,#4CH
MOV 32H,#4CH ; 存储交通灯状态
MOV P2,#15H
MOV 33H, #15H ; 存储交通灯状态
DS_NE:DEC 31H ; 东西方向通行时间减一
MOV A,31H ; 把通行剩余时间送入显示存储单元
; *** *** *** 东西方向通行时间剩余4秒钟黄灯闪烁(程序注释与南北方向类似 略)
DS_20:CJNE A,#4,DS_21
JB EWF,DS_21
MOV P0,#51H
MOV 32H, #51H
DS_21:CJNE A,#3,DS_22
JB EWF,DS_22
MOV P0,#41H
MOV 32H, #41H
DS_22:CJNE A,#2,DS_23
JB EWF,DS_23
MOV P0,#51H
MOV 32H, #51H
DS_23:CJNE A,#1,DS_24
JB EWF,DS_24
MOV P0,#41H
MOV 32H, #41H
; *** *** ***
DS_24:JNZ DS_R ; 东西方向时间没有结束,返回
CPL EWF ; 对通行状态取反
JNB EWF,DS_2 ; 东西方向通行时间到来,跳转
MOV 31H,#80 ; 东西方向通行结束,重新显示时间
MOV P0,#89H ; 点亮相应的交通灯
MOV 32H, #89H
MOV P2,#29H
MOV 33H, #29H
AJMP DS_R
DS_1: MOV 30H,#80 ; 南北通行时间结束,重新对显示存储单元赋值
MOV P0,#89H ; 执行转弯状态1
MOV 32H, #89H
MOV P2,#26H
MOV 33H, #26H
AJMP DS_NE
DS_2: MOV 31H,41H ; 东西方向开始通行,赋值予显示存储单元
MOV P0,#61H ; 点亮相应的交通灯
MOV 32H, #61H
MOV P2,#15H
MOV 33H, #15H
DS_R: SETB TR0
POP PSW ; 恢复现场
POP ACC
RETI
; *** *** *** 紧急中断处理程序
URZD: PUSH ACC ; 保护现场
PUSH PSW
CLR IE0 ; 清除中断标志位
CLR TR0 ; 关定时器
CPL URF ; 紧急事件标志位
JB URF,UR_CON ; 紧急结束;跳转
MOV P0,#49H ; 各路口灯全显示红灯亮
MOV P2,#15H
AJMP UR_R
UR_CON:SETB TR0 ; 恢复正常交通
MOV A,32H
MOV P0,A
MOV A,33H
MOV P2,A
UR_R: POP PSW ; 恢复现场
POP ACC
RETI
; *** *** *** 查表指令0,1,2,3,4,5,6,7,8,9
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH
DB 7DH, 07H, 7FH, 6FH
; *** *** *** 延时5ms与1ms
D5MS: MOV R7,#5
D1MS: MOV R7,#10
MOV R6,#50
L1: DJNZ R6,$
DJNZ R7,L1
RET
END

更多文章:
全球新冠肺炎疫情背景下航运发展(盐田港复苏日志:半年历劫从“低谷”到“爆仓” 疫情之后巨轮如何越洋航行)
2026年9月7日 17:10
matlab求解带字母参数方程组(我想matlab求一个关于x,y的方程组 ab c d f e h m n 都是参数)
2026年9月7日 16:30
oracle中的循环语句(下面哪个不是oracle程序设计中的循环语句 a for)
2026年9月7日 15:30
电脑里2个系统怎么删除一个(电脑开机显示有两个系统,如何删除一个)
2026年9月7日 12:20
scrollthrough意思(“scroll”是什么意思)
2026年9月7日 08:00
怎么激活keygen(注册机如何激活cad2008一个简单激活cad2008的方法)
2026年9月7日 06:30



