振荡周期/时钟周期:
Tc=晶振频率fosc(或外加频率)的倒数
状态周期:Ts=2个时钟周期(Tc)(很少用到此概念)
机器周期:Tm=6个状态周期(Ts)=12个振荡周期(Tc)
指令周期: Ti:执行一条指令所需的机器周期(Tm)数
牢牢记住: 振荡周期 = 晶振频率fosc的倒数;
1个机器周期 = 12个振荡周期
1个指令周期 = 1、2、4个机器周期
89C51单片机存储器配置
片内RAM 128字节(00H—7FH);
片内RAM前32个单元是工作寄存器区(00H—1FH)
片内RAM有128个可按位寻址的位,占16个单元。
位地址编号为:00H—7FH,分布在20H—2FH单元
片内21个特殊功能寄存器(SFR)中:地址号能被8整除的 SFR中的各位也可按位寻址(P.33-34)
可寻址片外RAM 64K字节 (0000H—FFFFH)
可寻址片外ROM 64K字节 (0000H—FFFFH)
片内 Flash ROM 4K字节 (000H—FFFH)
存储器配置(片内RAM)
片内RAM 128字节(00H—7FH)书上29页
可寻址片外RAM 64K字节(0000H—FFFFH);
可寻址片外ROM 64K字节(0000H—FFFFH);
片内 Flash ROM 4K字节( 000H— FFFH);
工作寄存器区CPU通过修改PSW中的RS1和RS0两位的状态,就能任选一个工作寄存器区。
片内RAM中有128个可按位寻址的位。 占16个单元
位地址:00H—7FH
分布在:20H—2FH单元
89C51片内RAM 128字节(00H—7FH)
89C52片内RAM 256字节(00H—0FFH)
程序存贮器ROM(书上28页)
程序存贮器空间为64k字节
堆栈:(由堆栈指针SP管理,进栈,SP+1,,出栈,SP-1)
在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循先进后出和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。堆栈区可以安排在 RAM区任意位置,一般不安排在工作寄存器区和可按位寻址的RAM区,通常放在RAM区的靠后的位置。
功用:
1)子程序调用和中断服务时CPU自动将当前PC
值压栈保存,返回时自动将PC值弹栈。
2)保护现场/恢复现场
3)数据传输
程序计数器PC
PC 不是一个特殊功能寄存器SFR,但其作 用又十分重要和特殊!!!
特点:
它是16位的按机器周期自动增1计数器。
总指向下一条指令所在首地址(当前PC值)
一切分支/跳转/调用/中断/复位 等操作的本质就是:改变 PC 值
特殊功能寄存器(书上31页~33页)
程序状态字PSW 书本32页
OV (PSW.2)溢出标志位。
OV=1时特指累加器在进行带符号数(-128—+127)运算时出错(超出范围);OV=0时未出错。
中断(书上40页)
定时器控制寄存器TCON (88H)其中低4位管外部中断
TF0/TF1:定时器溢出中断申请标志位:
=0:定时器未溢出;
=1:定时器溢出申请中断,进中断后自动清零。
TR0/TR1:定时器运行启停控制位:
=0:定时器停止运行;
=1:定时器启动运行。
IE0/IE1:外部中断申请标志位:
=0:没有外部中断申请;
=1:有外部中断申请。
IT0/IT1:外部中断请求的触发方式选择位:
=0:在INT0/INT1端申请中断的信号低电平有效;
=1:在INT0/INT1端申请中断的信号负跳变有效.
PC与SFR复位状态表
中断矢量: MCS-51单片机的 5 个中断源分别对应有各自的中断服务程序入口地址——中断矢量
中断优先级控制寄存器IP (0B8H)
PX0/PX1:INT0/1优先级控制位:
=0 时属低优先级; =1 时属高优先级。
PT0/PT1/PT2:T0/1/2定时器中断优先级控制位:
=0 时属低优先级; =1 时属高优先级。
PS1:串行口中断优先级控制位:
=0 时属低优先级; =1 时属高优先级。
在中断源提出了中断申请且CPU此前已经允许中断的前提下,还须满足以下三个条件:
没有同级的中断或更高级别的中断正在处理;
正在执行的指令必须执行完最后 1个机器周期;
若正在执行RETI,或正在访问IE或IP寄存器,须执行完上述指令和下一条指令以后方能响应中断。
中断允许寄存器IE (0A8H)
EX0/EX1,ET1/ET0,ES 位:
分别是INT0/1,Timer0/1,串行口的中断允
许控制位:
=0 时禁止中断; =1 时允许中断。
ET2:T2中断允许控制位(仅52子系列有)
=0 时禁止中断; =1 时允许中断。
EA:总的中断允许控制位(总开关):
=0 时禁止全部中断;=1 时允许中断。
中断应用前后要做的几项工作
中断前
开中断允许:必须
选择优先级:根据需要选择,可有/可无
设置控制位:INTx—触发方式(ITx)
Tx—TCON,TMOD,TRx,初值……
RI/TI—SCON,REN,RB8,TB8,……
中断后
进入中断服务后:保护现场,关中断,……
退出中断服务前:恢复现场,开中断,设Tx的初
值,清TI/RI,……
中断服务程序的最后一条指令必是 RETI
汇编程序的常用指令
伪指令:
ORG addr16——规定编译后的机器代码存放的起始位置。
$ ——“当前PC值”也叫位置计数器。代表正在执行的指令所在位置
符号名称 BIT 位地址
将位地址的值赋予符号名称。程序中凡出现该符号名称就代表该位地址。
例:CON BIT 20H.0
CPL CON
常用指令:
寻址方式,书本49页
相对寻址
当前PC值加上指令中规定的偏移量 rel,构成实际的操作数地址
操作:跳转到的目的地址 = 当前16位PC值 + rel
注意:
1)“当前PC值”指程序中下一条指令所在的首地址,
是一个16位数;
2)符号“rel”表示“偏移量”,是一个带符号的单字节数,范围是:-128—+127(80H—7FH)
位寻址
指令中直接给出了操作数所在的位地址或名称。
例: CLR P1.0 ;(P1.0) ← 0
SETB ACC.7 ;(ACC.7)← 1
CPL C ;( C )← NOT( C )
注意:
1)位地址里的数据只可能是一个 0 或 1
2)有的位地址十分明确,如 P1.0, ACC.7等,
有的位地址则“不太明确”,如:
[MOV A,17H ; (A)←(17H),17H是字节地址]
MOV ACC.0,17H ;(ACC.0)←(17H),这里ACC.0
是位地址所以该指令中的17H是22H单元的第7位
内部存储器间传送: (MOV——16条)见书本51页
外部数据存储器与累加器间传送:(MOVX——4条)见书本55页
程序存储器向累加器传送:(MOVC——2条)查表指令,见书本55页
数据交换:(XCH,XCHD,SWAP——5条),书上54页,62页
堆栈操作:(PUSH,POP——2条)书上54页
*搞清楚数据传送是片内还是片外RAM
加法运算: (ADD——4条) 书本56页开始
带进位加法运算: (ADDC——4条)
带借位减法运算: (SUBB——4条)
加1/减1操作: (INC,DEC——9条)
单字节乘/除法运算: (MUL,DIV——2条)
十进制调整: (DA A——1条)
指令 “DA A” 完成的操作:
若(A)3~0>9(低4位)或(AC)=1则(A)3~0¬(A)3~0+6;
若(A)7~4>9(高4位)或(CY)=1则(A)7~4¬(A)7~4+6;
逻辑与运算: (ANL——6条)书上61页开始
逻辑或运算: (ORL——6条)
逻辑异或运算: (XRL——6条)
累加器清零/取反: (CLR,CPL——2条)
累加器移位操作: (RL,RLC,RR,RRC—4条)
无条件转移:(LJMP,AJMP,SJMP,JMP——4条)书上67页开始
条件转移(判断跳转): (JZ,JNZ,CJNE,DJNZ——8条)
子程序调用及返回:(LCALL,ACALL,RET,RETI——4条)
LCALL addr16 子程序长调用指令 ——可在64K范围内调用子程序(入栈)
ACALL addr11 子程序绝对调用指令 —可在指令所在的2K范围内调用子程序(入栈)
RET 子程序返回指令 —子程序结束并返回调用的下一条指令(出栈)
RETI 中断服务子程序返回指令 中断结束/返回被打断处的下一条指令(出栈清除中断状态)
位传送: (MOV——2条)书上65页开始
位清零/置位: (CLR,SETB——4条)
位逻辑与/或/非运算:(ANL,ORL,CPL——6条)
空操作 NOP “耗时”一个机器周期。 do nothing!
并口、中断、定时与串口
1. 单片机的I/O引脚结构(并行口)书上91页
l P1.0—P1.7: 准双向I/O口(内置了上拉电阻) 输出时一切照常,仅在作输入口用时要先对其写“1”。
l P0.0—P0.7: 双向I/O (内置场效应管上拉)寻址外部程序存储器时分时作为双向8位数据口和输出低8位地址复用口;(可浮空)不接外部程序存储器时可作为8位准双向I/O口使用。
l P2.0—P2.7: 双向I/O (内置了上拉电阻) 寻址外部程序存储器时输出高8位地址;不接外部程序存储器时可作为8位准双向I/O口使用。
l P3.0—P3.7: 双功能口(内置了上拉电阻)它具有特定的第二功能(特殊输入/输出线)。在不使用它的第二功能时它就是普通的通用准双向I/O口。
注意:在不外扩ROM/RAM时,P0~P3均可作通用I/O口使用,而且都是准双向I/O口(例如:AT89C51)!
2. 单片机的定时/计数器(89c51有2个,52有3个timer)
TIMER的作用:定时操作:定时采样,定时扫描,定时中断
测量外部信号:累加统计,测量周期等
定时输出:PWM等
监视系统正常工作与否
定时器:对片内机器时钟(周期方波)进行计数
计数器:对Tx引脚输入的负脉冲进行计数
与Timer工作有关的特殊功能寄存器:TCON 、TMOD、THx 和 TLx
实质是计数器,脉冲每一次下降沿,计数寄存器数值将加1。计数的脉冲如果来源于单片机内部的晶振,由于其周期极为准确,这时称为定时器。计数的脉冲如果来源于单片机外部的引脚,由于其周期一般不确定,可表示事件发生,这时称为计数器。
定时器控制寄存器TCON (88H) 见前面
定时器方式寄存器TMOD (89H)
M1,M0:工作方式定义位 ( 定义4 种方式 ):
0 0:13位 Timer——用它无益,不要记它!
0 1:16位 Timer——经常用到
1 0:可自动重装的 8位 Timer——经常用到
1 1:T0 分为2个8位 Timer;T1 此时不工作 ——几乎无用
C/T :计数器/定时器选择位
= 1 外部事件计数器。对Tx引脚的负脉冲计数;
= 0 片内时钟定时器。对机器周期脉冲计数定时
GATE门控位: Timer可由软件与硬件两者控制
GATE = 0 ——普通用法
Timer的启/停由软件对TRx位写“1”/“0”控制
GATE = 1 ——门控用法
Timer的启/停由软件对TRx位写“1”/“0”
和在INTx引脚上出现的信号的高/低共同控制
(INTx引脚高电平允许定时/计数)
定时器结构与工作方式
工作方式0:见书上108页
工作方式1:——16位的定时/计数器,最大计数脉冲个数:65536(216)图片见书上110页
THx/TLx赋初值:THx赋高8位,TLx赋低8位
TMOD选方式: 写“M1,M0”=01 b 选方式1
若不用门控位,直接用软件写TRx控制启/停;若使用门控位,先置位TRx,然后由INTx端的高/低电平来控制其启/停
若要允许中断,还须先置位ETx、EA等中断允许控制位,并编写中断服务程序
若不用中断,可查询“计数溢出标志TFx”的方式工作,但溢出标志TFx须软件清0
定时器的计数单元每个机器周期自动加1直到溢出(0)
T=(12/fosc)*(2^16-a)us(a为定时初值,T为定时时间)
工作方式2:——8 位自动重装的定时/计数器
用于需要重复定时和计数的场合。最大计数值:256 (28)
TMOD寄存器选方式:写“M1,M0” = 10 b 选中方式2
THx/TLx赋相同初值。在TLx计数达到0FFH 再加“1”时,TL0将溢出, “TFx”置1去申请中断,同时THx中的值自动重装(Copy)进TLx。
其他用法与各种方式1完全相同
定时器的计数单元每个机器周期自动加1直到溢出(0)
T=(12/fosc)*(2^8-a)us (最大计数值:256)
Timer工作方式 3 见书本113页
T0: 组织成TL0和TH0两个8位定时/计数器
T1: 不再是定时/计数器了。T1 的TR1和TF1出借给TH0当控制位使用,剩下的TH1/TL1寄存器只能当作普通寄存器用。
串行通信与并行通讯
并行通讯:数据的各位同时传送。传输线的根数与数据位数相等。
串行通讯:数据逐位顺序传送。传输线仅需1-2根。
串行通信的基本特征是数据逐位顺序进行传送;
常见的有:通用异步收发器(UART)——本课程介绍的串口
通用串行总线(USB)
I2C总线
CAN总线
SPI总线
RS-485,RS-232C,RS422A标准……等等
全双工串行接口(UART)
全双工:(串行通信)收/发可同时进行
半双工:(串行通信)收/发不可同时进行
单工:数据单向传送
异步串行通信:以字符为单位进行传送。开头有一个起始位0,结尾有一个停止位1。同步串行通信:以数据块为单位进行传送
波特率(bps.):每秒钟传输的数据位数。
串行口的结构
两个同名的接收/发送缓冲寄存器SBUF(99H)
指令 MOV SBUF,A 启动一次数据发送,可向SBUF再发送下一个数
指令 MOV A,SBUF 完成一次数据接收,SBUF可再接收下一个数
接收/发送数据,无论是否采用中断方式工作,每接收/发送一个数据都必须用指令对RI/TI 清0,以备下一次收/发。
串行口相关的SFR(SCON,PCON)
串行口控制寄存器SCON(98H) 书本133页
SM0,SM1:串行口4种工作方式的选择位。
0 0 方式0:8位移位寄存器I/O,波特率固定为 fosc/12
0 1 方式1:8位UART(1+8+1位),波特率可变,按公式计算(137页)
1 0 方式2:9位UART(1+8+1+1位),波特率固定=fosc x1/32(SMOD为1)或1/64(SMOD为0)
1 1 方式3:9位UART(1+8+1+1位), 波特率可变,按公式计算(137页)
SM2:串行口多机通信控制位(作为方式2、方式3的附加控制位)
RI,TI:串行口收/发数据申请中断标志位
=1 申请中断; =0 不申请中断
RB8:在方式2、3中,是收到的第9位数据。在多机通信中,用作区别地址帧/数据帧的标志。(奇偶校验)。对于方式1,如SM2=0,RB8是接收到的停止位。方式0不使用RB8。
TB8:方式2、3中,是要发送的第9位数据。多机通信中,TB8=0 表示发送的是数据;TB8=1 表示发送的是地址。(奇偶校验),需要时由软件置“1”或清“0”
REN:串行口接收允许控制位
= 1 表示允许接收; = 0 禁止接收。
电源控制寄存器 PCON(97H)——特殊功能寄存器PCON不能按位寻址
SMOD:在串行口工作方式 1、2、3 中,是波特率加倍位
=1 时,波特率加倍
=0 时,波特率不加倍。
(在PCON中只有这一个位与串口有关)
GF1,GF0:用户可自行定义使用的通用标志位
PD:掉电方式控制位=0:常规工作方式。
=1:进入掉电方式
IDL:待机方式(空闲方式)控制位=0:常规工作方式。
=1:进入待机方式
串行口工作方式 0
工作方式0:8位移位寄存器I/O方式
发送:SBUF中的串行数据由RxD逐位移出;
TxD输出移位时钟,波特率=fosc/12;
每送出8位数据 TI就自动置1;需要用软件清零 TI。
接收:串行数据由RxD逐位移入SBUF中;
TxD输出移位时钟,波特率=fosc/12;
每接收 8位数据RI就自动置1;需要用软件清零 RI。
经常配合“串入并出”“并入串出”移位寄存器(如74LS164)一起使用扩展接口。
*共阳LED数码管公共端(字位) 接高电平,笔划(字段) 置为低电平就被点亮了
工作方式1:8位UART(1+8+1位)波特率可变(波特率越慢,越不容易出错)
常用于串行通讯。除发/收8位数据外,还在D0位前有一个起始位“0”;在D7位后有一个停止位“1”。
方式1工作时:发送端自动添加一个起始位和一个停止位;
接收端自动去掉一个起始位和一个停止位。
波特率可变——用定时器T1作波特率发生器:
公式:波特率 =(2SMOD/32)´T1的溢出率
溢出率:T1溢出的频繁程度。即:T1溢出一次所需时间的倒数。
波特率 =其中:X 是定时器初值
RxD引脚为接收端,TxD引脚为发送端,由波特率发生器定时器T1控制发送速度
串行口的初始化包括:对SCON选工作方式对PCON设波特率加倍位“SMOD”(缺省值=0)如果是接收数据,仍要先置“1”REN位。
T1作波特率发生器时初始化包括:选定时器工作方式2(TMOD选8位自动重装);将计算(或查表)出的初值X赋给TH1,TL1;启动T1 (SETB TR1);对T1不要开中断 !!
工作方式2:9位UART(1+8+1+1位)两种波特率
通常附加的一位 (TB8/RB8)用于“奇偶校验”。
方式2的波特率 = fosc ´ 2SMOD/64即: fosc ´1/32 或 fosc ´1/64 两种
工作方式3:当SM0,SM1为11时,串行口工作于方式3,9位UART(1+8+1+1位) 波特率可变
串口方式3和方式2唯一的区别是波特率机制不同。
波特率=(2SMOD/32)´T1的溢出率 见书本137页
多机通信系统原理 书上139页
名 存储空间位置 长度 数据范围
data 直接寻址片内RAM 8位 0~255
bdata 可位寻址片内RAM 1位 0/1
idata 间接寻址片内RAM 8位 0~255
pdata 片外页RAM 8位 0~255
xdata 片外RAM 16位 0~65535
code 程序ROM 16位 0~65535
LED数码管动态、静态扫描显示书上180页开始
键盘:独立连接键盘: 每键相互独立,各自与一条I/O线相连,CPU可直接读取该I/O线的高/低电平状态。
特点:占I/O口线多,但判键速度快,多用于设置控制键、功能键。适用于键数少的场合。
矩阵连接键盘: 键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。
特点:键多时占用I/O口线少,但判键速度慢,多用于设置数字键。适用于键数多的场合。
逐行扫描法书上184页
线反转法:由行线输出全“0”,读入列线,判有无键按下。
若有键按下,再将读入的列线值由列线输出,读进行线的值。
第一步读进的列线值与第二步读进的行线值相加,从而得到代表此键的唯一的特征值。
键盘去抖动