1. 基本结构与周期
- MCS-51系列单片机属于8位单片机
- 用 8051单片机构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可
- MCS-51单片机由CPU、存储器和I/O三部分组成
- CPU是指:运算器和控制器
“PC = CPU + 3BUS + RAM + I/O”
在执行指令过程中,CPU的控制器所发出的一系列特定的控制信号在时间上的相互关系成为机器周期。MCS-51系列单片机的基本操作周期,也就是执行一个机器周期需要的时钟周期数,通常为12个时钟周期。
2. 寻址方式
-
MCS-51单片机四个I/O口,每个I/O口均有两种读入方式,即:位寻址方式(Bit-addressable)和 字节寻址方式(Byte-addressable),其中P口作一般的I/O口使用时需要外接上拉电阻(Pull-up resistors)驱动MOS输入。
- 访问8031片外数据存储器采用寄存器间接寻址方式
- JNC(Jump if No Carry)是条件跳转指令,当标志寄存器中的进位标志C为0时,程序跳转到指定的相对地址。
- MCS-51 单片机用 12 根地址线可寻址的地址空间是 (000H ~ FFFH) 或 (0 ~ 4KB)。
- 三种寻址方式:
- 立即寻址方式: MOV AX,1290H
- 寄存器寻址方式: 直接:MOV AX,BX 间接:MOV A, @R0
- 存储器寻址方式: MOV AX,[3000H]
- 选D, 将累加器A的内容写入到外部数据存储器中的由DPTR指定的地址是一个读入的过程
- 变址寻址是使用基址(通常是某个寄存器的值)加上偏移量(另一个值)来确定最终的地址,即以A作为变址寄存器,以PC或DPTR作基址寄存器
例如:MOVC A, @A+PC
8051单片机支持的四种寻址方式:
- 寄存器间接寻址方式 使用寄存器来存储目标数据的地址。
- 立即寻址方式 直接在指令中给出数据值。
- 直接寻址方式 通过直接指定目标数据的地址来访问数据。
- 位寻址方式 用于访问单片机内部特定位地址的数据。
- (不包括:变址间接寻址方式)
3. 定时器/计数器
-
8051有两个16位可编程定时/计数器,其中定时作用是指对单片机 时钟脉冲进行计数,而计数器作用是指对单片机 外部脉冲进行计数。
-
用作定时器时,每经过12个机器周期,计数器就自动加 1。 用作串行口的波特率发生
器的定时/计数器是定时器1
- MCS-51单片机内部有两个16位可编程的定时/计数器,简称定时器0(T0)和定时器1(T1),由方式寄存器TMOD、控制寄存器TCON和数据寄存器TH0、TL0,TH1、TL1组成
- 使用定时器T1时,有4种工作模式:
- (1)模式0: 13位定时
- (2)模式1:16位定时
- 答案错了
- (3)模式2:8位自动重装载
- 定时时间 = (256 - 初值) × 机器周期。机器周期 = 1 / (时钟频率 / 12)。
- (注意:是256,不是255)
- (4)模式3:分裂定时
- 例1:定时模式2时,计数初值为6,若振荡频率为6MHz,求定时时间。定时时间 = (256 - 6) × (1 / (6 × 10^6 / 12)) = 250 × 2 × 10^-6 = 500us。
- 例2:在单片机的串行异步通讯方式1中,SMOD=0,定时器工作在方式2,时钟频率是6MHz,若要求波特率是1200波特,则定时器的计数初值是。根据波特率的设定,定时器的计数初值 = 256 - (2 × 时钟频率 / (12 × 波特率))。对于1200波特率,计数初值 = 256 - (2 × 6 × 10^6) / (12 × 1200) = 256 - 1000 = 256 - 3E8H(十六进制)= F18H。最接近的八位数是 F1H。
- 例3:当T0/T1设置成模式2定时器(8位自动重装初值模式)时,若晶振为6MHz频率,则要得到10μs的溢出定时,其初值应为(256 - (10μs / (1 / (6MHz / 12)))) = 256 - (10μs / (1 / 0.5MHz)) = 256 - 5 = 251。
- 例4:T0、T1设置成模式 2 定时器(8 位自动重装初值模式)时,若振荡频率为6MHz,则要得到 10μs的溢出定时,其初值应为 246。
- 定时/计数器工作方式 1 通常支持更大的计数范围,对于MCS-51系列单片机,这意味着它使用16位计数器,因此最大计数值是 (2^{16} - 1 = 65535)
- 可以实现计数初值自动重装的定时/计数器工作方式是方式2
- 对于定时/计数器工作方式 0,最大的计数值是 (2^13 - 1 = 8191)
单片机P1口的引脚,具有定时/计数器外部输入端、外部中断请求等第二功能。
最高的输入计数频率为f时钟/12,当f时钟=12M时,则最高的输入计数频率为1MHz
4. 中断系统
- MCS-51单片机有5个中断源,有2个中断优先级,优先级由软件填写特殊功能寄存器IP加以选择,可以实现二级中断服务程序嵌套 --“5源2优” “我愿爱幼”
- MCS-51单片机有五个中断源,提供两个中断优先级,其中自然优先级最高的是外部中断0 (INT0)。
- MCS-51单片机响应中断时,当前指令执行完毕和中断是开放的是必须条件,而没有同级或高级中断服务不是必须条件
- 外部中断1所对应的中断入口地址为 0013H。城市中不同紧急服务部门(中断服务程序)有不同的地址或联系方式
- 中断服务子程序的返回指令是RET (return)
- 在MCS-51中,必须要由软件实现中断撤除的是串行通讯中断。
- MCS-51单片机响应中断的过程是断点 PC自动压栈,对应中断矢量地址装入PC,程序转到该矢量地址,再转至中断服务程序首地址。(选最长的)
5. 存储器与总线
外部数据存储器(RAM)地址空间:0x0000 到 0xFFFF,共有64KB的地址空间。
外部程序存储器(ROM)地址空间:0x0000 到 0xFFFF,也是64KB的地址空间
MCS-51 系列单片机在存储器结构上,严格将程序存储器(ROM)和数据存储器(RAM)在空间上分开,并使用不同的寻址方式,使用两个不同的地址指针分别是 程序计数器(PC) 和 数据指针(DPTR),存储器这样的结构又称为哈佛结构。
- 8031是无程序存储器供应状态的芯片,因此,其最小应用系统必须在片外扩展EPROM,那么EA必须接低电平以表明选择外部程序存储器; 外部程序存储器的取指控制信号为PSEN。
- CPU 专门提供一个控制信号 (PSEN) 来区分片内 ROM和片外 ROM。当其接 (GND) 单片机从片内 ROM取指令;当其接 (VCC) CPU 从片外 ROM 取指令。
MCS-51系列单片机的地址总线宽度为16位,因此,外部存储器直接寻址范围为64KB。由P0口提供16位的低8位地址,而由P2口提供高8位地址。
☆ 存储单位换算:1KB = 1024B, 1B = 8bit
1K = 1024 = 2的10次方
☆ n根地址线可以选择2^n个存储单元,而mKB存储单元需要x根地址线(m *1024 = 2^x)
MCS-51系列单片机设计有独立的地址空间用于外部程序存储器(即ROM)和外部数据存储器(即RAM),每个空间能够寻址高达64KB,这是因为它们的地址总线宽度为16位,2的16次方等于65536,即64KB。2^16 = n*1024 => n = 64
单片机的片外三总线结构,包括地址总线、数据总线和控制总线
EA接低电平时,CPU 只能从片外 ROM 取指令
MCS-51系列单片机片外程序存储器的地址范围从16位十六进制的0000H地址开始,到FFFFH地址结束,这表示了64KB的地址空间。即用 16根地址线可寻址的地址空间是 (0~64KB)。
MCS-51单片机用12根地址线可寻址的地址空间是000H-FFFH
在8051体系结构中,如果PSEN有效,则P0端口通常用于低8位地址(或数据)传输,而P2端口用于传输高8位地址。因此,当进行外部程序存储器扩展时,低8位地址线通过P0端口连接,高8位地址线通过P2端口连接。
6. 串行通信
波特率 = (字符数 × 每字符位数) / 时间。每个字符由9位组成(假设包括一个起始位、一个停止位和一个奇偶校验位)在这种情况下,每分钟传输25000个字符,时间为一分钟,即60秒。因此,对应的波特率 = (25000 × 9) / 60 = 3750 b/s。
单片机串行通信时,其波特率分为固定和可变两种方式,在波特率可变的方式中,可采用计时器的溢出率来设定和计算波特率。
CPU执行一条 SETB SCON.0 (或SETB SCON.1) 指令后,便启动串行口发送。
外部中断 1 所对应的中断入口地址为 0013H。在串行通讯中,收发双方对波特率的设定 应该是相同 的
- 用串行口扩展并行口时,串行接口的工作方式应选为方式0
- 当MCS-51进行多机通讯时,串行接口的工作方式应选为方式2
- MCS-51系列单片机具有全双工的串行通信接口,它可以进行同步和异步通信。所以说它有一个单工同步通讯接口是错误的
- 通常用于扩展并行 I/O 口的是串行口工作方式1
- 波特率与振荡频率有关
- RI 是串行通讯接收中断标志,当串行口完成接收一个字节时,硬件会设置RI标志。RI标志必须由软件清零。
- MCS-51单片机有一个的异步通讯串行接口,数据传送的方向可实现: 单工方式 、全双工方式 、半双工方式 。
当外部中断 0 发出中断请求后,中断响应的条件是 MOV IE, #81H
7. AD与DA
- 74LS273和74LS244芯片的应用,分别用来作简单输出接口扩展和简单输入接口扩展
- A/D转换器的三个重要指标是转换速度、分辨率和转换精度
- ADC0809是一种采用逐次逼近进行A/D转换的8位接口芯片。
- 当DAC0832 D/A转换器的CS接8031的P1时,程序中0832的地址指针DPTR寄存器应置可以为0832H, FE00H, FEF8H (选以上三种都可以)
- ADC0809 采集的数字式x,参考电压为+5V,则输入转换器的模拟电压是(x/255)*5V。(如果x是16进制,先转化为十进制)注:FFH不是256,是255
8. 进制转换和编码
- 各种进制之间的转换,包括十进制与二进制、十六进制的相互转换
- 带符号数的三种表示方法:原码、反码和补码
- 计算机中使用的编码,如BCD码和ASCII码
9. I/O口
单片机P1口的引脚,具有定时/计数器外部输入端、外部中断请求等第二功能。
- P1为准双向口,若要从P1口读数据,必须先用输出指令置P1为高阻态
- P1口的每一位能驱动4个TTL低电平负载
8031、8051单片机P3口的引脚,具有定时/计数器外部输入端、外部中断请求等第二功能。
10. 特殊功能寄存器
PSW = 18H时,当前工作寄存器是第3组
11. 时钟/晶振
MCS-51单片机晶振频率为12MHz时,其最高输入计数频率为时钟频率的1/12。因此,最高输入计数频率应为12MHz / 12 = 1MHz。
MCS-51单片机的时钟最高频率是12MHz
12.并行接口
8051内部有4个8位的并行口,P口直接作输出口时,必须外接上拉电阻;并行口作输入口时,必须先设置为输入模式,才能读入外设的状态。
13.复位
8051单片机复位后,PC(程序指针) 的值为 0000H。 SP (堆栈指针)的初值为 07H。 P0~P3口的锁存器的状态是高阻。
“sp07”:"收破烂去"
14.汇编指令
(1)基本指令
汇编语言程序设计的基本结构形式,包括顺序结构、分支结构和循环结构
(2)定时器
(3)while(1)
(4)DAC0832
注:CJNE 后面可以以接立即数,但是一定要是16进制
(5)IO口
(6)移数
1、编写一程序实现将1000H单元开始的100个单元的数据转移到2000H开始的单元中。(8分)
(7)查数/次数
(1)从某段内存中找某个数
编程查找内部 RAM 的 32H~41H 单元中是否有 0AAH 这个数据,若有这一数据,则将 50H 单
元的内容置为 0FFH,否则清 50H 单元为 0。(8 分)
(2)某一内存段的个数
1、编程实现查找 20H~4FH 单元中出现 00H的次数,并将査找结果存入 50H 单元的功能。
(8分)
(3)IO口输入值的次数
测试 P1 口输入的 100 个数中 0~9 各数各有多少个,并将结果存储在 30H-39H的地址中。(不考虑提前清理内存,因为不好记,考到就送分给它算了)
(8)组合数
(9)点灯
(1)按键按下:灯亮
(2)闪烁
电路原理:当Vb = Vcc时,三极管会饱和,此时Vc ≈ Ve
所以:P1.7给高电平时,三极管①导通且饱和,Vb② = VCC - 0.7V, 三极管②饱和,Vc = GND,灯就会亮;反之同理,给低电平就会灭
程序如下:
ORG 0000H ; 程序起始地址
MOV TMOD, #01H ; 设置定时器0为模式1 (16位定时器/计数器)
MOV TH0, #0D8H ; 定时器高8位初值
MOV TL0, #F0H ; 定时器低8位初值
MOV IE, #82H ; 允许定时器0中断 (EA = 1, ET0 = 1)
CLR P1.7 ; 初始化P1.7为0 (LED关闭)
SETB TR0 ; 开始定时器0
ORG 0030H ; 定时器0中断服务程序入口地址
TIMER0_ISR:
CPL P1.7 ; 取反P1.7引脚的状态, 切换LED的亮灭状态
RETI ; 返回中断
或者分块写(但是怕改卷老师看得太快没看仔细)
ORG 0000H ; 程序起始地址
SJMP START ; 跳转到初始化部分
ORG 0030H ; 定时器0中断服务程序入口地址
TIMER0_ISR:
CPL P1.7 ; 取反P1.7引脚的状态, 切换LED的亮灭状态
RETI ; 返回中断
START:
MOV TMOD, #01H ; 设置定时器0为模式1 (16位定时器/计数器)
MOV TH0, #0D8H ; 定时器高8位初值
MOV TL0, #F0H ; 定时器低8位初值
MOV IE, #82H ; 允许定时器0中断 (EA = 1, ET0 = 1)
CLR P1.7 ; 初始化P1.7为0 (LED关闭)
SETB TR0 ; 开始定时器0
MAIN_LOOP:
SJMP MAIN_LOOP ; 主程序循环
END
(10)比大小
CLR C;
MOV R1, #30H;
MOV R2, #31H;
MOV A, @R1;
SUBB A, @R2;
JC LABEL;
(11)特定表达式
把A当成一个容器,先把值赋入,然后处理好后,再把值赋出
(1)异或
51里没有XOR,所以只能用定义写(或者有?我也不确定)
(2)平方
MOV A, 30H;
ACALL SQR;
(12)ADC0809
(13)扩展EEPROM
为什么要加地址锁存器?因为8031的IO口不够用,需要引脚即接地址又接数据位置,给了地址后要通过锁存器把EEPROM的地址状态给锁住,然后再给高低电平给数据位
(14)十六进制运算
(15)双机
利用2816A在8031单片机外部扩展4K字节程序存储器,同时利用6264SRAM扩展8K字节数据 存储器,其中2816A为2K字节的EEPROM, 6264是8K字节的RAM,如需要其他器件,请自选