文章目录
@[TOC]
学习建议
单片机基础
单片机概述
认识单片机
存储器概述
单片机结构原理
MCS-51 单片机片内RAM的配置
89C51单片机的引脚
MCS-51单片机指令系统
汇编语言
指令中符号的意义
寻址方式
指令系统
内部RAM数据传送类 MOV
外部RAM的数据传送指令 MOVX
ROM向累加器A传送数据指令
堆栈操作指令
数据交换指令 XCH, XCHD,SWAP
算术运算类
逻辑运算与移位类
控制转移类
汇编语言由指令和伪代码两部分组成
伪指令
MCS-51的中断系统
MCS-51的定时器/计数器
学习建议
结合哈工大的教程视频及课件学习
【公开课】哈工大 单片机原理及应用
单片机基础
- 计算机
计算机只能识别存储数码0和1
微型计算机中,负数常用补码表示
电子元器件的电位被区分为两种状态:高电位和低电位
常见高电位范围:2V ~ 5V
常见低电位范围:0V ~ 0.8V
正逻辑表示:高电平为1,低电平为0;反逻辑表示法相反
八进制和十六进制只是为了将二进制数表示的更简略时才使用,计算机里不存在
进制间转换
机器数:一个数在计算机中的表示形式
机器数可以只用来表达正数,无符号数
所能表示的范围受机器字长的限制:字长8位(0255),字长16位(065535)
机器数可以用符号位(最高位)来表示数的正负:字长8位(-128-127)
正数符号位0,其原码,反码,补码一致
负数符号位1,原码不变,反码除符号位外按位取反,补码为反码加1
计算机内,带符号数一般都以补码的形式在机器中存放和进行运算
对每个十进制数符分别编码:BCD码,余3码,Gray码
ASCII码
基本逻辑运算
与 AND
或 OR
非 NOT
异或 XOR
单片机概述
- 基本概念
微处理器–核心CPU
微型计算机–简称微机
微型计算机系统–简称微机系统
- 微机硬件组成
总线Bus —— 计算机内传送信息的公共通道
地址总线 Address Bus (AB) :传送存储单元或I/O端口的地址信息,单向,宽度决定CPU的寻址空间
数据总线 Data Bus (DB) :在CPU和存储器或I/O端口之间传送数据信息或指令码,双向
控制总线 Control Bus (CB) :在CPU和各部件之间传送控制或状态信息,每根CB传送方向固定
“公共” —— 允许多个部件间同时从总线上接收数据,不允许两个或两个以上部件同时向总线传送数据
- 存储器
主存和辐存
随机存储器(RAM: Random Access Memory),掉电信息消失
只读存储器(ROM: Read Only Memory) ,掉电信息不消失
存储内容以字节为单位,存储单元地址唯一
存储单元多少决定于系统的地址总线数目:n条地址总线 — 2^n个存储单元
- 输入输出设备
输入设备:将外界的信息转化为机内的表示方式并传送到计算机内部
输出设备:将计算机内的数据和程序转换成人们所需要的形式并传送到计算机外部
设备号(设备地址):系统为每个输入输出设备分配的一个无符号整数
- 运算器
- 控制器 – 取指令,分析并执行指令;控制器对存储器的读数据;控制器对存储器的写数据
- 微机软件 – 系统软件 : 操作系统;应用软件 :软件开发工具包;最终用户软件 :消费娱乐/网络/通信
- 微处理器(CPU)
认识单片机
- 单片机的特点
存储器有片内和片外存储器之分 —— 片内和片外存储器的访问方式是有区别的
单片机内的ROM的RAM严格分工 —— 程序存储器ROM,数据存储器RAM
单片机属于第四代计算机中的微型机
不同型号MCS-51单片机CPU处理能力和指令系统完全兼容,只是存储器和I/O接口的配置有所不同
- MCS-51单片机系列的硬件基本配置
8位CPU(位:CPU一次最大能够处理的二进制数的位数)
片内ROM/EPROM、RAM
片内并行I/O接口
片内16位定时器/计数器
片内中断处理系统
片内全双工串行I/O口
存储器概述
- 存储器定义: 在微机系统中凡能存储程序和数据的部件统称为存储器。
- 以字节为单位存储信息,内容和地址都是二进制数
- 存储器分类:微机系统中的存储器分为内存和外存两类。
内存:存储容量有限,存放将要运行的程序和数据,存取速度快,可以直接与CPU交换信息。
外存:存储容量大,存取速度慢;它不能直接与CPU交换信息,必须经过内存实现;常用的有硬盘、软盘和光盘。
单片机结构原理
- MCS-51系列单片机的结构和原理

