单片机IO口无法输出高低电平原因分析及解决方案

单片机IO口无法输出高低电平原因分析及解决方案,第1张

  最近在用LPC11C14单片机,该单片机是32cortex-M0系列的,带有片上CAN资源,既可以使用寄存器编程,也可以使用库函数(CMSIS)来编程应用方便。其下载方式有两种:

  SW方式;

  ISP方式;

  对于LQF48封装而言,调试口分别为:

  29脚:SWCLK;

  39脚:SWDIO;

  单片机IO口无法输出高低电平原因分析及解决方案,单片机IO口无法输出高低电平原因分析及解决方案 ,第2张

  这个两个引脚可以复用,在项目设计中到了29脚,将该引脚用作了GPIO输出脚,在用库函数调试的过程中发现时钟无法控制输出高低电平。而用寄存器版本就可以输出高低电平。花了好长时间终于找到了原因。

  下面先看寄存器版本编程时使用的头文件代码:

 单片机IO口无法输出高低电平原因分析及解决方案,单片机IO口无法输出高低电平原因分析及解决方案 ,第3张

  再看CMSIS提供的库函数的头文件:

 单片机IO口无法输出高低电平原因分析及解决方案,单片机IO口无法输出高低电平原因分析及解决方案 ,第4张

  从头文件的对比已经发现了问题,寄存器版本的头文件P0_10的地址是68结尾,而CMSIS中P0_10的地址是70结尾,翻看LPC11C14的数据手册可以发现其地址为:0x40044068,显然CMSIS提供的头文件错了。将CMSIS头文件修改后,P0_10就可以正常使用了。

  如何计算单片机IO口输出的高、低电平为多少伏?

  例如用IO口驱动LED,需要根据IO口输出电压计算串联的电阻

  51单片机IO口输出高电平时,接近VCC,可以按VCC来计算。

  你使用5V供电,IO输出高电压平应该按5V计算。

  LED限流电阻= ( 5V - led工作时端电压 ) / led工作电流

  LED电压一般 2到3V,按平均2.5V,工作电流按10ma

  限流电阻= (5-2.5)V/10ma = 0.25k = 250欧,一般选200-1000欧都可以。

  关于51单片机输入/输出口电压和电流以及加驱动电路的问题

  1、51单片机I/O口为集电极上拉输出方式,高电平输出电流等于上拉电阻的电流,这个电流比较小,低电平输出是内部晶体管吸收的电流,最大可以达到10mA,但是整个端口的总电流不能超过24mA。

  电平低于0.7V就是低电平,高于1.8V就是高电平。在这个之间不确定。

  2、51单片机的I/O口可以理解为一个开路的NPN三极管加一个上拉电阻,驱动PNP三极管最方便,驱动NPN三极管也没有问题,是靠上拉电阻驱动,所以不好。况且51单片机复位时所有I/O口是高电平,就造成NPN三极管导通,这在大多数电路里是不允许的。 复位时,I/O口为高阻的单片机驱动三极管就无所谓了。

  3、51系列单片机引脚电平与TTL电平兼容,也就是输入高电位大于2.0V,低电位小于0.8V,输出高电位大于2.4V,低电位小于0.4V。一般情况下,若电源电压为5V,输出高电位电压也是5V左右,低电位电压接近0V.

  看上面的第三种论述好象还需要区分输入和输出两种情况

  作为输出端口:P0可吸收可输出电流,多大不是很清楚,驱动LED没问题,驱动NPN、PNP三极管都没有问题。

  P1P2P3只能吸收电流,不能输出电流(如第一种说法中提的“这个电流比较小”,而第二种说法里的“驱动NPN三极管也没有问题”就需要实验证明一下了,因为这个电流实在太小了),如特别需要,可外接上拉电阻。

  输出电流指得是输出1时带负载,吸收电流指得是输出0时带负载。 另外不同厂家的51单片机具体参数可能不同,不同型号的也不同。

  我说的指的是ATMEL的AT89S51,至于Intel的MCS51早停产了,估计要找也不到了。

  第三种说法:输入指的是端口做输入端口,比如P0.1做输入,你会给它一个电压,它根据你给的电压是大于2.4V还是小于0.4V来判断你给的是1还是0信号。而输出指的是你将P0.1口作为输出口时:输出1,P0.1引脚的电压接近于这个单片机的电源电压,输出0,P0.1电压接近于0V。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2605597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-09
下一篇 2022-08-09

发表评论

登录后才能评论

评论列表(0条)

保存