37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做实验,不管能否成功,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验四十七:七段LED数码管模块Seven Segment Display


知识点:LED数码管使用常识
1.LED数码管一般要通过专门的译码驱动电路,才能正常显示字符。由于LED数码管的品种和类型繁多,所以在实际使用时应注意根据电路的不同选择不同类型的管子。例如,共阴极的LED数码管,只能接入输出为高电平的译码驱动电路;共阳极的LED数码管,只能接入输出为低电平的译码驱动电路。动态扫描显示电路的输出端,只能接多位动态LED数码管。
2.各厂家或同一厂家生产的不同型号的LED数码管,即使封装尺寸完全相同,其性能和引脚排列有可能大相径庭。反过来,功能和引脚排列相同的LED数码管,外形尺寸往往有大有小。所以选用或代换LED数码管时,只能以它的型号为根据。表3给出了国产BS×××系列LED数码管与国内外其他同类产品的直接代换型号,可供参考。
3.LED数码管属于电流控制型器件,它的发光亮度与工作电流成正比。实际使用时,每段笔划的工作电流取5~15mA(指普通小型管),这样既可保证亮度适中,延长使用寿命,又不会损坏数码管。如果在大电流下长期使用,容易使数码管亮度衰退,降低使用寿命,过大的电流(指超过内部发光二极管所允许的极限值)还会烧毁数码管。为了防止过大电流烧坏数码管,在电路中使用时一定要注意给它串联上合适的限流电阻器。
4.使用LED数码管时必须注意区分普通亮度数码管和高亮度数码管。通常情况下,用高亮度数码管可以代换现有设备上的普通亮度数码管,但反过来不能用普通亮度数码管代换高亮度数码管。这是因为普通亮度数码管的发光强度IV≥0.15mcd(毫坎),而高亮度数码管的发光强度IV≥5mcd,两者相差悬殊,并且普通亮度数码管每个笔段的工作电流≥5mA,而高亮度数码管在大约1mA的工作电流下即可发光。
5.在挑选国产BS×××系列LED数码管时,应注意产品型号标注的末位编号,以便与译码驱动电路等相匹配。通常产品末位数字是偶数的,为共阳极数码管,如BS206、BS244等;若产品末位数字是奇数,则为共阴极数码管,如BS205、BS325等。但也有个别产品例外,应注意区分。型号后缀字母 “R”,表示发红光;后缀字母“G”,表示发绿光;后缀字母“OR”,表示发橙光。
6.小型LED数码管为一次性产品,即使其中一个笔段的发光二极管在使用中损坏,也只能更换新管。曾见某图书介绍修复数码管内部损坏发光二极管的方法,笔者亲自动手实践,发现根本行不通,只会是徒劳的。因为采用环氧树脂灌封的全密封产品,外壳根本无法打开,强行用刀切割,随着面板的四分五裂,里面的电路和光导材料早已被破坏得面目全非了。
7.LED数码管除了常用的“8”字形数码管以外,较常见的还有图6所示的“±1”数字管、“N”形管和“米”字管等。其中,“±1”数字管能够显示 “+1”和“-1”,以及小数点“.”。“N”形管除了具有“8”字形数码管的功能外,还能够显示字母“N”等。“米”字管功能最全,除显示数学运算符号 “+”、“-”、“×”、“÷”之外,还可显示A~Z共26个英文字母,常用作单位符号显示。
8. LED数码管的显示面在出厂时贴有保护膜,在使用时可以撕下来。不要用尖硬物去碰触显示面,以免造成划痕等物理损伤,影响显示效果。焊接小型LED数码管宜用20W左右的小功率电烙铁,焊接时间一般不要超过3s,以免烫坏器件本身或线路板。

七段LED数码管模块驱动方式
直流驱动------是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。优点是编程简单,显示亮度高,缺点是占用I/O端口多。
动态显示驱动------是将所有数码管通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示。将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