RAM:内部数据存储器 ,存放可以读写的数据,如运算的中间结果和最终结果
89C51内有256B的RAM单元,其地址范围为00H — FFH
ROM:内部程序存储器,存放程序,也可存放一些原始数据和表格,有些单片机内部不带ROM
89C51内有的4K的ROM; 不够用时可以外扩ROM; 内ROM+外ROM≤ 64K
程序存储器和数据存储器是分开的,同样16根地址线,加上不同的控制信号,可以分别寻址64K RAM和64K ROM,实际上扩大了存储器容量。
并行口:4个8位的并行输入/输出端口,每个端口可以用做输入输出。
P0口分时作为低8位地址线和8位数据线
P2口作为高8位地址线。
MCS-51有16根地址线和8根数据线
震荡电路:内部时钟产生电路,但晶体和振荡器需要外接,最高的允许振荡频率是12MHz
- MCS-51单片机内部结构

PC :程序计数器
16位寄存器
PC的值是下一条指令的地址
存放下一条将要执行的指令地址.程序中的指令是按照顺序存放在存储器中的某个连续区域.每条指令都有自己的地址,CPU根据PC中的指令地址从存储器中取出将要执行的指令.
具有自动加1功能,从而指向下一条将要执行的指令地址.
PC的值可以修改,一般程序是按顺序执行指令的.若改变了的PC的值,则程序将不再按顺序执行
A:累加器 Acc
8位寄存器
在指令中直接写A
由于所有运算的数据都要通过累加器,故累加器在微处理器中占有很重要的位置。
B:寄存器B
8位寄存器
在进行乘除法运算时,存放参与运算的一个操作数
除此之外,作为一般REG使用
PSW:程序状态字寄存器,8位寄存器。
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
Cy |
Ac |
F0 |
RS1 |
PS0 |
Ov |
– |
P |
Cy(PSW.7)—进位标志位。当运算结果产生进位时, Cy =1;当运算结果没有产生进位时, Cy =0。
AC(PSW.6)—辅助进位(或称半进位)标志。
当运算结果的D3向D4产生进位时, AC =1;
当运算结果的D3向D4没有产生进位时, AC =0。
OV(PSW.2)—溢出标志位。
当运算结果产生溢出时, OV =1;
当运算结果没有产生溢出时, OV =0。
P(PSW.0)——奇偶标志位。
当A中1的个数为奇数时, P =1;
当A中1的个数为偶数时, P =0。
MCS-51 单片机片内RAM的配置
- 89C51内有256B的RAM单元,其地址范围为00H—FFH
低 128 字节(00H~7FH)为真正的RAM区;
高 128 字节(80H~FFH)为特殊功能寄存器区SFR。
- 工作寄存器区
工作寄存器区 是指00H~1FH区, 共分4个组, 每组有8个单元, 共32个内部RAM单元。
每次只能有1组作为工作寄存器使用, 其它各组可以作为一般的数据缓冲区使用。
作为工作寄存器使用的8个单元,又称为R0—R74、程序状态字PSW中的PSW.3(RS0)和PSW.4(RS1)两位来选择哪一组作为工作寄存器使用。CPU通过软件修改PSW中RS0和RS1两位的状态, 就可任选一个工作寄存器工作。
当RS1=0,RS0=1,则第1组寄存器作为工作寄存器使用,片内RAM地址为08H~0FH
- SFR 区
高128B的RAM单元中有21个单元可用,称为SFR。
这21个SFR分散在高128B的地址空间内,分别是A,B,PSW,SP,DPH,DPL,P0,P1,P2,P3,IP,IE,TCON,TMOD,TH0,TL0,TH1,TL1,SCON,SBUF,PCON。
有些可以按位寻址。
特殊功能寄存器名称、 标识符、 地址见表
89C51单片机的引脚

