单片机教学(汇编).pdf (汇编语言学习笔记)
路径: 五一电子介绍以及其它资料\5、单片机知识及首选工具\ 6--仿真器光盘\单片机教学(汇编).pdf <--点击下载
2页:
SETB P1.0 ; 设置 P1.0 高电平(高或低电平亮灯还是灭灯,要看LED灯和电路连接方式。这里是LED负极连P1.0口,低电平LED亮)
CLR P1.0 ; 设置 P1.0 低电平(高或低电平亮灯还是灭灯,要看LED灯和电路连接方式。这里是LED负极连P1.0口,低电平LED亮)
7页:
LJMP ;跳转到“标号”处。 例:LJMP LOOP 跳到LOOP标号处
LCALL ;调用子程序
RET ; 退出子程序
R6、R7 ;工作寄存器,零时存放,计算的中间数
END ;伪指令,说明程序结束
8页:
DJNZ ;减一指令,为零执行下一行代码,不为0 跳到标号处执行。例:DJNZ R7,D1 R7减1,R7不为0,跳D1标号处执行
# ;#号后面的数字是一个值。 例:MOV R6,#250 将250这个值赋值给R6寄存器,R6寄存器值就是250
9页:
P1 ;P1组,代表P1.0 ~P1.7 这些端口,可以用位来操作 MOV P1,#0FFH
10页:
SETB P1.0 可以写成 MOV P1.0,#0FFH
CLR P1.0 可以写成 MOV P1.0,#00H
A ;中间单元,用来把 P3 的值送给 P1。 P3 -> A ->P1 例:P3.2接按键,P1.2接LED灯,按下P3.2时,P1.2亮
;在 51 中,所有P开头的引脚,可以当输出,也可以当输入
11页:
SFR(特殊功能寄存器) ;用来控制 定时/计数器
12页:
表1:
符号 | 地址 | 功能介绍 |
B | F0H | B 寄存器,做乘除法用,放乘数或除数。不做乘除可以当普通寄存器随意使用 |
ACC | E0H | 累加器(简写:A)不是做加法用的 |
PSW | D0H | 程序状态字 ,这里放了CPU的当前标志位状态 |
IP | B8H | 中断优先级控制寄存器 |
P3 | B0H | P3 口锁存器,并行输入\输出寄存器,里面内容对应管脚输出 |
IE | A8H | 中断允许控制寄存器 |
P2 | A0H | P2 口锁存器,并行输入\输出寄存器,里面内容对应管脚输出 |
SBUF | 99H | 串行口锁存器 SCON 98H 串行口控制寄存器 |
P1 | 90H | P1 口锁存器,并行输入\输出寄存器,里面内容对应管脚输出 |
TH1 | 8DH | 定时器/计数器 1(高 8 位) |
TH0 | 8CH | 定时器/计数器 1(低 8 位) |
TL1 | 8BH | 定时器/计数器 0(高 8 位) |
TL0 | 8AH | 定时器/计数器 0(低 8 位) |
TMOD | 89A | 定时器/计数器方式控制寄存器 |
TCON | 88H | 定时器/计数器控制寄存器 |
DPH、DPL统称为DPTR | ||
DPH | 83H | 数据地址指针(高 8 位),用来访问外部数据存储器任一单元。不用时,可以当普通寄存器使用 |
DPL | 82H | 数据地址指针(低 8 位),用来访问外部数据存储器任一单元。不用时,可以当普通寄存器使用 |
SP | 81H | 堆栈指针,先进后出,后进先出,用来简化访问一批数据,只要知道这“批”数据的首地址,就可以访问到所有内容 |
P0 | 80H | P0 口锁存器,并行输入\输出寄存器,里面内容对应管脚输出 |
PCON | 87H | 电源控制寄存器 |
16页:
寻址:寻找操作数所在的地址。
寄存器寻址:把数放到工作寄存器,从工作寄存器寻找数据
@ 把值作为地址,取这个地址单元的内容。 例:MOV A,@R0 将R0中的值作为地址,送到A寄存器。假设R0是#30H ,那就相当于 MOV A,30H(注意30H带#就变成立即数了,就不是地址了)
INC 值自减一?,不是0 就跳标号处继续执行。 INC R0
间接寻址:数据是被间接寻找到的。间接寻址只能用R0\、R1存放数据
18页:
MOV DPTR, #DATA16(一个16位值,是8051中唯一一条16位指令,DPTR分高8位,低8位) 。
例: MOV DPTR,#1234H 执行后DPH值12H;DPL值34H,也可以写成 MOV DPH,#12H ; MOV DPL,34H
22页:
例:将外部RAM中100H单元内容送入外部RAM中200H单元中
MOV DPTR,#0100H
MOVX A,@DPTR
MOV DPTR,#0200H
MOVX @DPTR,A
程序存储器向累加器A传送指令
MOVC A, @A+DPTR
本指令是将ROM中的数送入A中。本指令也被称为查表指令,常用来查一个已做好ROM中的表格
变址寻址, 通过两个地址的相加得出用要的地址
查表确定平方值
23页:
PUSH 入栈
POP 出栈
入栈:
例: MOV SP, #5FH ;SP自加一,5F就变成60, 因在十六进制中F是最大值,要进位,5F就变60
MOV A, #100 ;A是ACC 的简称
MOV B, #20
PUSH ACC ;执行结果: SP=60, 内存60单元值100
PUSH B ;执行结果: SP=61, 内存61单元值20
出栈:(24页)
例:POP B ; 执行结果: SP=61, B=20
POP ACC ; 执行结果: SP=61, A=100
为什么这样顺序先出B后出ACC? 先进后出,后进先出的原则
24页:
ADD ; 不带进位的加法指令
例:MOV A, #30
ADD A, #10 ; A中的值 40H
25页:
ADDC ; 带进位的加法指令
26页:
SUBB ;带借位的减法指令
MUL ;乘法指令; 例:MUL AB ;将A和B两个8位无符号数相乘
DIV ;除法指令
INC ;自加一 (单字节指令)
27页:
DEC ;自减一 (单字节指令)
28页:
逻辑运算
CLR ;值,清零。 例:CLR A ;将A值清零,同 MOV A, #00H效果
CPL ;值,按位取反(执行原理,十六进制转二进制后,按位取反
RL ;值,逻辑左移(执行原理,十六进制转二进制后,将第7位送第0位,第0位送第1位,依次类推
RLC ;值,加上进位,逻辑右移
RR ;值,逻辑右移
RRC ;值,加上进位,逻辑右移
SWAP ;将值高、低4位交换(执行原理,十六进制转二进制后,
30页:
流水灯,暗点左移
31页:
逻辑与 (与,相当于数学里的乘法)
32页:
33页:
AJMP addr11 短跳转,双字节指令,可跳2K字节
LJMP addr16 长跳转,三字节指令,可跳64K字节
SJMP rel 相对转移,可跳256字节
JMP 间接转移指令
注:LJMP 可以代替 AJMP 指令,但要注意指令长短,占用空间不一样,实际时要注意。
35页:
条件转移指令
JZ rel 如果 A=0 则跳转到 rel 标号处,否则向下执行
JNZ rel 如果 A≠0 则跳转 rel 标号处,否则向下执行
36页:
比较转移指令
注:CJNE 指令执行后,CPU还会反应出 A和#data的值,哪个大。如果 A中值大 CY=0 ,否则 CY=1。
所以跳转后,再次判断 CY 就可以知道,A 和 #data 谁大了。
38页:
调用指令
LCALL add16 长调用指令,可跳64K字节
ACALL add11 短调用指令,可跳2K字节
RET 返回指令,返回到调用的地方
NOP 空操作指令,什么也不干,停一个周期,一般做短时间的延时
40页:
CLR C 位清0指令,使 CY=0
SETB C 位置1指令,使 CY=1
CPL C 位取反指令,使 CY 值和原来相反,原来 1 设置成0
41页:
ANL C,bit 位与指令,CY值与 bit 值相与,结果送回 CY
ANL C,/bit 取反再位与
ORL C, bit 位或指令
ORL C, /bit 取反再位或
42页:
JC rel 判断 CY标志位 是0还是1。 CY=1 则跳到 rel 标号处;CY=0 则不跳顺序执行。
JNC rel 判断 CY标志位 是0还是1。 CY=0 则跳到 rel 标号处;CY=1 则不跳顺序执行。
43页:
判位变量转移指令
JB bit, rel 判断 bit 位 是0还是1。 bit=1 则跳到 rel 标号处;bit=0 则不跳顺序执行。
JNB bit, rel 判断 bit 位 是0还是1。 bit=0 则跳到 rel 标号处;bit=1 则不跳顺序执行。
8031中有两个计数器:
T0、T1,两个计数器分别是两个8位RAM单元组成,也就是16位,最大计数 65536。
12Mhz晶振进过12分频后: 12M/12=1M (也就是计数间隔是1微秒)
44页:
定时器从0累加到65536-1时,每个是1微妙,记满所用的时间是 65.536 毫秒。
当计数器 TF0 溢出(超过65536时),才会引发事件。
任意定时计数方法:
定时:假设只想定时10毫秒,10毫秒 = 10000微秒,计数器里放入 55536 即可。
计数:假设 要给100个东西计数,那从0开始计数到100,TF0没有溢出,没法触发事件,怎么办?
解决方法: 初始值设置为 65436-1 而不是设置0,就可以了。
特殊功能寄存器:计时器/计数器
名称 | 地址 |
TMOD | 89H |
TCON | 88H |
注:在写代码时,名字可以直接使用,编译时,编译器自动把名称转成地址。
TMOD被拆分成两部分:
名称 | 子名称 | 位名称 |
TMOD | T1 | GATE |
C/T | ||
M1 | ||
M0 | ||
T0 | GATE | |
C/T | ||
M1 | ||
M0 |
TCON也被拆分成两部分:
名称 | 位名称 |
用于定时/计数器 | TF1 |
TR1 | |
TF0 | |
TR0 | |
用于中断 | IE1 |
IT1 | |
IE0 | |
IT0 |
45页:
当计数器达到最大值溢出后,TF(0、1) 的值由0 变1
TR(0、1)称之为运行控制器。当 TR(0、1)值为1时,才能启动计数器。
可以用 SETB 启动定时/计数器;用 CLR 关闭定时/计数器
定时/计时器 四种工作方式:
方式0:13位计数/定时方式,最多可计到 2的13次方,也就是8192-1;
方式1:16位计数/定时方式,最多可计到 2的16次方,也就是65536-1;
方式2 和 方式3:8位定时/计数方式,最多可计 2的8次方,也就是256-1;
46页:
单片机第 二十 课: 中断系统
8031中五个中断:两个外部中断、两个定时/计数器中断、串行口中断
48页:
外部中断:
INT0 对应 P3.2引脚
INT1 对应 P3.3引脚
TCON和外部中断有关:
1.外部中断:
IT(0、1) : INT0 触发方式控制位,可由软件进行 置位/复位 ,
IT(0、1) =0 INT(0、1) 为低电平触发方式;
IT(0、1) =1 INT(0、1) 为负跳变触发方式。
IE(0、1): 中断请求标志位。外部有中断请求时,位置1(由硬件完成),响应中断后,硬件将IE(0、1)清0
2.内部中断:
TF(0、1):定时器 T(0、1) 溢出中断标记,但 T(0、1) 溢出时,由硬件置位 TF(0、1) ,
当 CPU响应中断后,再由硬件将 TF(0、1) 清0。
IE 中断允许寄存器:
EA 是总开关,等于0时,左右中断都不允许。
ES 串行中断允许;
ET1 定时器 1 中断允许;
EX1 外中断 1 中断允许;
ET0 定时器 0 中断允许;
EX0 外中断 0 中断允许。
例:
允许外中断,定时器1中断允许,其他不允许,则 IE 是:
EA | X | X | ES | ET1 | EX1 | ET0 | EX0 |
1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
即 8CH,也可以位操作实现:
SETB EA
SETB ET1
SETB EX1
五个中断源优先级:
外中断0:0003H
定时器0:000BH
外中断1:0013H
定时器1:001BH
串口:0023H
以上五个是优先级,由高到低排列。单片机可以设置自然优先级和人工优先级。
开机时,中断都处于低优先级。
人工设置中断优先级:
将 IP 中的某位置 1 设置成高优先级。
X | X | X | PS | PT1 | PX1 | PT0 | PX0 |
IP前3位没用,随意设置,一般设置位0
例:
X | X | X | PS | PT1 | PX1 | PT0 | PX0 |
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 |
IP的值 06H
中断响应顺序:
定时器0 -> 外中断1 -> 外中断0 -> 定时器1 -> 串行中断
PT0 -> PX1 -> PX0 -> PT1 -> PS
51页:
RETI 中断执行完后,一定要执行 RETI 指令, CPU会把堆栈中保存的地址去出。
注: CPU保护东西有限,如果用到 A 、PSW等,需要程序员去自己保护(入堆栈)
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!