共阴级四位数码管
对于共阴极数码管来说,当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极数码管的阳极连接在一起,公共阳极接+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