1.数码管的原理与电路图
1.1数码管的发光原理
51单片机上的数码管发光原理是一个数字8字型的数码管由7个led灯组成,还有一个是DP。(DP 是数码管中的一种特殊LED,用于显示小数点。当需要显示小数时,可以通过控制 DP 的亮灭状态来表示小数点的位置。在某些数码管中,DP 还可以用于显示其他特殊符号或功能,如温度单位(°C、°F)、时间单位(AM、PM)等。)
第一个是共阴极连接,第二个是共阳极连接。那共阴极举例,控制数码管亮的基本就是得先让3,8处的是低电平(0),其他的在阳极部分根据要显示的数字分别给出高电平和低电平(比如显示6,应该给出10111110)。
当有多个数码管时,像图中那样相连可以减少I/O口数量,原理和单个是一样的。
1.2 数码管的电路图
要使数码管发光首先是要确定是哪个位置,总共有八个数码管,所以要控制单个数码管显示数字,则需要通过译码器138来控制具体是哪个数码管,原理是通过p24、p23、p22来表示三个二进制数,从而在转化成十进制数,例如要让第三个灯亮就让p24、p23、p22输入110。
哪个数码管选择好了就该弄显示哪个数字了,显示数字也很简单如1.1中的发光原理所说
2.静态数码管显示
#include <REGX52.H>
unsigned char arr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void fam(unsigned char x,y)
{
switch(x)
{
case 1:
P2_4=1;
P2_3=1;
P2_2=1;
break;
case 2:
P2_4=1;
P2_3=1;
P2_2=0;
break;
case 3:
P2_4=1;
P2_3=0;
P2_2=1;
break;
case 4:
P2_4=1;
P2_3=0;
P2_2=0;
break;
case 5:
P2_4=0;
P2_3=1;
P2_2=1;
break;
case 6:
P2_4=0;
P2_3=1;
P2_2=0;
break;
case 7:
P2_4=0;
P2_3=0;
P2_2=1;
break;
case 8:
P2_4=0;
P2_3=0;
P2_2=0;
break;
}
P0=arr[y];
}
void main()
{
fam(8,1);
while(1)
{
}
}
其中使用了数组和分支语句。单片机上的数码管是八个,编号分别是从Y0到Y7,根据输入口p22、p23、p24二进制知道有如下对应关系
二进制(Binary) | 十进制(Decimal) | 十六进制(Hexadecimal) |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
剩下的是其他的二进制转换
二进制(Binary) | 十进制(Decimal) | 十六进制(Hexadecimal) |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
数码管的顺序是从右面往左面开始
3.动态数码管显示
程序如下
#include <REGX52.H>
void Delay(unsigned char xms) //@12.000MHz
{
unsigned char data i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
unsigned char arr[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void fam(unsigned char x,y)
{
switch(x)
{
case 1:
P2_4=1;
P2_3=1;
P2_2=1;
break;
case 2:
P2_4=1;
P2_3=1;
P2_2=0;
break;
case 3:
P2_4=1;
P2_3=0;
P2_2=1;
break;
case 4:
P2_4=1;
P2_3=0;
P2_2=0;
break;
case 5:
P2_4=0;
P2_3=1;
P2_2=1;
break;
case 6:
P2_4=0;
P2_3=1;
P2_2=0;
break;
case 7:
P2_4=0;
P2_3=0;
P2_2=1;
break;
case 8:
P2_4=0;
P2_3=0;
P2_2=0;
break;
Delay(1);
P0=0x00;
}
P0=arr[y];
}
void main()
{
while(1)
{
fam(1,0);
Delay(1);
fam(2,1);
Delay(1);
fam(3,2);
Delay(1);
fam(4,3);
Delay(1);
fam(5,4);
Delay(1);
fam(6,5);
Delay(1);
fam(7,6);
Delay(1);
fam(8,7);
Delay(1);
}
}
通过单片机自身的不断扫描从而达到显示不同数字的效果