*.I/O引脚和I/O端口
P0(P0.7~P0.0) | 1.P0是一个漏极开路型准双向I/O口. |
||||||||||||||||||
P1(P1.7~P1.0) | 1.P1口是带内部上拉电阻的8位双向I/O口, 它是通用I/O口. 2.在EPROM编程和程序验证时, 它接收低8位地址. |
||||||||||||||||||
P2(P2.7~P2.0) | 1.P2是带内部上拉电阻的8位双向I/O口. 2.在访问外存时, 它输出8位高地址. 3.在对EPROM编程时和程序验证时, 它接收8位高地址. |
||||||||||||||||||
P3(P3.7~P3.0) | 1.P3是带内部上拉电阻的8位双向I/O口, 它是双功能I/O口. 2.除基本输入/输出功能外, 每个引脚还有特殊功能.
|
*.复位寄存器状态
寄存器 | 内容 | 寄存器 | 内容 |
---|---|---|---|
PC | 0000H | TMOD | 00H |
A | 00H | TCON | 00H |
B | 00H | TH0 | 00H |
PSW | 00H | TL0 | 00H |
SP | 07H | TH1 | 00H |
DPTR | 0000H | TL1 | 00H |
P0~P3 | 0FFH | SCON | 00H |
IP | XXX00000B | SBUF | XX |
IE | 0XX00000B | PCON | 00H |
*.特殊功能寄存器
特殊功能寄存器 | 功能名称 | 地址 | 复位状态 |
---|---|---|---|
B | 通用寄存器 | F0H | 00H |
A | 累加器 | E0H | 00H |
PSW | 程序状态字 | D0H | 00H |
IP | 中断优先级控制 | B8H | XXX0000B |
P3 | P3端口 | B0H | 0FFH |
IE | 中断使能控制 | A8H | 0XX00000B |
P2 | P2端口 | A0H | 0FFH |
SBUF | 串行发送/接收缓冲器 | 99H | XXH |
SCON | 串行口控制 | 98H | 00H |
P1 | P1端口 | 90H | 0FFH |
TH1 | T1定时器高8位 | 8DH | 00H |
TH0 | T0定时器高8位 | 8CH | 00H |
TL1 | T1定时器低8位 | 8BH | 00H |
TL0 | T0定时器低8位 | 8AH | 00H |
TMOD | 定时器/计数器方式控制 | 89H | 00H |
TCON | 定时器控制 | 88H | 00H |
PCON | 电源控制 | 87H | 00H |
DPH | 地址寄存器高8位 | 83H | 00H |
DPL | 地址寄存器低8位 | 82H | 00H |
SP | 堆栈指针 | 81H | 07H |
P0 | P0端口 | 80H | 0FFH |
*.可位寻址的特殊功能寄存器
寄存器名 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|
电源控制寄存器 PCON | SMOD | GF1 | GF0 | PD | IDL | |||
波特率倍乘位 | 用户标志 | 用户标志 | 掉电方式位 | 待机方式位 | ||||
定时器方式控制寄存器 TMOD | GATE | C/-T | M1 | M0 | GATE | C/-T | M1 | M0 |
T1门控位 | T1定时器/计数器选择 | T1工作方式选择 | T0门控位 | T0定时器/计数器选择 | T0工作方式选择 | |||
程序状态字 PSW | CY | AC | F0 | RS1 | RS0 | OV | P | |
进位标志 | 辅助进位标志 | 用户标志 | 工作寄存器组选择标志 | 溢出标志 | 奇偶标志 | |||
中断优先级控制器 IP | PS | PT1 | PX1 | PT0 | PX0 | |||
串口优先级设置 | T1优先级设置 | /INT1优先级设置 | T0优先级设置 | /INT0优先级设置 | ||||
中断使能寄存器 IE | EA | ES | ET1 | ETX | ET0 | EX0 | ||
CPU总中断使能 | 串口中断使能 | T1中断使能 | /INT1中断使能 | T0中断使能 | /INT0中断使能 | |||
串口控制寄存器 SCON | SM0 | SM1 | SM2 | REN | TB8 | RB8 | TI | RI |
串口工作方式选择位 | 允许接收 | 发送数据第9位 | 接收数据第9位 | 发送完成中断标志 | 接收数据中断标志 | |||
定时器控制寄存器 TCON | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
T1溢出标志 | T1运行控制位 | T0溢出位 | T0运行控制位 | /INT1中断标志 | /INT1触发方式 | /INT0中断标志 | /INT0触发方式 |
*.中断系统
中断源 | 入口地址 | 长度 | 中断允许 | 中断标志 | 中断优先级位 | 触发方式 | 中断标志清零方式 | 同级内部优先级 |
---|---|---|---|---|---|---|---|---|
/INT0 | 0003H | 8 | EX0(IE.0) | IE0(TCON.1) | PX0(IP.0) | IT0(TCON.0) 0:电平触发 1:下降沿触发 |
电平触发时需软件清零 | 最高 |
T0 | 000BH | 8 | ET0(IE.1) | TF0(TCON.5) | PT0(IP.1) | 无需软件清零 | ||
/INT1 | 0013H | 8 | EX1(IE.2) | IE1(TCON.3) | PX1(IP.2) | IT1(TCON.2) | 电平触发时需软件清零 | |
T1 | 001BH | 8 | ET1(IE.3) | TF1(TCON.7) | PT1(IP.3) | 无需软件清零 | ||
串口 | 0023H | 8 | ES(IE.4) | RI(SCON.0) |
PS(IP.4) | 需软件清零 | 最低 |
*.定时器/计数器工作方式
M1 | M0 | 工作方式 | 功能 |
---|---|---|---|
0 | 0 | 方式0 | 13位计数器 |
0 | 1 | 方式1 | 16位计数器 |
1 | 0 | 方式2 | 可自动重新装入的8位计数器 |
1 | 1 | 方式3 | T0分为两个独立的8位计数器,T1停止 |
*.串口工作方式
SM0 | SM1 | 方式 | 说明 |
---|---|---|---|
0 | 0 | 0 | 位移寄存器方式(用于I/O扩展) |
0 | 1 | 1 | 8位UART,波特率可变(T1溢出率/n) |
1 | 0 | 2 | 9位UART,波特率为fosc/64或fosc/32 |
1 | 1 | 3 | 9位UART,波特率可变(TI溢出率/n) |
注:表中n为32/2SMOD,SMOD为PCON的第7位波特率倍乘位
*.定时器/计数器初值的计算
环境:
晶振:12.0000MHz
定时器:T0
溢出条件:(TH0<<8|TL0)由0FFFFH变为0000H(0FFFFH+1 产生的进位置位TF0产生中断)
假设延时时间为50ms,则:
频率:ft = 12.0000MHz
时钟周期:Tt = 1/ft (SI)
机器周期:Tm = 12*Tt = 12*1/(12*10^6),(SI) = 12*1/12 (us) = 1 (us)(前面的12是因为51是12分频,即12个时钟周期为1个机器周期)
所以:
50ms == 50000us == 50000个机器周期
由 0FFFFH 到 10000H 为 1个机器周期,则:
初值:start = 0FFFFH + 1H - 50000D = 65536D - 50000D = 15536D = 3CB0H
于是:TH0 = 0x3C,TL0 = 0xB0
若晶振频率为:ft = 11.0592MHz
同样:机器周期Tm = 12*Tt = 12*1/(11.0592*10^6),(SI) = 12/11.0592 (us) = 1.085069(us)
所以:
50ms == 50000us = 50000/1.085069 = 46080D 个机器周期
初值:start = 0FFFFH + 1H - 46080D = 65536D - 46080D = 19456D = 4C00H
于是:TH0 = 0x4C, TL0 = 0x00
*.串口通信中定时器工作方式下波特率初值计算以及晶振的选择
当串口工作方式为1(8位UART),T1为定时器时:
k=13:定时器工作方式0; k=16, 工作方式1, k=8, 工作方式2, ...
T1溢出率 = Fosc/(12*(2k-初值)),即每秒溢出次数,Fosc:晶振频率,*12:转换为时钟周期
所以 波特率 = T1溢出率/(32/2SMOD) = 2SMOD */32*T1溢出率 = 2SMOD * Fosc /(32*12*(2k-初值))
常用波特率:9600bps,192000bps,4800bps, ...
所以当波特率=9600bps, SMOD=0, k=8时:
波特率 = 2SMOD * Fosc /(32*12*(2k-初值)) = Fosc/(384*(256-初值)) = 9600
当晶振为11.0592Mhz时:9600=11.0592*106/(384(256-初值)),求得:初值=253D = 0FDH,此时恰为整数(即TH1=TL1 = 0xFD)
当晶振为12.0000MHz时:初值为252.744791, 不为整数
这就是为什么在进行串行通信时要选择11.0592MHz晶振, 不选择12MHz晶振的原因.
*.由定时器1产生的常用波特率
波特率 bps | 晶振频率 Fosc | 波特率倍乘 SMOD |
定时器1 | ||
---|---|---|---|---|---|
C/-T | 模式 | 重装载值 | |||
62500 | 12 | 1 | 0 | 2 | 0FFH |
19200 | 11.0592 | 1 | 0 | 2 | 0FDH |
9600 | 11.0592 | 0 | 0 | 2 | 0FDH |
4800 | 11.0592 | 0 | 0 | 2 | 0FAH |
2400 | 11.0592 | 0 | 0 | 2 | 0F4H |
1200 | 11.0592 | 0 | 0 | 2 | 0E8H |
137500 | 11.0592 | 0 | 0 | 2 | 1DH |
110 | 6 | 0 | 0 | 2 | 72H |
110 | 12 | 0 | 0 | 1 | 0FEEBH |
---pre---