单片机教学(汇编).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页:

逻辑与 (与,相当于数学里的乘法)

ANL A,Rn ;A与 Rn 中的值按位'与',结果送入 A 中
ANL A,direct ;A与 direct 中的值按位'与',结果送入 A 中
ANL A, @Ri ;A与间址寻址单元@Ri 中的值按位'与',结果送入 A 中
ANL A,#data ;A 与立即数 data 按位'与',结果送入 A 中
ANL direct,A ;direct 中值与 A 中的值按位'与',结果送入 direct 中
ANL direct,#data ;direct 中的值与立即数 data 按位'与',结果送入 direct 中。

 

32页:

逻辑或 ORL(或,相当于数学里的加法)
例:
        1001 1000
   或  0110 0001
结果  1111 1001
 
逻辑异或 XRL(是按位“异或”,相同为“0”,相异为“1”。)
例:
   1001 1000
异或 0110 0001
结果 1111 1001
 

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 A,#data,rel  将A中值和#data值比较,两者相等就顺序执行,不相等就跳到 rel 标号处。
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel

 注: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等,需要程序员去自己保护(入堆栈)

 

 

 

 

-

 

posted @   悟透  阅读(433)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示