51的数码管点亮跟发光二级管有相似之处,都是给特殊位送高低电平来控制数码管的显示。数码管的发光原理如下所示:
数码管有共阴极跟共阳极两种,我的板子采用的是共阴极,所以,如果我想让哪个发光管点亮,就给特殊位送高电平1,所以,按照上图,我们可以得知,如果想让显示1,我们就让b,c送高电平,其他均为低电平,所以,显示1的话,按照图上所示,dp~a即为:00000110 b,换算为16进制为:0x06,同理,我们可以得到2,3,4...下面是所得到的1~6的对应发光数:
uchar code duantable[] = {
0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d
};
6个数码管通过位选去控制哪个数码管亮,通过段选控制数码管的某段亮。
下面的一个程序,让板子上的六个数码管每间隔1ms分别显示1,2,3,4,5,6根据人眼看东西的滞留效应,人眼就看到全部显示的是123456,其实是每个数码管在轮流的闪烁着。
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula = P2 ^ 6;
sbit wela = P2 ^ 7;
uchar num = 0;
//段选控制,让数码管显示1,2,3,4,5,6
uchar code duantable[] = {
0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d
};
//位选控制,分别控制第1个,第2个,第3个...亮
uchar code weitable[] = {
0xfe, 0xfd, 0xfb,
0xf7, 0xef, 0xdf
};
//延时函数
void delay(uint time)
{
uint x, y;
for (x = time; x > 0; x--)
for (y = 110; y > 0; y--);
}
void main()
{
while (1) {
for (; num < 6; num++) {
wela = 1;
P0 = weitable[num];
wela = 0;
dula = 1;
P0 = duantable[num];
dula = 0;
delay(10);
}
num = 0;
}
}
以上程序在板子上测试通过,如有不正,请拍砖。
文章的脚注信息由WordPress的wp-posturl插件自动生成

微信扫一扫,打赏作者吧~![[整理]三极管驱动继电器](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2014/02/11.jpg&w=280&h=210&zc=1)


