(一)一位数码管的结构原理(何谓共阴、共阳?在电路连接和软件编程方面有何区别)
(二)一位数码管与arduino的连接电路
(三)设计0-9数字显示用的字形表(如何设计?共阴和共阳有何区别?如何在程序中存储?能显示哪些英文字母?)
(四)具体例程
4.1例程1.:串口输入数字n,数码管显示数字n
4.2例程2:0-9循环显示,每个数字显示1秒
4.3例程3:连接一个微动开关(按键),按一下,显示一个数字,0-9循环
一、LED数码管的结构
LED(Light Emiting Diode是发光二极管的缩写)数码管(LED Segment Displays)由8只发光二极管封装在一起组成“8”字型的器件。如图1所示,数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。每一只发光二极管都有一根电极引到外部引脚上,而另外一只引脚就连接在一起同样也引到外部引脚上,记做公共端(COM)。
二、LED数码管的分类
1、从控制方式上分:分为内控方式(内部有单片机,通电自动变色)和外控方式(需要外接控制器才能变色)。
2、从变化方式上分:分为固定色彩的和七彩、全彩的;固定色彩的是用来勾轮廓的,全彩的可以勾轮廓,也可以组成管屏显示文字、视频等;
3、从尺寸上分:有D50的、D30的,这是直径;长度基本上1米的(可以定制),这个需要根据实际需要进行选择就行了。
4、从内部可控性上分:有1米6段的,有1米8段的和1米12段、1米16段、1米32段的。也就是1米的管子内有几段可以独立受控; 1米段数越多,做视频的效果越好。如果密度低,或者做些追逐效果,做1米6段也就可以了。
5、从led数量上,有1米96颗灯的,有1米144颗灯的;灯越多效果越好。一般做全彩的都是用1米144颗灯的。
6、从供电上分,分为高压供电(直接220V供电)和低压供电(12v供电,220v电源需要加开关电源转换);一般选择低压供电的,比较可靠稳定,高压供电的容易烧毁。
我们这里将数码管分为共阴极和共阳极两类。
三、共阳极和共阴极数码管的区别
如图2所示。
•共阳极数码管是指数码管的发光二极管的阳极(正极)都连在一起,作为公共引脚,在正常使用时此引脚接电源正极。当发光二极管的阴极接低电平时,发光二极管被点亮。
•共阴极数码管是指数码管的发光二极管的阴极(负极)都连在一起作为公共引脚,在正常使用时此引脚接电源负极,当发光二极管的阳极接高电平时,发光二极管被点亮。
四、LED显示工作原理
•共阴极和共阳极数码管,它们的发光原理是一样的,只是它们的电源极性不同而已。以共阴极为例,当要其显示“1”时,只需置B、C为高电平,而其他为低电平,如图4所示;当要显示“5”时,只需置A、F、G、C、D为高电平,而其它的为低电平,如图5所示;以此类推……
注:数码管的每一段都是由发光二极管组成,所以在使用时跟发光二极管一样,也要连接限流电阻,否则电流过大会烧毁发光二极管。
五、一位数码管与Arduino的连接电路
注意!!!每一个引脚都要连接限流电阻!!!
同时也要注意引脚之间的连接关系。
六、0-9数字显示字形表
1、设计原理:以共阴极为例。若要显示“1”,则b、c两段二极管需要连接高电平,其他段保持低点平;若要显示“2”,则a、b、g、e、d五段需要连接高电平,其他段保持低电平,以此类推。
2、共阴极和共阳极在字形表设计上的区别:当数码管以共阴极方式连接时,因为公共端接地,所以需要点亮的段就需要只为高电平,在编码中为“1”,其他段置为“0”;而以共阳极方式连接时则完全相反,共阳极公共端接电源正极,所以需要点亮的段要置低电平,为“0”,其他段置高电平,为“1”。
3、以显示数字“1”为例,dp、g、f、e、d、c、b、a在共阴极为“0000 0110”,而在共阳极中为“1111 1001”,转换成16进制表示,分别为0x06、0xf9。
七、具体例程
1、例程1:串口输入数字n,数码管显示数字n
这个例子的主要是要在串口监视器输入数字,通过串口通信使数码管显示所输入的数字。
模拟电路图如下:
连接实物图如下:
图中数码管中a、b、c、d、e、f、g、dp八个发光管分别连接着开发板的7、6、5、11、10、8、9、4引脚,数码管的公共端口一边接开发板的GND,另一边接面包板的高电平。
该例的原理便是通过设置数码管8个发光管的亮灭来组合数字,以使得数码管显示数字,这里是设置一个二维数组,数组里记录了用来显示0-9十个数字的八个发光管高低电平的组合,用pinMode()函数设置a、b、c、d、e、f、g、dp所对应的引脚为输出,通过串口监视器读取输入的数字,用digitalWrite()函数读取相应数字在数组中对应的高低电平,然后传递给数码管,最后就能够显示所输入的数字。
.程序代码及相应注释如下:
int a=7;//定义数字接口7 连接a 段数码管
int b=6;// 定义数字接口6 连接b 段数码管
int c=5;// 定义数字接口5 连接c 段数码管
int d=11;// 定义数字接口11 连接d 段数码管
int e=10;// 定义数字接口10 连接e 段数码管
int f=8;// 定义数字接口8 连接f 段数码管
int g=9;// 定义数字接口9 连接g 段数码管
int dp=4;// 定义数字接口4 连接dp 段数码管
unsigned char num[10][8] =
{
//1为点亮,0为关闭,a表示数码管a的led灯,其他类似
//a b c d e f g h
{1,1, 1, 1, 1, 1, 0, 0}, //0
{0,1, 1, 0, 0, 0, 0, 0}, //1
{1,1, 0, 1, 1, 0, 1, 0}, //2
{1,1, 1, 1, 0, 0, 1, 0}, //3
{0,1, 1, 0, 0, 1, 1, 0}, //4
{1,0, 1, 1, 0, 1, 1, 0}, //5
{1,0, 1, 1, 1, 1, 1, 0}, //6
{1,1, 1, 0, 0, 0, 0, 0}, //7
{1,1, 1, 1, 1, 1, 1, 0}, //8
{1,1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
Serial.begin(9600); //设置波特率
pinMode(a,OUTPUT); //设置引脚为输出
pinMode(b,OUTPUT); //设置引脚为输出
pinMode(c,OUTPUT); //设置引脚为输出
pinMode(d,OUTPUT); //设置引脚为输出
pinMode(e,OUTPUT); //设置引脚为输出
pinMode(f,OUTPUT); //设置引脚为输出
pinMode(g,OUTPUT); //设置引脚为输出
pinMode(dp,OUTPUT); //设置引脚为输出
}
void loop()
{
if(Serial.available())
{
char sr=Serial.read();
int i=0;
i=sr-'0';
Serial.write(sr);
digitalWrite(a,num[i][0]); //设置a 引脚的电平
digitalWrite(b,num[i][1]); //设置b 引脚的电平
digitalWrite(c,num[i][2]); //设置c 引脚的电平
digitalWrite(d,num[i][3]); //设置d 引脚的电平
digitalWrite(e,num[i][4]); //设置e 引脚的电平
digitalWrite(f,num[i][5]); //设置f 引脚的电平
digitalWrite(g,num[i][6]); //设置g 引脚的电平
digitalWrite(dp,num[i][7]); //设置h 引脚的电平
}
}
代码编译成功后实验如果仍然不成功的原因就是因为在串口监视器最低端有一个结束符选项,如果选择的是换行符,那么在输入的数字后边会有一个隐形的换行符。而Serial.read()这个函数每次只能接受一个字节的数据,所以虽然每次输入一个数字,但是读取到的是换行符的ASC||码。这个时候在串口监视器下端选择没有结束符选项就ok啦。这里还要注意串口监视器读取的是输入字符的ASC||码,在代码中是用int定义的i,所以在用digitalWrite()引用的是时候要把读取到的在字符减去数字0的ASC||码,这样得到的就是所输入数字的ASC||码了。
案例结果视频:
链接:https://pan.baidu.com/s/1VWeKl5AJfpJ25vTeN_Evyg
提取码:rbet
2、例程2: 0-9循环显示,每个数字显示1秒
该例程连接电路和代码编写均以共阴极为例——公共端接地,当需要数码管某段点亮时,应将该段代码置位高电平。因为数码管中每段均为一个发光二极管,为了避免发光二极管损坏,每一段均需要连接电阻。为达到该Friting电路图简单清晰的目的,画图时采取对称式画图。
模拟电路图如下:
连接实物图如下:
图中数码管中a、b、c、d、e、f、g、dp八个发光管分别连接着开发板的7、6、5、11、10、8、9、4引脚,数码管的公共端口一边接开发板的GND,另一边接面包板的高电平。
程序代码及相应注释如下:
int a=7;//定义数字接口7 连接a 段数码管
int b=6;// 定义数字接口6 连接b 段数码管
int c=5;// 定义数字接口5 连接c 段数码管
int d=11;// 定义数字接口11 连接d 段数码管
int e=10;// 定义数字接口10 连接e 段数码管
int f=8;// 定义数字接口8 连接f 段数码管
int g=9;// 定义数字接口9 连接g 段数码管
int dp=4;// 定义数字接口4 连接dp 段数码管
unsigned char num[10][8] =
{ //1为点亮,0为关闭,a表示数码管a的led灯,其他类似
//a b c d e f g h
{1,1, 1, 1, 1, 1, 0, 0}, //0
{0,1, 1, 0, 0, 0, 0, 0}, //1
{1,1, 0, 1, 1, 0, 1, 0}, //2
{1,1, 1, 1, 0, 0, 1, 0}, //3
{0,1, 1, 0, 0, 1, 1, 0}, //4
{1,0, 1, 1, 0, 1, 1, 0}, //5
{1,0, 1, 1, 1, 1, 1, 0}, //6
{1,1, 1, 0, 0, 0, 0, 0}, //7
{1,1, 1, 1, 1, 1, 1, 0}, //8
{1,1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
pinMode(a,OUTPUT); //设置引脚为输出
pinMode(b,OUTPUT); //设置引脚为输出
pinMode(c,OUTPUT); //设置引脚为输出
pinMode(d,OUTPUT); //设置引脚为输出
pinMode(e,OUTPUT); //设置引脚为输出
pinMode(f,OUTPUT); //设置引脚为输出
pinMode(g,OUTPUT); //设置引脚为输出
pinMode(dp,OUTPUT); //设置引脚为输出
}
void loop()
{
for( int i = 0 ; i <= 9 ; i++) //循环显示0-9
{digitalWrite(a,num[i][0]); //设置a 引脚的电平
digitalWrite(b,num[i][1]); //设置b 引脚的电平
digitalWrite(c,num[i][2]); //设置c 引脚的电平
digitalWrite(d,num[i][3]); //设置d 引脚的电平
digitalWrite(e,num[i][4]); //设置e 引脚的电平
digitalWrite(f,num[i][5]); //设置f 引脚的电平
digitalWrite(g,num[i][6]); //设置g 引脚的电平
digitalWrite(dp,num[i][7]); //设置h 引脚的电平
delay(1000); //延迟1秒
}
}
案例结果视频:
链接:https://pan.baidu.com/s/1ukwlMVGa-7G1GKJwKwYz-w
提取码:7ffc
3、例程3: 连接一个微动开关(按键),按一下,显示一个数字,0-9循环
这个例子需要连接一个按钮,按一下,数码管所显示的数字加一,使得0-9数字循环显示。
模拟电路图如下:
连接实物图如下:
该示例的连接方式与之前所做的4.1和4.2的连接方式差不多,只不过这个事例要把按键接入到电路中,用按键来控制数码管的显示。图中a、b、c、d、e、f、g、dp八个发光管分别连接着开发板的7、6、5、11、10、8、9、4引脚,按键接的是开发板的12号引脚。
该例的原理就是过设置数码管8个发光管的亮灭来组合数字,以使得数码管显示数字,这里是设置一个二维数组,数组里记录了用来显示0-9十个数字的八个发光管高低电平的组合,用pinMode()函数设置a、b、c、d、e、f、g、dp所对应的引脚为输出,将按键对应的引脚设置为输入,先把按键设置为高电平。在loop函数中编写代码读取按键状态,在这里需要设置按键消抖,如果不设置,可能会出现数字不是加一显示,而是会一次不止加一。定义一个变量digit初始值为9,每次按键按下即按键由高电平转为低电平时digit加一,通过digitalWrite()函数饮用digit数值在二维数组中的电平。将电平信号通过开发板传给数码管,最后就能够实现数字自增一。
程序代码及相应注释如下:
int buttonPin = 12; // 按键的管脚定义
int a=7;//定义数字接口7 连接a 段数码管
int b=6;// 定义数字接口6 连接b 段数码管
int c=5;// 定义数字接口5 连接c 段数码管
int d=11;// 定义数字接口11 连接d 段数码管
int e=10;// 定义数字接口10 连接e 段数码管
int f=8;// 定义数字接口8 连接f 段数码管
int g=9;// 定义数字接口9 连接g 段数码管
int dp=4;// 定义数字接口4 连接dp 段数码管
int digit = 9; // 存储按键状态值
byte num[10][8] =
{
//1为点亮,0为关闭,a表示数码管a的led灯,其他类似
//a b c d e f g h
{1,1, 1, 1, 1, 1, 0, 0}, //0
{0,1, 1, 0, 0, 0, 0, 0}, //1
{1,1, 0, 1, 1, 0, 1, 0}, //2
{1,1, 1, 1, 0, 0, 1, 0}, //3
{0,1, 1, 0, 0, 1, 1, 0}, //4
{1,0, 1, 1, 0, 1, 1, 0}, //5
{1,0, 1, 1, 1, 1, 1, 0}, //6
{1,1, 1, 0, 0, 0, 0, 0}, //7
{1,1, 1, 1, 1, 1, 1, 0}, //8
{1,1, 1, 1, 0, 1, 1, 0}, //9
};
void setup()
{
pinMode(a,OUTPUT); //设置引脚为输出
pinMode(b,OUTPUT); //设置引脚为输出
pinMode(c,OUTPUT); //设置引脚为输出
pinMode(d,OUTPUT); //设置引脚为输出
pinMode(e,OUTPUT); //设置引脚为输出
pinMode(f,OUTPUT); //设置引脚为输出
pinMode(g,OUTPUT); //设置引脚为输出
pinMode(dp,OUTPUT); //设置引脚为输出
pinMode(buttonPin, INPUT); //设置按键管脚上拉输入模式
digitalWrite(buttonPin,HIGH);
}
void loop()
{
intbuttonState = digitalRead(12); //读取按键返回状态
if(buttonState == LOW)
{//若按键被按下
delay(80); //等待跳过按键抖动的不稳定过程
if (buttonState == LOW) //若按键被按下
{
++digit;
if(digit>9) digit=0;
}
digitalWrite(a,num[digit][0]); //设置a 引脚的电平
digitalWrite(b,num[digit][1]); //设置b 引脚的电平
digitalWrite(c,num[digit][2]); //设置c 引脚的电平
digitalWrite(d,num[digit][3]); //设置d 引脚的电平
digitalWrite(e,num[digit][4]); //设置e 引脚的电平
digitalWrite(f,num[digit][5]); //设置f 引脚的电平
digitalWrite(g,num[digit][6]); //设置g 引脚的电平
digitalWrite(dp,num[digit][7]); //设置h 引脚的电平
delay(200);
}
}
案例结果视频:
链接:https://pan.baidu.com/s/12Dsfg-vUTm-7Dm1Pzfu3UA
提取码:5v31