LED数码管简易测试方法
一个质量保证的LED数码管,其外观应该是做工精细、发光颜色均匀、无局部变色及无漏光等。对于不清楚性能好坏、产品型号及管脚排列的数码管,可采用下面介绍的简便方法进行检测。
1.干电池检测法。
如图所示,取两节普通1.5V干电池串联(3V)起来,并串联一个100Ω、1/8W的限流电阻器,以防止过电流烧坏被测LED数码管。将3V干电池的负极引线(两根引线均可接上小号鳄鱼夹)接在被测数码管的公共阴极上,正极引线依次移动接触各笔段电极(a~h脚)。当正极引线接触到某一笔段电极时,对应笔段就发光显示。用这种方法可以快速测出数码管是否有断笔(某一笔段不能显示)或连笔(某些笔段连在一起),并且可相对比较出不同的笔段发光强弱是否一致。若检测共阳极数码管,只需将电池的正、负极引线对调一下,方法同上。
如果将图中被测数码管的各笔段电极(a~h脚)全部短接起来,再接通测试用干电池,则可使被测数码管实现全笔段发光。对于质量保证的数码管,其发光颜色应该均匀,并且无笔段残缺及局部变色等。
如果不清楚被测数码管的结构类型(是共阳极还是共阴极)和引脚排序,可从被测数码管的左边第1脚开始,逆时针方向依次逐脚测试各引脚,使各笔段分别发光,即可测绘出该数码管的引脚排列和内部接线。测试时注意,只要某一笔段发光,就说明被测的两个引脚中有一个是公共脚,假定某一脚是公共脚不动,变动另一测试脚,如果另一个笔段发光,说明假定正确。这样根据公共脚所接电源的极性,可判断出被测数码管是共阳极还是共阴极。显然,公共脚如果接电池正极,则被测数码管为共阳极;公共脚如果接电池负极,则被测数码管应为共阴极。接下来测试剩余各引脚,即可很快确定出所对应的笔段来。

2.万用表检测法。
这里以MF50型指针式万用表为例,说明具体检测方法:首先,按照图所示,将指针式万用表拨至“R×10k”电阻挡。由于LED数码管内部的发光二极管正向导通电压一般≥1.8V,所以万用表的电阻档应置于内部电池电压是15V(或9V)的“R×10k”挡,而不应置于内部电池电压是1.5V的 “R×100”或“R×1k”挡,否则无法正常测量发光二极管的正、反向电阻。然后,进行检测。在测图5(b)所示的共阴极数码管时,万用表红表笔(注意:红表笔接表内电池负极、黑表笔接表内电池正极)应接数码管的“-”公共端,黑表笔则分别去接各笔段电极(a~h脚);对于共阳极的数码管,黑表笔应接数码管的“+”公共端,红表笔则分别去接a~h脚。正常情况下,万用表的指针应该偏转(一般示数在100kΩ以内),说明对应笔段的发光二极管导通,同时对应笔段会发光。若测到某个管脚时,万用表指针不偏转,所对应的笔段也不发光,则说明被测笔段的发光二极管已经开路损坏。与干电池检测法一样,采用万用表检测法也可对不清楚结构类型和引脚排序的数码管进行快速检测。

