前言
最近项目上使用C8051单片机,我也是首次用这款单片机,所以项目开发过程中还是或多或少的遇到了一些问题,在此做一个总结,方便以后再次使用,避免相同问题重复犯错。
一、涉及的寄存器
PxMDIN:端口输入方式寄存器,有模拟输入和非模拟输入两种方式
PxMDOUT:端口输出方式寄存器,开漏输出和推挽输出两种方式
PxSKIP:端口跳过寄存器
Px:端口寄存器
二、实例
1.配置端口输入
//P0.X(1 3 5 7)为数字输入,开漏输出,普通IO功能
P0MDIN |= (1<<1) | (1<<3) | (1<<5) | (1<<7);
P0MDOUT &= ~((1<<1) | (1<<3) | (1<<5) | (1<<7));
P0SKIP |= (1<<1) | (1<<3) | (1<<5) | (1<<7);
//enable crossbar
XBR1 = 0x40;
2.配置端口输出
//P0.X(2 4 6)为数字输入,推挽输出,普通IO功能
P0MDIN |= ((1<<2) | (1<<4) | (1<<6));
P0MDOUT |= ((1<<2) | (1<<4) | (1<<6));
P0 &= ~((1<<2) | (1<<4) | (1<<6));
//enable crossbar
XBR1 = 0x40;
细节说明
端口的官方文档原理图说明如下:
这里面仍然有好几个细节需要格外注意.
复位状态
复位状态位漏极开漏,弱上拉使能。这一条在什么时候使用呢?假设端口没有明确的电平,项目问题无法确定是硬件问题或软件问题时,我们可以让程序处在复位状态就查看硬件电路的信号状态,缩小问题定位范围(当然,也可以擦除程序)
端口寄存器是配置端口输出高电平还是低电平,复位时为高电平。这里会出现的问题是:假如单片机引脚没有明确的电气特性,那在上电瞬间可能会引起误动作(尤其在端口作输出功能时),因为上电瞬间端口复位输出高电平。
解决办法:
1、硬件电路设计上下拉电阻,给端口明确的初始状态(最稳定的办法)
2、在端口配置时(crossbar配置前,这一点很重要),给Px端口寄存器一个需要的电平值,这样能保证端口引脚误动作
优先权交叉开关译码器
因为C8051F单片机端口采用重映射,每个端口都支持多种功能(不像STM32每个引脚只支持特定的一种、三种或三种功能),所以就会涉及到优先把端口重映射给那种功能的机制,优先权交叉开关译码器就是为了解决这样的问题出现的。
那到底怎么配置呢?这个鬼东西可能是这系列单片机中最绕,说得最晦涩的,官方文件我很想吐槽,很难读懂,网上的很多博客也是说得不清不楚,我自己也说不清楚
来点实际的,官方提供了一个叫Configuration Wizard 2的配置工具(也算是官方对我们的一个补偿),功能很强大,主要是指导我们根据功能配置寄存器,不要误配置,漏配置。
下载地址:
https://www.silabs.com/developers/8-bit-8051-microcontroller-software-studio
根据这个软件,我们可以配置寄存器,也可以逆向思维理解PxSKIP寄存器置0和置1的意义,这个地方你可以自己琢磨,这个工具都给你了,还要我讲得清清楚楚就过分了(如果不想做,也太懒了吧,换行吧,不适合做技术)
弱上拉
有两点需要说明:
1、弱上拉是针对所有管脚的,弱上拉功能使能时,所有引脚都弱上拉了
2、弱上拉的能力是很弱的,所以才“WEAKPUD不影响被配置为推挽方式的端口I/O”.仅仅只是能提供一个高电平状态,这也是端口寄存器未配置时,端口复位会变成高电平的原因。在实际使用中,我未配置端口寄存器时使用弱上拉去驱动一个原边5mA的光耦都驱动不了。
上一篇:SPI串行总线协议
下一篇:8051 的串口通讯及应用
推荐阅读最新更新时间:2024-11-08 10:20
设计资源 培训 开发板 精华推荐
- 具有 SCSI-2 有源端接的 LT1086CM-3.3 低压差稳压器的典型应用
- 24.45W、3.3V、5V、7V、12V、30V交流转直流机顶盒多路输出电源
- EVB-LAN9500A-LC、LAN9500A 高速 USB 2.0 转 10/100 以太网客户评估板加密狗
- LT6654AMPS6-1.25 扩展电源范围电压基准的典型应用
- 基于 MCF5249 器件的 M5249C3UM、M5249C3 参考板是 ColdFire 系列处理器的成员
- MIC69153YML EV,用于工业用 0.5V、1.5V、1.8V、2.5V、3.3V DC 到 DC 单路输出电源的评估板
- 快门线-attiny85-开源用
- Si4734-EVB,Si4734 高性能、76 至 108 MHz 数字无线电调谐器评估板
- 可爱小夜灯
- Type-C转USB