C8051F单片机端口配置


前言

最近项目上使用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的光耦都驱动不了。

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值