Arduino实验接线示意图

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十七:七段LED数码管模块 之一
在这个实验中,我们将只需逐段点亮和熄灭关闭LED,来熟悉七段数码管的工作原理
使用共阳数码管
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十七:七段LED数码管模块 之一
在这个实验中,我们将只需逐段点亮和熄灭关闭LED,来熟悉七段数码管的工作原理
使用共阳数码管
*/
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
}
void loop()
{
for(int i=2;i<9;i++)
{
digitalWrite(i,HIGH);
delay(600);
}
for(int i=2;i<9;i++)
{
digitalWrite(i,LOW);
delay(600);
}
delay(1000);
}
Arduino实验场景图

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二:LED数码管循环显示0-9数字
使用:共阳极LED数码管模块(低电平触发)
实验接脚:
Aeduino LED数码管
VCC COM(3、8)
D2 a(7)
D3 b(6)
D4 c(4)
D5 d(2)
D6 e(1)
D7 f(9)
D8 g(10)
- dp(5)
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二:LED数码管循环显示0-9数字
使用:共阳极LED数码管模块(低电平触发)
实验接脚:
Aeduino LED数码管
VCC COM(3、8)
D2 a(7)
D3 b(6)
D4 c(4)
D5 d(2)
D6 e(1)
D7 f(9)
D8 g(10)
- dp(5)
*/
const uint8_t CA_SEGCODE[] =
{ 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
int i, j;
//用数组指定7段数码管所连接的引脚
int ledPins[] = {2, 3, 4, 5, 6, 7, 8};
void setup()
{
for (int i = 0; i < 8; i++)
pinMode(ledPins[i], OUTPUT);
}
void loop()
{
for (i = 0; i < 10; i++)
{
for (j = 0; j < 7; j++)
{
if ((CA_SEGCODE[i] >> j) & 0x01 == 1)
digitalWrite(ledPins[j], HIGH);
else
digitalWrite(ledPins[j], LOW);
}
delay(1000);
}
}
程序说明:
源程序中先定义一个数组,用来存放显示0-9的数据;
之后定义led引脚数组,方便之后对其进行引脚的模式设置和操作对应引脚的电平
digitalWrite(ledPins[j],HIGH);
else
digitalWrite(ledPins[j],LOW);
通过数据的移位并与0x01进行与操作,当比较的位的数据为1,则拉高对应的引脚,因此该led不亮,当比较的位的数据为0,则拉低对应引脚的电平,led亮起。
实验二循环显示0-9数字,开源仿真编程(Linkboy V4.2)之一

实验二开源仿真编程(Linkboy V4.2)之二

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验三:循环显示0-9数字以及字母AbCdEF
使用:共阳极LED数码管模块(低电平触发)
实验接脚:
Aeduino LED数码管
VCC COM(3、8)
D2 a(7)
D3 b(6)
D4 c(4)
D5 d(2)
D6 e(1)
D7 f(9)
D8 g(10)
D9 dp(5)
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验三:循环显示0-9数字以及字母AbCdEF
使用:共阳极LED数码管模块(低电平触发)
实验接脚:
Aeduino LED数码管
VCC COM(3、8)
D2 a(7)
D3 b(6)
D4 c(4)
D5 d(2)
D6 e(1)
D7 f(9)
D8 g(10)
D9 dp(5)
*/
int pinDigitron = 2; //管脚D2连接到数码管的A脚,D3连B... D9连h
void setup() {
for (int x = 0; x < 8; x++)
pinMode(pinDigitron + x, OUTPUT); //设置各脚为输出状态
}
//在数码管中显示数字的函数
void displayDigit(unsigned char digit) {
//定义一个数组表:不同数字的abcdefgDP各段的取值
unsigned char abcdefgh[][8] = {
{0, 0, 0, 0, 0, 0, 1, 1}, //0
{1, 0, 0, 1, 1, 1, 1, 1}, //1
{0, 0, 1, 0, 0, 1, 0, 1}, //2
{0, 0, 0, 0, 1, 1, 0, 1}, //3
{1, 0, 0, 1, 1, 0, 0, 1}, //4
{0, 1, 0, 0, 1, 0, 0, 1}, //5
{0, 1, 0, 0, 0, 0, 0, 1}, //6
{0, 0, 0, 1, 1, 1, 1, 1}, //7
{0, 0, 0, 0, 0, 0, 0, 1}, //8
{0, 0, 0, 0, 1, 0, 0, 1}, //9
{0, 0, 0, 1, 0, 0, 0, 1}, //A
{1, 1, 0, 0, 0, 0, 0, 1}, //b
{0, 1, 1, 0, 0, 0, 1, 1}, //C
{1, 0, 0, 0, 0, 1, 0, 1}, //d
{0, 1, 1, 0, 0, 0, 0, 1}, //E
{0, 1, 1, 1, 0, 0, 0, 1}, //F
}; // 共阳极数组,1为高电平,0为低电平
if ( digit >= 16 ) return;
for (unsigned char x = 0; x < 8; x++)
digitalWrite( pinDigitron + x, abcdefgh[digit][x] );
}
void loop() {
//在数码管中显示0-9,A-F各个数字
for (int x = 0; x < 16; x++) {
displayDigit(x); //调用displayDigit()子函数,显示数字
delay(1000); //等待1000毫秒
}
}
附录:LED数码管显示字型码表

实验五:使用数组,精炼代码循环显示0~9
(1)LED数码管实验五参考开源代码(Arduino):
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验五:使用数组,精炼代码循环显示0~9
使用:共阳极LED数码管模块(低电平触发)
实验接脚:
Aeduino LED数码管
VCC COM(3、8)
D1 a(7)
D2 b(6)
D3 c(4)
D4 d(2)
D5 e(1)
D6 f(9)
D7 g(10)
- dp(5)
*/
void setup() {
for (int n = 1; n <= 7; n++) //abcdefg对应管脚1234567
pinMode(n, OUTPUT);//设置1~7管脚对外输出
}
void loop() {
/*==========显示=============*/
int n[10][7] = {0, 0, 0, 0, 0, 0, 1, //0
1, 0, 0, 1, 1, 1, 1, //1
0, 0, 1, 0, 0, 1, 0, //2
0, 0, 0, 0, 1, 1, 0, //3
1, 0, 0, 1, 1, 0, 0, //4
0, 1, 0, 0, 1, 0, 0, //5
0, 1, 0, 0, 0, 0, 0, //6
0, 0, 0, 1, 1, 1, 1, //7
0, 0, 0, 0, 0, 0, 0, //8
0, 0, 0, 0, 1, 0, 0 };//9
for (int i = 0; i <= 9; i++) { //设置循环
for (int j = 1; j <= 7; j++)
digitalWrite(j, n[i][j - 1]);
delay(400);// 延时400毫秒
}
}
(2)LED数码管实验五参考开源代码(Arduino)之二
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验五:使用数组,精炼代码循环显示0~9 程序之二
使用:共阳极LED数码管模块(低电平触发)
实验接脚:
Aeduino LED数码管
D13 COM(3、8)
D2 a(7)
D3 b(6)
D4 c(4)
D5 d(2)
D6 e(1)
D7 f(9)
D8 g(10)
- dp(5)
*/
int n[10][9] = { // 建立数字显示数组,对应引脚A~G、DP
0, 0, 0, 0, 0, 0, 0, 0, 1, //0
0, 0, 1, 0, 0, 1, 1, 1, 1, //1
0, 0, 0, 0, 1, 0, 0, 1, 0, //2
0, 0, 0, 0, 0, 0, 1, 1, 0, //3
0, 0, 1, 0, 0, 1, 1, 0, 0, //4
0, 0, 0, 1, 0, 0, 1, 0, 0, //5
0, 0, 0, 1, 0, 0, 0, 0, 0, //6
0, 0, 0, 0, 0, 1, 1, 1, 1, //7
0, 0, 0, 0, 0, 0, 0, 0, 0, //8
0, 0, 0, 0, 0, 0, 1, 0, 0 //9
};
void setup()
{
pinMode( 13, OUTPUT ); //13号引脚高电平,给数码管供电
for ( int i = 2; i <= 8; i++ ) //循环点亮LED。LED电平高的不亮低的亮
pinMode( i, OUTPUT );
}
void loop()
{
digitalWrite( 13, HIGH );//打开共阳极电源
for ( int i = 0; i < 10; i++ )//循环点亮LED。LED电平高的不亮低的亮
{
for ( int j = 2; j < 9; j++ )
digitalWrite( j, n[i][j] );
delay( 800 );//延时800毫秒
}
}
Arduino实验场景图

9mm2023.07.25
666