单片机是控制器件而不是驱动器件,因为输出电流很小,不足以驱动某些需要大电流的外设。 单片机的GPIO口驱动能力有限,不能直接驱动较大功率的负载。

标准51的P0口(双向口)在作为I/O口使用时,是开漏结构,在实际应用中通常要添加上拉电阻(排阻)。P1、P2、P3都是准双向I/O,内部有上拉电阻,既可作为输入又可以作为输出。

P0 三态门有三个状态,即在其的输出端可以是高电平、低电平,同时还有一种就是高阻状态(或称为禁止状态)

恶补一些基础概念,稍微了解下,原理看不懂跳过...

1.灌电流方式

LED正极接VCC,负极接IO口。IO为高电平是LED两极电平相同,没有电流,LED熄灭;IO为低电平时,电流从VCC流入IO,LED点亮。

但是当你把LED正极接在IO接口,负极接GND时,将IO接口置于高电平,LED会亮,但因为IO接口上拉能力不足而使亮度不理想

2.三极管驱动

三极管全称半导体三极管,也称晶体三极管,是一种控制电流的半导体器件其作用是把微弱的电信号放大成幅度值较大的电信号,也用作无触点开关,在电路中主要起开关和增大电流的作用。

51单片机通过矩阵按键控制数码管(提高GPIO驱动数码管能力的几种方法)(1)

NPN基极高于发射极电压是导通,PNP发射极电压高于基极电压则导通。

NPN高电平时导通,PNP低电平时导通;

51单片机通过矩阵按键控制数码管(提高GPIO驱动数码管能力的几种方法)(2)

以共阳极4位数码管为例,共阴极感觉电路复杂繁琐,直接用专用IC驱动就好

PNP例子代码用自学单片机04里面的代码即可,NPN里面有

注意:唯一的区别【使用PNP三极管,基极为低电平时,才导通】

NPN三极管基极为高电平导通

51单片机通过矩阵按键控制数码管(提高GPIO驱动数码管能力的几种方法)(3)

3.使用专用IC提高驱动能力(74HC245)

74hc245是一种在单片机系统中常用的驱动器,在电路中的作用是:增加io口的驱动能力,比如说51单片机的io口本身的驱动电流较小但所带的负载很大,这种时候就可以使用74hc245来增强io口的驱动能力

共阴极数码管连接方式

51单片机通过矩阵按键控制数码管(提高GPIO驱动数码管能力的几种方法)(4)

共阴极数码管代码稍微改动下

1.显示数字0-9的数组和共阳极不一样不一样

2.位码低电平导通,位码高电平截至没有压降

#include <reg51.h> #include "DelayXms.h" #define led P2 const u8 a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴极数码管0-9 sbit bitcode0 = P1^0; sbit bitcode1 = P1^1; sbit bitcode2 = P1^2; sbit bitcode3 = P1^3; void display(u16 number); void main() { u16 count=0; while(1){ count ; display(count); if(10000 ==count) count = 0; } } void display(u16 number) { led = a[number/1000];//千位 bitcode0 = 0; //位码低电平导通 DelayXms(9); bitcode0 = 1;//位码高电平导通 led = a[(number/100)];//百位 bitcode1 = 0;//位码低电平导通 DelayXms(9); bitcode1 = 1;//位码高电平导通 led = a[(number/10)];//十位 bitcode2 = 0; DelayXms(9); bitcode2 = 1; led = a[number];//个位 bitcode3 = 0; DelayXms(9); bitcode3 = 1; }

,