蓝桥杯51单片机-共阳极数码管的显示

基本功能:8位数码管每位依次显示0-9,然后8位数码管同时显示0-F。

我们先来了解一下数码管,分为共阳极和共阴极数码管

  1. 共阴极:公共端为阴极,加阳极数码管点亮。即当真值为1时,数码管点亮;真值为0时,数码管不亮。
  2. 共阳极:公共端为阳极,加阴极数码管点亮。即当真值为0时,数码管点亮;真值为1时,数码管不亮。

共阳不带小数点0-F段码为:{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

共阳带小数点0-F段码为:{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0e};

共阴不带小数点0-F段码为:{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

共阴带小数点0-F段码为:{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};

在CT107D单片机平台上,数码管为共阳极数码管。我们要点亮数码管,分为两步,一个是输入编码(段选),一个是选择公共端(位选),即位置

那我们根据原理图可知,Y7与段选有关,Y6与位选有关

unsigned char code SMG_duanma[18]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

void InitHC138(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}

void ShowSMG_Bit(unsigned char dat, unsigned pos)
{
	InitHC138(6);			//数码管的位置
	P0 = 0x01 << pos;
	InitHC138(7);			//数码管的内容
	P0 = dat;
}

通过以上函数,即可自由地在数码管上显示,例如

#include "reg52.h"

unsigned char code SMG_duanma[18]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

			 
void InitHC138(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}

void ShowSMG_Bit(unsigned char dat, unsigned pos)
{
	InitHC138(6);			//数码管的位置
	P0 = 0x01 << pos;
	InitHC138(7);			//数码管的内容
	P0 = dat;
}

void main()
{
	ShowSMG_Bit(SMG_duanma[5],6);
	while(1);
}

可以在数码管的第7个位置显示5

有了以上基础,我们就能很容易的实现基本功能

#include "reg52.h"

unsigned char code SMG_duanma[18]=
		{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
     0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,
     0xbf,0x7f};

		 
void Delay(unsigned int t)
{
	while(t--);
	while(t--);
}
			 
void InitHC138(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2 = (P2 & 0x1f) | 0x80;
		break;
		case 5:
			P2 = (P2 & 0x1f) | 0xa0;
		break;
		case 6:
			P2 = (P2 & 0x1f) | 0xc0;
		break;
		case 7:
			P2 = (P2 & 0x1f) | 0xe0;
		break;
	}
}

void ShowSMG_Bit(unsigned char dat, unsigned pos)
{
	InitHC138(6);			//数码管的位置
	P0 = 0x01 << pos;
	InitHC138(7);			//数码管的内容
	P0 = dat;
}

void SMG_Static()
{
	unsigned char i,j;
	for(i = 0; i < 8; i++)
	{
		for(j = 0; j < 10; j++)
		{
			ShowSMG_Bit(SMG_duanma[j],i);
			Delay(60000);
		}
	}
	for(j = 0; j < 16; j++)
	{
		InitHC138(6);			//数码管的位置
		P0 = 0xff;
		InitHC138(7);			//数码管的内容
		P0 = SMG_duanma[j];
		Delay(60000);
		Delay(60000);
	}
}

void main()
{
	while(1)
	{
		SMG_Static();
	}
}

<think>嗯,用户想了解阴极和阳极数码管的区别。首先,我需要回顾一下这两种数码管的基本结构和工作原理。数码管通常由多个LED组成,排列成可以显示数字或字符的形状。每个段对应一个LED,通过控制这些LED的亮灭来显示不同的字符。 阴极和阳极的主要区别应该在于它们的公端连接方式。阴极的公端应该是连接到地,而阳极可能连接到电源。这样的话,点亮单个段的方法就不同。比如,阴极需要给对应的段施加高电平,而阳极可能需要给低电平。 接下来需要确认这种连接方式对驱动电路的影响。可能阳极需要外部提供电流,而阴极则是吸收电流。这可能涉及到限流电阻的位置,以及驱动器的类型,比如是否需要使用NPN或PNP晶体管,或者特定的驱动IC。 另外,功耗方面可能也有区别。当多个段点亮时,阳极阴极的总电流路径可能不同,导致功耗有所差异。但需要具体分析,比如电流是从电源流经段到地,还是相反,这可能影响整体设计。 还需要考虑应用场景。比如,阴极可能在低电平有效的系统中更常见,而阳极则相反。用户可能想知道在实际项目中如何选择,比如基于微控制器的输出类型(推挽、开漏等)来选择适合的数码管类型。 还要注意防止混淆,比如两种数码管的引脚排列是否相同,是否可以直接替换使用,或者是否需要调整电路。例如,如果原本设计使用阳极,换成阴极的话,可能需要反转控制信号,并检查驱动能力是否足够。 另外,可能需要提到一些常见型号或实际例子,帮助用户更好地理解。例如,常见的七段数码管型号,如阴极的比如5161AS,阳极的比如5161BS,它们的引脚定义可能不同,需要参考数据手册。 最后,总结两者的优缺点,比如阳极可能在电源电压较高时更方便,而阴极在低电压或需要与某些逻辑电平直接接口时更合适。还要注意防止过电流,无论是哪种类型,都需要适当的限流措施,避免损坏LED或驱动电路。 可能用户是刚开始学习电子电路的学生或爱好者,需要清晰的对比和实际应用中的注意事项。因此,回答时要结构清晰,分点说明,并给出实际例子和选择建议。</think>阴极数码管阳极数码管是两种常见的LED数码管类型,区别主要在于**公端连接方式**和**驱动逻辑**,以下是具体对比: --- ### 一、结构差异 | **类型** | **阴极 (Common Cathode)** | **阳极 (Common Anode)** | |-------------------|-------------------------------------|------------------------------------| | **公端连接** | 所有LED的阴极(负极)连接在一起 | 所有LED的阳极(正极)连接在一起 | | **公端符号** | 标为`COM`或`GND` | 标为`COM`或`VCC` | | **点亮逻辑** | 公端接地,段引脚接高电平(+5V) | 公端接电源,段引脚接低电平(0V) | --- ### 二、驱动方式对比 1. **阴极** - **操作逻辑**:需通过**拉高段引脚电平**(如`a~g`、`dp`)来点亮对应段。 - **典型电路**:段引脚串联限流电阻后接微控制器(如单片机)输出高电平。 - **适用场景**:直接与推挽输出的微控制器配合使用(如STM32、Arduino)。 2. **阳极** - **操作逻辑**:需通过**拉低段引脚电平**来点亮对应段。 - **典型电路**:段引脚串联限流电阻后接微控制器输出低电平。 - **适用场景**:需外部驱动电路(如晶体管、ULN2003)吸收电流的场景。 --- ### 三、关键区别总结 | **对比项** | **阴极** | **阳极** | |-------------------|-------------------------------------|-------------------------------------| | **公端电位** | 接地(GND) | 接电源(VCC,如+5V) | | **段引脚有效电平**| 高电平(逻辑1) | 低电平(逻辑0) | | **电流方向** | 电流从段引脚流入公端 | 电流从公端流出到段引脚 | | **适用驱动芯片** | 直接驱动或推挽输出器件 | 需开漏输出或电流吸收型驱动器件 | --- ### 四、实际应用注意事项 1. **限流电阻位置** - 阴极:电阻接在段引脚和电源之间。 - 阳极:电阻接在段引脚和地之间。 2. **驱动逻辑反转** - 同一组段码(如显示数字“0”)在两种数码管中需取反。例如: - 阴极段码 `0x3F` → 阳极段码 `0xC0`(按位取反)。 3. **防误操作** - 阳极数码管若公端未接电源,所有段将无法点亮;阴极若公端未接地,可能烧毁LED。 --- ### 五、如何选择? - **阴极**:适合直接由微控制器驱动(高电平输出能力较强)。 - **阳极**:适合需要外部驱动电路或电源电压较高的场景(如12V系统)。 通过理解两者的区别,可避免电路设计错误并优化硬件方案。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值