Arduino基础实验3,驱动多位七段数码管

数码管在电子制作中被用来显示输出数据,它是简单用户交互场合的常用电子元件,看看你周边的家用电器,会不难找到它的身影。本文中,创客行就用Arduino来驱动一个多位七段数码管。

多位七段数码管

数码管2图1 三位七段数码管

图1是三位七段数码管的引脚图和了内部电路图,它能显示三位带小数点的十进制数据。我们先从红色的“8.”数据管开始看起,一个数码管数字一共由7个长直型的发光二极管组成,分别被以”A”-“G”的英文字母编号,右下角的小数点用“DP”编号。点亮一个数码管的电路跟点亮一个普通发光二极管没什么两样,就是在高低电压之间让数码管和一个分压电阻串联,因此想要点亮带小数点的一个十进制数,需要由8个并联的发光二极管电路来完成。

那么如果想同时点亮三个数字,是不是需要8X3=24个并联电路呢?实际上一般的数码管都不使用如此复杂的电路,而是利用人眼的“视觉暂留”效应,通过快速切换数码管的显示,达到多位数字的显示目的。这时,只需要每个数字的阳极或阴极列作为公共控制引脚,就可以控制每个数字的显示。图1中的内部电路是共阳极数码管的电路,每8组数码管有一个公共阳极,同一时刻,只允许一个数字发亮,当三个数字中快速切换,便可形成多位数字同时显示的效果。

Arduino数码管控制电路

图1的数码管内部电路图中,怎么没有以“6”为标注的引脚呢?因为它是兼容三位和四位数码管的产品,6引脚为控制第四个数字准备的,这里用不上,不过多位数码管的原理相同,弄懂了三位数码管,四位也就不难了。

搭建数码管实验电路,首先在8个数码管控制电极串联分压电阻,我们这里使用1KΩ电阻。本实验实际采用共阴极的数码管,也就是当数字发亮时,每段数码管的控制引脚接高电平,而每一位数字的公共引脚连接低电平。它的内部电路图跟图1相似,只需要把24个发光二极管的正负极全部对调即可。

三位数码管外观图2 三位数码管外观

Arduino驱动三位数码管电路图3 Arduino驱动三位数码管电路

图3是Arduino驱动三位数码管电路,在面包板上搭建略显拥挤,数码管的小数点端5个引脚依次和D2-D6通过各自的分压电阻串联,引脚7,10,11连接D7,D8,D9,而三个数字的公共引脚分别用黄色插线连接D10-D12,公共引脚端不连接电阻。形成的对应关系是:

图4 数码管引脚对应关系

图4表示了图3电路的引脚对应关系,这样连接数码管是Arduino Nano在面包板上使用引线最少的方式。

Arduino数码管驱动软件实验

搭建好电路之后,首先需要验证一下它的基础功能,先写一段代码来试试吧。

/*
 first Nixie light experiment
 source by: www.i-makers.info
*/

void setup() {
 for(int i=2;i<13;i++){
   pinMode(i, OUTPUT);
 }
}

void loop() {
 for(int j=0;j<3;j++){
   for(int i=2;i<13;i++){
     digitalWrite(i,1);
   }
 
   digitalWrite(10+j,0);
   delay(2000);
 }
}

代码1 数码管验证实验代码

代码1是基础验证代码,它首先在setup函数中初始化所有的12个引脚,然后做的工作无非是把控制数码管的所有阳极设置为1,把需要显示的那个数字的公共阴极置0,就会显示出“8.”的数字,每次循环的时候变动一次位置,在代码中循环时间是2秒钟,能够很清晰的看见“8.”被从个位移动到十位,然后跳到百位,又恢复回个位,不断这样循环。有了这个代码基础之后,我们开始扩展它成为能够显示三位数字的代码。

/*
 second Nixie light experiment
 source by: www.i-makers.info
 */
 
 /*
   D2 G
   D3 C
   D4 DP
   D5 D
   D6 E
   D7 B
   D8 F
   D11 A
 */
 const int Nixie[10][8]={
   {0,1,0,1,1,1,1,1},  //0
   {0,1,0,0,0,1,0,0},  //1
   {1,0,0,1,1,1,0,1},  //2
   {1,1,0,1,0,1,0,1},  //3
   {1,1,0,0,0,1,1,0},  //4
   {1,1,0,1,0,0,1,1},  //5
   {1,1,0,1,1,0,1,1},  //6
   {0,1,0,0,0,1,0,1},  //7
   {1,1,0,1,1,1,1,1},  //8
   {1,1,0,1,0,1,1,1}   //9
 };
 
 const int TestNum[3] = {1,6,8};
 
void setup() {
 for(int i=2;i<13;i++){
 pinMode(i, OUTPUT);
 }
}
void loop() {
 for(int j=0;j<3;j++){
   for(int i=10;i<13;i++){
     digitalWrite(i,1);
   }
 
 for(int i=0;i<8;i++){
   digitalWrite(i+2,Nixie[TestNum[2-j]][i]);
 }
 
   digitalWrite(10+j,0);
   delay(5);
 }
}

代码2 数码管数字输出代码

代码2新建一个二维数组Nixie,它按照图4的引脚对应关系来定义数码管的引脚真值表,TestNum数组用于定义期望显示的数字,后面的代码相对代码1略有改动,使得期望显示的数字和相关数码管对应起来,每个数字的显示时间间隔变为5毫秒,这时的数码管就没有闪烁的感觉了。看吧,如图5,现在数字能显示出来了。

数码管数字输出实验结果图5 数码管数字输出实验结果

数码管7

图6  更优雅的数码管数字输出实验电路

总结

本实验给出了Arduino Nano开发板搭建数码管显示电路的硬件实现和软件代码,它可以输出代码中的期望值,更为优雅和安全的数码管连接方式请使用图6,用面包板插线引出D2-D7的连接。在后续Arduino实验中,本电路会被重复使用,更多精彩内容,请查看我们的全站目录

 

 

优秀科技原创内容源,欢迎添加微信公众号。

创客行淘宝店提供本网站电子制作的全部套件

创客行淘宝店地址:https://shop125908459.taobao.com/

参考文档

  1. 全站目录

发表评论