【单片机基础篇】共阴级四位数码管

本文介绍了共阴极四位数码管的工作原理,包括结构和显示机制。通过功能实验演示,展示了如何利用单个晶体管控制数码管显示数字,并探讨了进阶的多晶体管操作,实现四个独立显示不同数值的方法。最后,提供了多晶体管显示代码实例,以0621作为纪念。

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

共阴级四位数码管

     对于共阴极数码管来说,当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极数码管的阳极连接在一起,公共阳极接+5V,当某个发光二极管的阴极接低电平时,该发光二极管被点亮,相应的段被显示。

 

结构原理

    共阴极数码管是把所有led的阴极连接到共同接点COM,而每个led的阳极分别为a、b、c、d、e、f、g及h(小数点),如下图所示。图中的8个led分别与上面那个图中的a~h各段相对应,通过控制各个led的亮灭来显示数字,1、2、3、4分别为控制每个数码管位置,共阴1~4直接接地。

 

功能实验演示

设备:共阴极数码管,芯片,电源(当前芯片电压足点亮LED,不需要三极管辅助)

         

 

单个晶体管显示数字倒数代码

/**************************************************************************************
*		             共阴级四位数码管实验												  *																				  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define SPEED 50000

sbit led_a = P0^0;	 
sbit led_b = P0^1;	  
sbit led_c = P0^2;	  
sbit led_d = P0^3;	 
sbit led_e = P0^4;	 
sbit led_f = P0^5;	 
sbit led_g = P0^6;
sbit led_h = P0^7;	 

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

void setNum(u16 num){

	if(num == 0){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =1;
		led_f =1;
		led_g =0;

	} else if(num == 1){
		led_a =0;
		led_b =1;
		led_c =1;
		led_d =0;
		led_e =0;
		led_f =0;
		led_g =0;

	} else if(num == 2){
		led_a =1;
		led_b =1;
		led_c =0;
		led_d =1;
		led_e =1;
		led_f =0;
		led_g =1;

	} else if(num == 3){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =0;
		led_f =0;
		led_g =1;

	} else if(num == 4){
		led_a =0;
		led_b =1;
		led_c =1;
		led_d =0;
		led_e =0;
		led_f =1;
		led_g =1;

	} else if(num == 5){
		led_a =1;
		led_b =0;
		led_c =1;
		led_d =1;
		led_e =0;
		led_f =1;
		led_g =1;

	} else if(num == 6){
		led_a =1;
		led_b =0;
		led_c =1;
		led_d =1;
		led_e =1;
		led_f =1;
		led_g =1;

	} else if(num == 7){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =0;
		led_e =0;
		led_f =0;
		led_g =0;

	} else if(num == 8){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =1;
		led_f =1;
		led_g =1;

	}  else if(num == 9){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =0;
		led_f =1;
		led_g =1;

	}

}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	while(1)
	{
		  delay(SPEED);
		  setNum(9);
		  delay(SPEED);
		  setNum(8);
		  delay(SPEED);
		  setNum(7);
		  delay(SPEED);
		  setNum(6);
		  delay(SPEED);
		  setNum(5);
		  delay(SPEED);
		  setNum(4);
		  delay(SPEED);
		  setNum(3);
		  delay(SPEED);
		  setNum(2);
		  delay(SPEED);
		  setNum(1);
		  delay(SPEED);
		  setNum(0);
		  delay(SPEED);
	}		
}



 

进阶版多个晶体管操作

        a~g只有一组,怎么同时给4个晶体管显示对应的数字?可以先令其中一个晶体设置数字,之后再关闭,再设置第二个,再关闭,只要间隔时间短,就可以实现4个晶体管输出不一样的值(人眼在24帧的速率下,看到的东西都是连续的,所以间隔足够少就可以了)

 

多晶体管显示代码

(代码输出的是0621,是我的一个重要日志,纪念我逝去的青春,哈哈~)

/**************************************************************************************
*		             共阴级四位数码管多管实验												  *																				  
***************************************************************************************/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

#define SPEED 50000

sbit led_a = P0^0;	 
sbit led_b = P0^1;	  
sbit led_c = P0^2;	  
sbit led_d = P0^3;	 
sbit led_e = P0^4;	 
sbit led_f = P0^5;	 
sbit led_g = P0^6;
sbit led_h = P0^7;	

sbit led_1 = P2^0;
sbit led_2 = P2^1;
sbit led_3 = P2^2;
sbit led_4 = P2^3;	  

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

void setNum(u16 num){

	if(num == 0){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =1;
		led_f =1;
		led_g =0;

	} else if(num == 1){
		led_a =0;
		led_b =1;
		led_c =1;
		led_d =0;
		led_e =0;
		led_f =0;
		led_g =0;

	} else if(num == 2){
		led_a =1;
		led_b =1;
		led_c =0;
		led_d =1;
		led_e =1;
		led_f =0;
		led_g =1;

	} else if(num == 3){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =0;
		led_f =0;
		led_g =1;

	} else if(num == 4){
		led_a =0;
		led_b =1;
		led_c =1;
		led_d =0;
		led_e =0;
		led_f =1;
		led_g =1;

	} else if(num == 5){
		led_a =1;
		led_b =0;
		led_c =1;
		led_d =1;
		led_e =0;
		led_f =1;
		led_g =1;

	} else if(num == 6){
		led_a =1;
		led_b =0;
		led_c =1;
		led_d =1;
		led_e =1;
		led_f =1;
		led_g =1;

	} else if(num == 7){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =0;
		led_e =0;
		led_f =0;
		led_g =0;

	} else if(num == 8){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =1;
		led_f =1;
		led_g =1;

	}  else if(num == 9){
		led_a =1;
		led_b =1;
		led_c =1;
		led_d =1;
		led_e =0;
		led_f =1;
		led_g =1;

	}

}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	  
    led_h = 0;
	while(1)
	{
	      led_1 = led_2 = led_3 = led_4 = 1;

	      led_1	= 0;
		  setNum(0);
		  delay(500);


		  led_1 = led_2 = led_3 = led_4 = 1;
		  led_2	= 0;
		  setNum(6);
		   delay(500);


		  led_1 = led_2 = led_3 = led_4 = 1;
		  led_3	= 0;
		  setNum(2);
		   delay(500);


		  led_1 = led_2 = led_3 = led_4 = 1;
		  led_4	= 0;
		  setNum(1);
		  delay(500);

	}		
}



 

 

总结不好多多担待,文章只单纯个人总结,如不好勿喷,技术有限,有错漏麻烦指正提出。本人QQ:373965070

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值