0%

51单片机程序(数码管显示)

备份一下之前自己写的实现数码管循环显示和动态显示的程序 ٩(。・ω・。)و 。

单片机: STC89C52
开发板: HC6800-MS

HC6800-MS开发板上的数码管部分的电路示意图如下:

数码管循环显示

程序运行结果:开发板上数码管模块最左侧的位循环显示数字0~9,每个数字停留显示1秒。

#include<reg51.h>
sbit LEDS1=P1^0;
sbit LEDS2=P1^1;
sbit LEDS3=P1^2;
sbit LEDS4=P1^3;
void main()
{
int LEDChar[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //数码管真值,显示数字0~9
int x=0,sec=0;
LEDS1=0;
LEDS2=0;
LEDS3=0;
LEDS4=1; //设定只有数码管模块最左侧的位显示
TMOD=0x01;
TH0=0xB8;
TL0=0x00;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xB8;
TL0=0x00;
x++;
if(x==50)
{
x=0;
sec++;
P0=LEDChar[sec-1]; //将数码管的真值赋给控制数码管的其中一个寄存器P0
if(sec==10)
{
sec=0;
}
}
}
}
}

数码管动态显示

数码管的动态显示实际上是从左向右的不同位数码管的流水显示依次循环(同一时刻内只有一位数码管被点亮),利用人眼的视觉暂留效应,只要进行一次流水显示所需的时间足够短,那么在人眼看来,所有位的数码管都是同时被点亮的。

程序运行结果:开发板上的四位数码管从左往右分别显示数字0123(实际上每位数码管停留显示0.005秒)。

#include<reg51.h>
sbit LEDS4=P1^3;
sbit LEDS3=P1^2;
sbit LEDS2=P1^1;
sbit LEDS1=P1^0;
void main()
{
int LEDChar[]={0x3F,0x06,0x5B,0x4F};
int x=0;
TMOD=0x01;
TH0=0xEE;
TL0=0x00;
TR0=1;
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0xEE;
TL0=0x00;
x++;
if(x==1)
{
LEDS4=1;
LEDS3=0;
LEDS2=0;
LEDS1=0;
P0=LEDChar[x-1];
}
if(x==2)
{
LEDS4=0;
LEDS3=1;
LEDS2=0;
LEDS1=0;
P0=LEDChar[x-1];
}
if(x==3)
{
LEDS4=0;
LEDS3=0;
LEDS2=1;
LEDS1=0;
P0=LEDChar[x-1];
}
if(x==4)
{
LEDS4=0;
LEDS3=0;
LEDS2=0;
LEDS1=1;
P0=LEDChar[x-1];
x=0;
}
}
}
}

附录 - 共阴数码管真值表(部分)

字符 真值
0 0x3F
1 0x06
2 0x5B
3 0x4F
4 0x66
5 0x6D
6 0x7D
7 0x07
8 0x7F
9 0x6F