共阳极和共阴极接法的对比

文章对比了共阳极和共阴极两种LED接法。共阳极接法允许自定义LED亮度,但耗电较大;共阴极接法耗电小,但亮度不可自由调整。STM32单片机的驱动电流限制影响了接法选择,当LED电流需求超过单片机能力时,共阴极接法可能导致显示问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 共阳极和共阴极的介绍

共阳极接法
如图所示,这个开发板上面的4个LED和4个1K的电阻串联,4个电阻的一端都接到了VDD3.3V上面,公共端为VDD。公共端连接到电源上,简称共阳极如果公共端连接到地,则称为共阴极

那为什么不用共阴极而采用共阳极接法呢?

2. 共阳极和共阴极的对比

LED连接的是STM32的引脚,打开数据手册发现:
5.3.14 I/O port characteristics
GPIO电流
谷歌翻译的结果如下:GPIO(通用输入/输出)可以吸收或释放高达 ±8 mA 的电流,灌电流或拉电流高达 ± 20 mA(具有宽松的 VOL/VOH),但 PC13、PC14 和 PC15 除外,它们可以吸收或拉出高达 ±3 mA 的电流。在输出模式下使用 GPIO PC13 至 PC15 时,速度不应超过 2 MHz,最大负载为 30 pF。

也就是说,STM32的驱动电流最大为20mA,其负载电流有限。其他单片机的负载电流也同样是有限的。如果采用共阴极接法,如果LED的驱动电流大于20mA,STM32的驱动效果就会很差,LED不亮或者很微弱。

2.1 共阳极接法的特点

采用共阳极接法,流过LED的电流由外部的电源VDD和限流电阻共同决定(I=U/R),LED的亮度可以自定义,可以做到很亮的效果,但相比于共阴极接法,共阳极接法的耗电会大一些。

2.2 共阴极接法的特点

采用共阳极接法,流过LED的电流只能由单片机的IO口确定,LED的亮度没法自定义,但相比于共阳极接法,共阴极接法的耗电会小一些。

以下是用51单片机连接阴极8位数码管显示数字时钟的基本代码,仅供参考: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int uchar code table[] = { // 阴极8位数码管显示0~9的编码值 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; uchar hour = 0; // 小时数 uchar minute = 0; // 分钟数 uchar second = 0; // 秒数 void delay(uint t) { // 延时函数 uint i, j; for (i = t; i > 0; i--) for (j = 110; j > 0; j--); } void display(uchar *p) { // 数码管显示函数 uchar i; for (i = 0; i < 8; i++) { // 8位数码管循环显示 P2 = 0xff; // 关闭数码管 P0 = p[i]; // 设置要显示的数字 P2 = ~(1 << i); // 打开对应的数码管 delay(1); // 延时1ms } } void main() { TMOD = 0x01; // 定时器0工作方式1,16位计数器模式 TH0 = 0x4c; // 定时器初值,1ms定时 TL0 = 0x00; EA = 1; // 开启总中断 ET0 = 1; // 开启定时器0中断 TR0 = 1; // 开启定时器0 while (1) { // 主循环 uchar p[8]; p[0] = table[hour / 10]; // 显示小时的十位数字 p[1] = table[hour % 10]; // 显示小时的个位数字 p[2] = 0x40; // 显示冒号 p[3] = table[minute / 10]; // 显示分钟的十位数字 p[4] = table[minute % 10]; // 显示分钟的个位数字 p[5] = 0x40; // 显示冒号 p[6] = table[second / 10]; // 显示秒的十位数字 p[7] = table[second % 10]; // 显示秒的个位数字 display(p); // 数码管显示 } } void timer0() interrupt 1 { // 定时器0中断服务函数 TH0 = 0x4c; TL0 = 0x00; second++; // 秒数加1 if (second == 60) { // 如果秒数达到60 second = 0; // 秒数清零 minute++; // 分钟数加1 if (minute == 60) { // 如果分钟数达到60 minute = 0; // 分钟数清零 hour++; // 小时数加1 if (hour == 24) // 如果小时数达到24 hour = 0; // 小时数清零 } } } ``` 注意:以上代码仅供参考,具体实现方式可能因人而异。同时,为了保证代码的正确性可靠性,建议在编写代码时仔细思考测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值