小知识点补充1:单片机IO空操作方式:
1,输出数据方式
2,读端口数据方式
3,读端口引脚方式
小知识点补充2:
按中断产生的位置分为:外部中断和内部中断
按接受中断方式分为:可屏蔽中断和非可屏蔽中断
51单片机所有基本指令及常见伪指令汇总如下:
51单片机指令表助记符 指令说明 字节数 周期数
(数据传递类指令)
1 MOV A,Rn 寄存器传送到累加器 1 1
2 MOV A,direct 直接地址传送到累加器 2 1
3 MOV A,@Ri 累加器传送到外部 RAM(8 地址 ) 1 1
4 MOV A,#data 立即数传送到累加器 2 1
5 MOV Rn,A 累加器传送到寄存器 1 1
6 MOV Rn,direct 直接地址传送到寄存器 2 2
7 MOV Rn,#data 累加器传送到直接地址 2 1
8 MOV direct ,Rn 寄存器传送到直接地址 2 1
9 MOV direct ,direct 直接地址传送到直接地址 3 2
10 MOV direct ,A 累加器传送到直接地址 2 1
11 MOV direct ,@Ri 间接 RAM 传送到直接地址 2 2
12 MOV direct ,#data 立即数传送到直接地址 3 2
13 MOV @Ri,A 直接地址传送到直接地址 1 2
14 MOV @Ri,direct 直接地址传送到间接 RAM 2 1
15 MOV @Ri,#data 立即数传送到间接 RAM 2 2
16 MOV DPTR,#data16 16位常数加载到数据指针 3 1
17 MOVC A,@A+DPTR 代码字节传送到累加器 1 2
18 MOVC A,@A+PC 代码字节传送到累加器 1 2
19 MOVX A,@Ri 外部RAM(8bit地址)传送到累加器 1 2
20 MOVX A,@DPTR 外部 RAM(16bit地址)传送到累加器 1 2
21 MOVX @Ri,A 累加器传送到外部 RAM(8 地址 ) 1 2
22 MOVX @DPTR,A 累加器传送到外部 RAM(16 地址 ) 1 2
23 PUSH direct 直接地址压入堆栈 2 2
24 POP direct 直接地址弹出堆栈 2 2
25 XCH A,Rn 寄存器和累加器交换 1 1
26 XCH A, direct 直接地址和累加器交换 2 1
27 XCH A, @Ri 间接RAM 和累加器交换 1 1
28 XCHD A, @Ri 间接RAM 和累加器交换低4位字节 1 1
29 SWAP A 累加器内高低半字节交换 1 1
( 算术运算类指令 )
30 INC A 累加器加1 1 1
31 INC Rn 寄存器加1 1 1
32 INC direct 直接地址加1 2 1
33 INC @Ri 间接RAM加1 1 1
34 INC DPTR 数据指针加1 1 2
35 DEC A 累加器减1 1 1
36 DEC Rn 寄存器减1 1 1
37 DEC direct 直接地址减1 2 2
38 DEC @Ri 间接RAM减1 1 1
39 MUL AB 累加器和B寄存器相乘 1 4
40 DIV AB 累加器除以B寄存器 1 4
41 DA A 累加器十进制调整 1 1
42 ADD A,Rn 寄存器与累加器求和 1 1
43 ADD A,direct 直接地址与累加器求和 2 1
44 ADD A,@Ri 间接 RAM 与累加器求和 1 1
45 ADD A,#data 立即数与累加器求和 2 1
46 ADDC A,Rn 寄存器与累加器求和( 带进位 ) 1 1
47 ADDC A,direct 直接地址与累加器求和( 带进位 ) 2 1
48 ADDC A,@Ri 间接RAM与累加器求和( 带进位 ) 1 1
49 ADDC A,#data 立即数与累加器求和( 带进位 ) 2 1
50 SUBB A,Rn 累加器减去寄存器( 带借位 ) 1 1
51 SUBB A,direct 累加器减去直接地址( 带借位 ) 2 1
52 SUBB A,@Ri 累加器减去间接RAM(带借位 ) 1 1
53 SUBB A,#data 累加器减去立即数( 带借位 ) 2 1
( 逻辑运算类指令 )
54 ANL A,Rn 寄存器“与”到累加器 1 1
55 ANL A,direct 直接地址“与”到累加器 2 1
56 ANL A,@Ri 间接 RAM“与”到累加器 1 1
57 ANL A,#data 立即数“与”到累加器 2 1
58 ANL direct,A 累加器“与”到直接地址 2 1
59 ANL direct, #data 立即数“与”到直接地址 3 2
60 ORL A,Rn 寄存器“或”到累加器 1 2
61 ORL A,direct 直接地址“或”到累加器 2 1
62 ORL A,@Ri 间接 RAM“或”到累加器 1 1
63 ORL A,#data 立即数“或”到累加器 2 1
64 ORL direct,A 累加器“或”到直接地址 2 1
65 ORL direct, #data 立即数“或”到直接地址 3 1
66 XRL A,Rn 寄存器“异或”到累加器 1 2
67 XRL A,direct 直接地址“异或”到累加器 2 1
68 XRL A,@Ri 间接RAM“异或”到累加器 1 1
69 XRL A,#data 立即数“异或”到累加器 2 1
70 XRL direct,A 累加器“异或”到直接地址 2 1
71 XRL direct, #data 立即数“异或”到直接地址 3 1
72 CLR A 累加器清零 1 2
73 CPL A 累加器求反 1 1
74 RL A 累加器循环左移 1 1
75 RLC A 带进位累加器循环左移 1 1
76 RR A 累加器循环右移 1 1
77 RRC A 带进位累加器循环右移 1 1
( 控制转移类指令 )
78 JMP @A+DPTR 相对DPTR的无条件间接转移 1 2
79 JZ rel 累加器为0则转移 2 2
80 JNZ rel 累加器为1则转移 2 2
81 CJNE A,direct,rel 比较直接地址和累加器,不相等转移 3 2
82 CJNE A,#data,rel 比较立即数和累加器,不相等转移 3 2
83 CJNE Rn,#data,rel 比较寄存器和立即数,不相等转移 2 2
84 CJNE @Ri,#data,rel 比较立即数和间接RAM,不相等转移 3 2
85 DJNZ Rn,rel 寄存器减1,不为0则转移 3 2
86 DJNZ direct,rel 直接地址减1,不为0则转移 3 2
87 NOP 空操作,用于短暂延时 1 1
88 ACALL add11绝对调用子程序 2 2
89 LCALL add16 长调用子程序 3 2
90 RET 从子程序返回 1 2
91 RETI 从中断服务子程序返回 1 2
92 AJMP add11 无条件绝对转移 2 2
93 LJMP add16 无条件长转移 3 2
94 SJMP rel 无条件相对转移 2 2
( 布尔指令 )
95 CLR C 清进位位 1 1
96 CLR bit 清直接寻址位 2 1
97 SETB C 置位进位位 1 1
98 SETB bit 置位直接寻址位 2 1
99 CPL C 取反进位位 1 1
100 CPL bit 取反直接寻址位 2 1
101 ANL C,bit 直接寻址位“与”到进位位 2 2
102 ANL C,/bit 直接寻址位的反码“与”到进位位 2 2
103 ORL C,bit 直接寻址位“或”到进位位 2 2
104 ORL C,/bit 直接寻址位的反码“或”到进位位 2 2
105 MOV C,bit 直接寻址位传送到进位位 2 1
106 MOV bit, C 进位位位传送到直接寻址 2 2
107 JC rel 如果进位位为 1 则转移 2 2
108 JNC rel 如果进位位为 0 则转移 2 2
109 JB bit ,rel 如果直接寻址位为 1 则转移 3 2
110 JNB bit ,rel 如果直接寻址位为 0 则转移 3 2
111 JBC bit ,rel 直接寻址位为 1 则转移并清除该位 2 2
***(伪指令)***
ORG 指明程序的开始位置
DB 定义数据表
DW 定义16位的地址表
EQU 给一个表达式或一个字符串起名
DATA 给一个8位的内部RAM起名
XDATA 给一个8位的外部RAM起名
BIT 给一个可位寻址的位单元起名
END 指出源程序到此为止
(指令中的符号标识)
Rn 工作寄存器 R0-R7
Ri 工作寄存器 R0 和 R1
@Ri 间接寻址的 8 位 RAM 单元地址( 00H-FFH)
#data8 8 位常数
#data16 16 位常数
addr16 16 位目标地址,能转移或调用到 64KROM 的任何地方
addr11 11 位目标地址,在下条指令的 2K 范围内转移或调用
Rel 8 位偏移量,用于 SJMP 和所有条件转移指令,范围 -128 ~+127
Bit 片内 RAM 中的可寻址位和 SFR 的可寻址位
Direct 直接地址,范围片内 RAM 单元( 00H-7FH)和 80H-FFH
$ 指本条指令的起始位置
(以上指令、伪指令等是本人在书上手打出来的,若有错误,欢迎留言指正,谢谢!)
题33(偏实践型)请参考下图编写一个八位二进制密码锁程序。 程序中初始密码为
10001000B,当拨码开关输入的内容等于 10001000B 时,绿色LED亮,否则红色 LED 点亮,以示警告。
解析:注意LED亮灭的条件。
程序源码:
PASSWORD EQU 70H;SAVE INIT PASSWORDS
REDLED BIT P2.6
GREENLED BIT P2.7
ORG 0000H
LJMP START
ORG 0030H
START:
MOV PASSWORD,#10001000B
CLR A
MOV R7,#0FFH
CLR REDLED
SETB GREENLED
LOOP:
MOV P1,R7
MOV A,P1
CJNE A,PASSWORD,RFUC
CLR GREENLED
SETB REDLED
AJMP LOOP
RFUC:
CLR REDLED
SETB GREENLED
AJMP LOOP
SJMP $
END
效果图:
1,密码正确时
2,密码错误时
扩展:
请参考下图编写一个八位二进制密码锁程序。 程序中初始密码为
7DH。用户随机拨动拨码开关,试编写程序满足下列要求:(数码管为共阴数码管连接到P0口)
(1)当用户通过拨码开关输入的密码时, 拨码开关输入的内容直观的在数码管上显示,例如拨码开关内容等于0111111时,数码管显示8。
(2)当拨码开关内容等于 10101010B 时,绿色LED亮,否则红色 LED 点亮,以示警告。
程序源码:
PASSWORD EQU 60H;SAVE INIT PASSWORDS
REDLED BIT P2.6
GREENLED BIT P2.7
ORG 0000H
LJMP START
ORG 0030H
START:
MOV PASSWORD,#01111101B
CLR A
MOV R7,#0FFH
CLR REDLED
SETB GREENLED
LOOP:
MOV P1,R7
MOV A,P1
MOV P0,A
CJNE A,PASSWORD,RFUC
CLR GREENLED
SETB REDLED
AJMP LOOP
RFUC:
CLR REDLED
SETB GREENLED
AJMP LOOP
SJMP $
END
仿真图:
1,密码错误
2,密码正确