1.动态显示:
动态显示的原理:
动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。
2.利用定时器的延时子程序:
利用定时器代替延时函数,切时间更加精确.
#include<reg52.h>
unsigned char a;
sbit d1 = P1^0;
void main()
{
TMOD = 0x01;
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
if(a==20)
{
a=0;
d1 = 0;
}
if(a==20)
{
a=0;
d1 = 1;
}
}
}
void delay() interrupt 1
{
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
a++;
}
3.数码管的动态扫描:
上一章数码管的静态扫描中只能控制任意几个数码管显示相同的字符,而数码管的动态扫描中可以让数码管显示不同的字符.
例程序如下:
该程序利用每次只亮一个数码管,然后每次输入不同的字符以达到动态扫描的目的,程序的运行结果为数码管每个一秒左右依次显示1,2,3,4,5,6
#include<reg52.h>
sbit dula = P2^6;
sbit wela = P2^7;
unsigned char temp,aa,num;
unsigned int numdu,numwe;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};
void main()
{
numdu = 0;
numwe = 0;
aa=0;
TMOD = 0x01;
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
temp = 0xfe;
P1 = temp;
while(1)
{
if(aa==20)
{
numdu++;
dula = 1;
if(numdu == 7)
numdu = 1;
P0 = table[numdu];
dula = 0;
wela = 1;
if(numwe == 6)
numwe = 0;
P0 = tablewe[numwe];
wela = 0;
numwe++;
aa = 0;
}
}
}
void enter() interrupt 1
{
TH0 = (65536 - 50000)/256;
TL0 = (65536 - 50000)%256;
aa++;
}
4.数码管同时显示不同的字符:
例程序如下:
该程序可以让数码管显示123456;
其实基本和上面一样,只需要把延时部分时间调短,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示.
#include<reg52.h>
sbit dula = P2^6;
sbit wela = P2^7;
unsigned char temp,aa,num;
unsigned int numdu,numwe;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char code tablewe[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf
};
void main()
{
numdu = 0;
numwe = 0;
aa=0;
TMOD = 0x01;
TH0 = (65536 - 50)/256;
TL0 = (65536 - 50)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
temp = 0xfe;
P1 = temp;
while(1)
{
if(aa==20)
{
numdu++;
dula = 1;
if(numdu == 7)
numdu = 1;
P0 = table[numdu]
dula = 0;
wela = 1;
if(numwe == 6)
numwe = 0;
P0 = tablewe[numwe];
wela = 0;
numwe++;
aa = 0;
}
}
}
void enter() interrupt 1
{
TH0 = (65536 - 50)/256;
TL0 = (65536 - 50)%256;
aa++;
}
6.小作品:
利用数码管&定时器制作一个简单但精确的电子时钟:
代码如下:
使用时只需将初始时间在程序中设置好然后再在设置的时间开启单片机即可当时钟一样.
#include<reg52.h>
sbit wela = P2^7;
sbit dula = P2^6;
unsigned int hourshi,hourge,fenshi,fenge,miaoshi,miaoge,a;
unsigned char code table[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
void delay(int c);
void display(int hourshi,int hourge);
void display1(int fenshi,int fenge);
void display2(int miaoshi,int miaoge);
void init();
void main()
{
init();
hourshi = 2;
hourge = 1;
fenshi = 4;
fenge = 4;
miaoshi =2;
miaoge = 0;
while(1)
{
display(hourshi,hourge);
display1(fenshi,fenge);
display2(miaoshi,miaoge);
if(a==20)
{
a=0;
miaoge++;
}
if(miaoge>9)
{
miaoge = 0;
miaoshi++;
}
if(miaoshi>5)
{
miaoshi = 0;
fenge++;
}
if(fenge>9)
{
fenge = 0;
fenshi++;
}
if(fenshi>5)
{
fenshi = 0;
hourge++;
}
if(hourge>9)
{
hourge = 0;
hourshi++;
}
}
}
void enter() interrupt 1
{
TH0 = (65536 - 46080)/256;
TL0 = (65536 - 46080)%256;
a++;
}
void init()
{
TMOD = 0x01;
TH0 = (65536 - 46080)/256;
TL0 = (65536 - 46080)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void display(int hourshi,int hourge)
{
wela = 1;
P0 = 0xfe;
wela = 0;
dula = 1;
P0 = table[hourshi];
dula = 0;
delay(1);
wela = 1;
P0 = 0xfd;
wela = 0;
dula = 1;
P0 = table[hourge];
dula = 0;
delay(1);
}
void display1(int fenshi,int fenge)
{
wela = 1;
P0 = 0xfb;
wela = 0;
dula = 1;
P0 = table[fenshi];
dula = 0;
delay(1);
wela = 1;
P0 = 0xf7;
wela = 0;
dula = 1;
P0 = table[fenge];
dula = 0;
delay(1);
}
void display2(int miaoshi,int miaoge)
{
wela = 1;
P0 = 0xef;
wela = 0;
dula = 1;
P0 = table[miaoshi];
dula = 0;
delay(1);
wela = 1;
P0 = 0xdf;
wela = 0;
dula = 1;
P0 = table[miaoge];
dula = 0;
delay(1);
}
void delay(int c)
{
int a,b;
for(a=100;a>0;a--)
for(b=c;b>0;b--);
}