8051单片机学习笔记/概要/总结/备忘
扫描二维码
随时随地手机看文章
*.I/O引脚和I/O端口
P0(P0.7~P0.0)1.P0是一个漏极开路型准双向I/O口.
2.在访问外存时, 它是数据总线和地址总线的低8位分时复用接口.
3.在EPROM编程时, 它接收指令字节; 在验证程序时, 输出指令字节, 并要求外接上拉电阻.
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.除基本输入/输出功能外, 每个引脚还有特殊功能.
I/O口特殊/专用功能P3.0RXD:串行数据接收P3.1TXD:串行数据发送P3.2/INT0:外部中断0输入请求P3.3/INT1:外部中断1请求输入P3.4T0:定时器0外部计数脉冲输入P3.5T1:定时器1外部计数脉冲输入P3.6/WR:外部数据存储器写信号P3.7/RD:外部数据存储器读信号
*.复位寄存器状态
*.特殊功能寄存器
*.可位寻址的特殊功能寄存器
GF1GF0PDIDL波特率倍乘位
用户标志用户标志掉电方式位待机方式位定时器方式控制寄存器 TMODGATEC/-TM1M0GATEC/-TM1M0T1门控位T1定时器/计数器选择T1工作方式选择T0门控位T0定时器/计数器选择T0工作方式选择程序状态字 PSWCYACF0RS1RS0OV
P进位标志辅助进位标志用户标志工作寄存器组选择标志溢出标志
奇偶标志中断优先级控制器 IP
PSPT1PX1PT0PX0
串口优先级设置T1优先级设置/INT1优先级设置T0优先级设置/INT0优先级设置中断使能寄存器 IEEA
ESET1ETXET0EX0CPU总中断使能
串口中断使能T1中断使能/INT1中断使能T0中断使能/INT0中断使能串口控制寄存器 SCONSM0SM1SM2RENTB8RB8TIRI串口工作方式选择位允许接收发送数据第9位接收数据第9位发送完成中断标志接收数据中断标志定时器控制寄存器 TCONTF1TR1TF0TR0IE1IT1IE0IT0T1溢出标志T1运行控制位T0溢出位T0运行控制位/INT1中断标志/INT1触发方式/INT0中断标志/INT0触发方式
*.中断系统
0:电平触发
1:下降沿触发
电平触发时需软件清零最高T0000BH8ET0(IE.1)TF0(TCON.5)PT0(IP.1)
无需软件清零
/INT10013H8EX1(IE.2)IE1(TCON.3)PX1(IP.2)IT1(TCON.2)电平触发时需软件清零
T1001BH8ET1(IE.3)TF1(TCON.7)PT1(IP.3)
无需软件清零
串口0023H8ES(IE.4)
RI(SCON.0)
TI(SCON.1)
需软件清零最低
*.定时器/计数器工作方式
*.串口工作方式
注:表中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产生的常用波特率
SMOD