MCS-51单片机指令系统
汇编语言
- 汇编语言概述
汇编语言就是最接近本质的机器语言,操作直接面向硬件 ,指令集合更简约,指令操作更直接
- 指令概述
指令由操作码和操作数组成。
[ 标号: ] < 操作码 > < 操作数 > [ ; 注释 ]
LABEL1:MOV A,#3AH; 将3AH送入累加器A
操作码:操作码决定CPU执行何种操作。
操作数:操作数就是操作对象。无论何种指令其操作的对象都是数据。
指令中符号的意义
Rn :当前寄存器区的8个工作寄存器R0~R7
Ri :当前选中寄存器区中可作为间接寻址R0、R1
Direct :直接地址,即8位的内部数据存储器单元或特殊功能寄存器的地址
#data :包含在指令中的8位立即数
#data16 :包含在指令中的16位立即数
rel :相对转移指令中的偏移量,为8位的带符号补码数
DPTR :数据指针,可用作16位的数据地址寄存器
bit :内部RAM或特殊功能寄存器中的直接寻址位
C(或Cy):进位标志位或位处理机中的累加器
addr11 :11位目的地址
addr16 :16位目的地址
@ :间接寻址寄存器前缀,如@Ri, @A+DPTR
( X ) :X中的内容
(( X )) :由X寻址的单元中的内容
–> : 箭头右边的内容被箭头左边的内容取代
寻址方式
- 指出操作数所在地方的方式
立即寻址
操作数在指令中直接给出,需要在操作数前面加前缀“#”
若立即数的首位为A~F,前面需加零
MOV A, #40H
MOV A,#0FFH
直接寻址
操作数直接以单元地址的形式给出:MOV A, 40H
寻址范围:
内部 RAM 的128个单元
特殊功能寄存器,特殊功能寄存器只能用直接寻址方式进行访问
除了以单元地址的形式外,还可用寄存器符号的形式给出
MOV A, 80H 与 MOV A, P0是等价的
REG寻址(寄存器寻址方式)
操作数在寄存器中:MOV A, Rn ;
表示把 Rn的内容传送给累加器A
寻址范围
8个工作寄存器R0~R7,累加器A,寄存器B,数据指针DPTR
REG间接寻址(寄存器间接寻址)
寄存器的名称前面加前缀标志“@”
寄存器中存放的是操作数的地址
当寻址内部RAM时,只能使用R0、R1 作为地址指针
当访问外部RAM时, 可使用R0、 R1及DPTR作为地址指针
变址寻址
用于访问程序存储器中的数据表格
它以寄存器DPTR或PC的内容为基本地址, 加上累加器A里的地址偏移量,作为操作数的地址。
MOVC A, @A+DPTR
MOVC A, @ A+PC
只能从ROM中读数据,不可能对ROM写入
相对寻址
相对转移指令执行时,是以当前的PC值再加上指令中规定的偏移量rel而构成实际的转移地址
这里说的当前PC值是指执行完相对转移指令后的PC值。
SJMP rel
目的地址 = 源地址 + 转移指令字节数 + rel
位寻址
MOV C, 40H
直接寻址里面的40H是一个字节,这里的40H是为寻址区的一位,因为C 是一位
MOV C, 07H 与 MOV C, (20H).7 一致
寻址范围:
内部 RAM的位寻址区
特殊功能寄存器中的可寻址位。如:P0.3, PSW.5
指令系统
内部RAM数据传送类 MOV
MOV < 目的操作数 >, < 源操作数 >
属“复制”性质,而不是“搬家”
数据传送指令 不影响标志位,Cy、Ac和OV,但不包括九标志位 P
- 以累加器为目的的操作数的指令
- MOV A, Rn ; ( Rn ) -> A, n=0~7 寄存器寻址
- MOV A, @Rn ; (( Ri ) -> A, i=0,1 间接寻址
- MOV A, direct ; ( direct) -> A 直接寻址
- MOV A, #data ; #data -> A 立即寻址
- 以Rn 为目的操作数指令
- MOV Rn, A ; (A) -> Rn, n=0~7
- MOV Rn, direct ; (direct) -> Rn, n=0~7
- MOV Rn, #data ; #data -> Rn, n=0~7
- 以直接地址direct为目的操作数的指令,direct指的是内部RAM或SFR的地址
- MOV direct, A ; (A) -> direct
- MOV direct, Rn ; (Rn) -> direct,n=0~7
- MOV direct1,direct2
- MOV direct, @Ri ; (( Ri )) -> direct
- MOV direct, #data ; #data -> direct
- 以寄存器间接地址为目的操作数指令
- MOV @Ri, A ; (A) -> (( Ri )), i=0,1
- MOV @Ri, direct ; (direct) -> (( Ri )), i=0,1
- MOV @Ri, #data ; #data -> (( Ri )), i=0,1
- 16位数传送指令
- MOV #DPTR, #DATA16 ; #data16 -> DPTR
- 唯一的16位数据的传送指令,立即数的高8位送入DPH,立即数的低8位送入DPL。
外部RAM的数据传送指令 MOVX
必须采用间接的寻址方式
MOVX A, @DPTR ; A<- (( DPTR ))
MOVX @DPTR, A ; (( DPTR ))<- A
MOVX A, @Ri ; A<- (( Ri ))
MOVX @Ri, A ; (( RI ))<- A
ROM向累加器A传送数据指令
后续讲解
堆栈操作指令
后续讲解
数据交换指令 XCH, XCHD,SWAP
-
整字节交换指令
- XCH A, Rn ; A <–> Rn
- XCH A, direct;A <–> direct
- XCH A, @Ri ; A <–> ( Ri )
-
半字节交换指令
- XCHD A, @Ri ;Acc.3~Acc.0 <–> ( Ri )3~0 i=0,1
-
累加器高低半字节交换指令
- SWAP A ;Acc.7 ~ Acc.4 <–> Acc.3~ Acc.0
算术运算类
- 加法运算
加法指令
ADD A, #data8\ direct\ @Ri \Rn
一个加数总是来自累加器A, 而另一个加数可由不同的寻址方式得到。
结果总是放在 A中
使用加法指令,要注意累加器A中的运算结果对各个标志位的影响
如果位 7 有进位,则置 “1”进位标志Cy,否者清“0”Cy
如果位 3 有进位,置“1”辅助进位标志Ac,否则清“0”Ac
如果位 6 有进位,而位 7 没有进位,或者倒过来(位6,位7中有一个进位),则溢出标志位OV置“1”,否者清“0”
带进位加法指令
ADDC A, #data8\ direct\ @Ri \Rn
( A )+ (#data8\ direct\ @Ri \Rn)+Cy –> A
对标志位的影响同ADD指令
增 1 指令
INC A\ direct\ @Ri\ Rn\ DPTR
自增 1
不影响PSW中的任何标志
若原变量中内容为FFH,则程序执行后变量变为00H
- 减法运算
SUBB A, #data8\ direct\ @Ri\Rn
( A ) – ( #data8\ direct\ @Ri\Rn ) – Cy –> A
如果位 7 需借位,则置 “1”Cy,否者清“0”Cy
如果位 3 需借位,置“1”Ac,否则清“0”Ac
如果位 6 有借位,而位 7 没有借位,或者倒过来(位6,位7中有一个借位),则溢出标志位OV置“1”,否者清“0”
DEC A\ derect\ @Ri\ Rn
自减 1
不影响标志位
- 乘法运算
MUL AB ; A * B -> BA
将累加器A的内容与寄存器B的内容相乘
乘积的低 8 位存放在累加器A中, 高 8 位存放于寄存器B中
Cy=0 执行乘法指令后,进位标志Cy一定被清零
如果积大于255,则置“1”溢出标志位OV置“1”
- 除法运算
DIV AB ; A/B –>A(商),余数–>B
将累加器 A中的内容除以寄存器 B中的8位无符号整数
所得商的整数部分存放在累加器A中, 余数部分存放在寄存器 B中
Cy=0 进位标志Cy一定被清零
OV溢出标志只是在除数B=0时才置1,并且A,B存放的内容不定,其他情况OV = 0
逻辑运算与移位类
- 逻辑与运算
ANL A, #data8\ direct\ @Ri\ Rn
ANL direct, #data8\ A
- 逻辑或运算
ORL A, #data8\ direct\ @Ri\ Rn
ORL direct, #data8\ A
- 逻辑异或运算
XRL A, #data8\ direct\ @Ri\ Rn
XRL direct, #data8\ A
- 逻辑非运算
CPL A ;累加器取反
累加器A的内容按位逻辑取反,不影响标志位
已知一个负数的补码,求它的绝对值 –> 补码按位取反加1
CLR A ;累加器清零
累加器A清“0”,不影响Cy,Ac,OV等标志位
- 移位
RL A; 左移
累加器A的8位向左环移位,位7循环移入位0,不影响标志位
1000 0001 –> 0000 0011
RLC A; 带进位左移
累加器A的内容和进位标志位Cy一起左环移一位
Acc.7 移入Cy,Cy移入Acc.0,不影响其他标志位
Cy=1,0001 0001 -> Cy=0, 0010 0011
Cy=0, 1000 1001 -> Cy=1, 0001 0010
RR A; 右移
累加器A的8位向右循环移位,位0循环移入位7,不影响标志位
1000 0001 –> 1100 0000
RR C A; 带进位右移
累加器A的内容和进位标志位Cy一起右环移一位
Acc.0 移入Cy,Cy移入Acc.7,不影响其他标志位
Cy=1,0001 0000 -> Cy=0, 1000 1000
Cy=0, 1000 1001 -> Cy=1, 0100 0100
SWAP A; 累加器半字节交换指令
将累加器A的高半字节(Acc.7Acc.4)和低半字节(Acc.3Acc.0)互换
(A)=0C5H –> ( A ) =5CH
控制转移类
- 转移类
无条件转移指令
- LJMP addr16 长转移指令
三字节指令,执行时将指令码中的addr16送入PC
addr16是16位二进制地址,因此长转移指令可以在64KB范围内转移
- AJMP addr11 绝对转移指令
两字节指令
执行该指令时,先将PC+2,把PC+2后的高5位PC15~PC11 和指令码addr11的11位地址构成转移地址
绝对转移指令可以在2KB范围内向前或向后转移
- SJMP rel 短转移指令
转移范围:-126~129
- JMP @A+DPTR
条件转移指令
- JC rel 若A=0则转移;若A不为0,则顺序执行下一条指令
- JNC rel 与JC相反
- JC rel 若Cy=1则转移;若Cy为0,则顺序执行下一条指令
- JNC rel 与JC相反
- JB bit, rel 若bit =1 则转移;若bit=0,则按顺序执行下一条指令
- JNB bit, rel 与JB相反
- JBC bit, rel 若bit =1 则转移,并清零该位;若bit=0,则按顺序执行下一条指令
- 比较条件转移指令
CJNE A, #data8, rel
CJNE A, direct, rel
CJNE Rn, #data8, rel
CJNE @Ri, #data8, rel
若目的操作数=源操作数,则按顺序执行下一条
若目的操作数>源操作数,则Cy=0,并转移
若目的操作数<源操作数,则Cy=1,并转移
- 减1 条件转移指令
DJNZ Rn,rel
DJNZ direct,rel
目的操作数先自减1
减1后,目的操作数若为0,则按顺序执行下一条,若不为0,则转移
- 调用/返回类
调用指令
返回指令
汇编语言程序设计
汇编语言由指令和伪代码两部分组成
指令:能使CPU执行某种操作,能生成对应的机器代码
指令:标号段:LABEL | 操作码段OPCODE | 操作数段OPRAND | ;注释段COMMENT
伪指令:不能命令CPU执行某种操作,也没有对应的机器代码,用来给汇编程序提供某种信息
伪指令
定义:仅向汇编程序发出的,并仅由汇编程序在汇编过程中识别和执行的一种汇编控制命令,它本身在目标程序中不产生机器码
ORG: 汇编起始伪指令
格式: [标号:]ORG 16位地址
指定下面目标程序的起始地址
END: 汇编结束伪指令
格式: [标号:] END [表达式]
汇编程序的结束标志,附在一个源程序的结尾,一个源程序只能出现一次END指令
EQU8:赋值伪指令
格式:字符名称 EQU 数或者汇编符号
给左边的“字符名称”赋值,必须先赋值再使用,故通常放在源程序的开头
DATA:赋值伪指令
格式:符号名 DATA 表达式
给左边的“字符名”赋值,表达式可以是一个8位或16位的数据或地址,也可以是包含所定义“字符名称”在内的表达式,但不能是汇编符号(如R03等)。没有先定义后使用的权限
有些汇编程序只允许DATA语句定义8位的数据和地址,16位地址需用XDATA伪指令加以定义
DB: 字节数据定义伪指令
格式:[标号:] DB 8位字节数据表
定义字节的内容,汇编程序把DB定义的字节依次存入标号开始的存储单元
DW: 字数据定义伪指令
格式:[标号:] DW 16位字节数据表
定义若干字(双字节0)
高8位—-低地址字节
低8位—-高地址字节
DS: 空间定义伪指令
格式:[标号:] DS 表达式
从标号指定的地址单元开始,保留若干个字节单元作为备用的空间,保留的数量由表达式指定
MCS-51的中断系统
-
中断的定义:指中央处理器CPU正在处理某件事情,外部发生紧急事件请求CPU响应,CPU中断当前任务并处理紧急事件,处理完后返回原中断处继续原来的工作
- 中断请求及响应—中断处理—中断返回
-
中断源(8051中有5个):两个外部中断、两个计数/定时器中断、一个串行口中断
- INT0 —— (上有横杠)外部中断0请求,由P3.2脚输入。通过IT0(TCON.0)来决定是低电平有效还是负跳变有效。一旦输入信号有效,则向CPU申请中断,并且IE0标志硬件置1。
- INT1 —— (上有横杠)外部中断1请求,由P3.3脚输入。通过IT1(TCON.2)来决定是低电平有效还是负跳变有效。一旦输入信号有效,则向CPU申请中断,并且IE1标志硬件置1。
- T0 —— 定时器T0溢出中断请求。当定时器T0产生溢出时,定时器T0中断请求标志TF0置位,请求中断。
- T1 —— 定时器T1溢出中断请求。当定时器T1产生溢出时,定时器T1中断请求标志TF1置位,请求中断。
- RX或TX —— 串行中断请求。当接收或发送完一串帧时,置位内部串行口中断请求标志RI或TI,请求中断。
-
中断的优先级
- 中断开放的情况下,若同时有多个中断请求,应首先响应中断优先级较高的中断
- 中断嵌套:8051五个中断源有两个优先级,可实现二级中断嵌套
-
中断的响应过程
-
保护断点、寻找中断入口、执行中断处理程序、中断返回
-
中断入口地址表
中断源 |
入口地址 |
同级中断优先级 |
INT0 |
0003H |
高 |
T0 |
000BH |
|
INT1 |
0013H |
|
T1 |
001BH |
|
TI/RI |
0023H |
低 |
-
中断请求标志
- 每一个中断请求对应一个中断请求标志位
- 分别在特殊功能寄存器TCON和SCON中相应的位中表示
IT1 、IT0:触发方式控制位,在每个机器周期S5P2都采样引脚P3.3 P3.2
置 0 :低电平出发
置 1 :边沿(下降沿)出发
IN1、IE0:外部中断请求标志
1 :有有效触发时,由硬件自动
0 :当CPU响应中断时
- 中断允许控制寄存器IE
中断的允许或禁止是由片内的中断允许寄存器IE控制
中断的开放和禁止时可编程控制d
IE 的相应位被置“ 0 ”(禁止)或“ 1 ”(开放)
- 中断优先级控制寄存器IP
MCS-51 的中段优先级只定义了 0 低级和 1 高级
一个正在执行的低级中断服务程序,能被高优先级中断请求所中断,但不能被同优先级中断请求所中断
一个正在执行的高级中断服务程序,不能被任何中断请求所中段,直到返回
中断优先级可控,可编程的

同级的几个中断源中同时发生请求时,内部对同级的各中断源的优先级有个规定的查询顺序

- 中断源的各个触发器总结


- MCS-51响应中断的过程
51CPU自动完成:
CPU先在每个机器周期的S5P2期间,对各中断源重复查询,并设置相应的中断标志位。
如果中断响应条件满足,且不存在中断阻断的情况,则CPU就响应中断。
硬件生成长调用指令自动地把断点地址压入堆栈保护,并随之将对应的中断入口地址装入程序计数器PC,使程序转向该入口地址,以执行中断服务程序。
用户必须完成:
在这些入口地址存放一条无条件跳转指令,使程序跳转到用户安排的中断服务程序起始地址上去
- 子程序与中断服务程序的区别
对强迫中断的服务程序具有随机性
要考虑可能在程序的什么指令处发生
要保护什么内容,才能保证返回断点后正常工作
对人为设置的软件中断与子程序调用的区别
返回指令不同:子程序返回用RET,中断服务程序返回用RETI
处理内容不同,中断处理I/O操作
MCS-51的定时器/计数器
-
计算器的容量
-
8051单片机右两个计数器,分别为T0和T1
-
两个计数器分别由两个8位的RAM单元组成,即16位计数器,最大计数量是65536
-
计数与定时
计数器是记录外界发生的事情,定时器则由单片机提供一个非常稳定的计数源
提供给定时器的计数源是由单片机的晶振经过12分频后获得的一个脉冲源
计数器脉冲的间隔与晶振有关,12M的晶振,12M/12 等于1M,计数脉冲的间隔是1微妙
- 计数器初值的计算
计数器计数的个数为C,计数初值为X,M为计数器的最大值
计数初值:X = M – C
方式0时,M = 2^13
方式1时,M = 2^16
方式2、3时,M = 2^8
计数器对单片机震荡频率fosc经12分频后的机器周期进行加1计数
计数周期:Tm = 12/fosc
定时时间 T = (M – X)Tm
定时初值: X = M – T/Tm
- 定时/计数器的方式控制字
单片机中与定时/计数相关的两个特殊功能寄存器:TMOD 和 TCON,地址分别为89H 和 88H
- MCS-51定时/计数器
51系列内部有2个16位的定时/计数器T0、T1
52系列内部有3个16位的定时/计数器T0、T1、T2
功能:定时、计数、串行口的波特率发生器
定时/计数器的可编程特性:
确定其工作方式时定时还是计数
预置定时或计数初值
当定时时间到或计数终止时,要不要发中断请求
如何启动定时或计数器工作
- 定时/计数器(T0和T1)的组成
结构组成: T0 和 T1 都是16位的加1计数器
T0 由两个8位的TH0 (8CH) 和TL0 (8AH) 组成
T1 由两个8位的TH1 (8DH) 和TL0(8BH) 组成
软件设置:
计数初值:对TH1、TL1、TH0、和TL0的初始化编程
将它们设置成不同的工作方式,其计数长度(最大值)和计数方式都可变化
- 定时/计数器的控制方式
特殊功能寄存器:
TMOD (定时器方式控制寄存器)
TCON(定时器控制寄存器)
- 方式寄存器TMOD

- 计数方式的控制逻辑
定时方式:C/T = 0,计数脉冲来自单片机的内部震荡脉冲的12分频
计数方式:C/T = 1,计数器的时钟来自引脚T1
定时/计数的启动受TCON寄存器TR0(TR1)位的控制
GATE 起辅助作用:
GATE = 0,TR0(TR1) = 1 启动计数
GATE = 1,还需/INT0和INT1 = 1 才能启动计数
利用门控信号,可以来测量接在INT1端的正脉冲宽度
- 控制寄存器TCON

- 中断允许控制寄存器IE与定时器中断有关的控制位
中断的允许或禁止是由片内的中断允许寄存器IE控制的
- 8031内部定时/计数工作方式
工作模式 |
功能 |
模式0 |
13位计数器 |
模式1 |
16位计数器 |
模式2 |
可自动装入计数初值的8位重装计数器 |
模式3 |
T0分为两个8位计数器,并借用T1的中断资源,T1只能用于不需要中断的场合,可设置位模式0、1、2 |
- 模式0
13位计数器,由TH的8位,和TL的低5位组成
若要求计数值位1000,计数初值为:2^13 – 1000 = 7192,对应的二进制数为11100000 11000
实际所置的初值应为:1110 0000 0001 1000
- 模式1
16位的定时计数器,由TH的8位和TL的8位组成
工作方式同方式0
- 模式2
可自动重装载的8位计数器
TL为8位计数器,装入初值并启动后按8位加法计数器工作
TH为8位寄存器,计数初值也装入TH
当低8位计数器溢出时,除了可以申请中断,还将TH保存的内容向TL重新装入,以便于TL重新计数
可连续计数,但计数长度有限,只有2^8=256
- 定时器/计数器的编程和应用
编程步骤:使用定时器/计数器首先对其进行初始化
确定工作方式,即根据题目要求给TMOD送方式控制字
计算计数初值/定时初值,并写入TH0、TL0或TH1、TL1中
根据需要,对寄存器IE置初值,开放定时器中断
对TCON寄存器中的TR0或TR1置位,启动定时器/计数器
计数器即按规定的工作模式和初值进行计数或开始定时