前言
专栏内容会持续补充更新,目前正在进行优惠活动!
目录
一、数码管显示电路图
图1 单片机部分
图 2 数码管连接部分
二、简单例程引例
1. 数码管循环显示 0~9
#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;
u8 code sumagd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)
{
while(i--);
}
void main()
{
u8 i;
a=0;
b=0;
c=0;
while(1)
{
for(i=0;i<10;i++)
{
P0=sumagd[i];
delay(50000);
}
}
}
2. 循环点亮数码管
// 循环点亮数码管
#include"reg52.h"
#include"instrins.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit a=P2^2;
sbit b=P2^3;
sbit c=P2^4;
u8 code sumagd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)
{
while(i--);
}
void xianshi()
{
u16 i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0: a=0;b=0;c=0;break;
case 1: a=1;b=0;c=0;break;
case 2: a=0;b=1;c=0;break;
case 3: a=1;b=1;c=0;break;
case 4: a=0;b=0;c=1;break;
case 5: a=1;b=0;c=1;break;
case 6: a=0;b=1;c=1;break;
case 7: a=1;b=1;c=1;break;
}
P0=sumagd[i];//数目管赋值
delay(100000);//延时显示数据
P0=0x00;//清空P0空数据
}
}
void main()
{
while(1)
{
xianshi();
}
}
三、 数码管实现时钟显示
本程序利用 STC89C52 单片机的定时器中断和 4 个八段共阴极 LED 数码管,显示电路采用 LED 动态显示的方法,共阴极端由 P3 口控制,分为段选线和位选线,通过编程设计实现时钟的功能。
四个数码管的 dp 段通过 8421 码显示小时数;第一二个数码管显示分钟数,第三四个数码管显示秒数。通电并下载程序后,初试数码管显示 0000,dp 段均不亮,开始由秒计时,每过 1 秒,秒位加 1,满 60 秒,分位加 1,满 60 分,小时位加 1(最大值位为 15 时 59 分 59 秒),从而实现时钟的功能。
#include<reg52.h>
//定义使用的IO口
#define GPIO_DIG P0 //段选
sbit D1=P3^6;
sbit D2=P3^7;
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code seg[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
unsigned char xianshi[8];//保存时钟的数据
char second,minit,hours;
//段位选
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0; i<4; i++)
{
GPIO_DIG = DIG_PLACE[i]; //发送位选
D2=1;
D2=0;
GPIO_DIG = xianshi[i]; //发送段码
D1=1;
D1=0;
j = 100;
while(j--);
GPIO_DIG = 0x00;//消隐
D1=1;
D1=0;
}
}
//数码管显示
void Display ()
{
if(hours/8%2==1)
xianshi[0]=seg[minit/10]|0x80;
else
xianshi[0]=seg[minit/10];
if(hours/4%2==1)
xianshi[1]=seg[minit%10]|0x80;
else
xianshi[1]=seg[minit%10];
if(hours/2%2==1)
xianshi[2]=seg[second/10]|0x80;
else
xianshi[2]=seg[second/10];
if(hours%2==1)
xianshi[3]=seg[second%10]|0x80;
else
xianshi[3]=seg[second%10];
DigDisplay();
}
//主函数
void main()
{
second=0;
minit=0;
hours=0;
TMOD=0X01;
TH0 = 0xFC;
TL0 = 0x17; //10ms
TR0=1;
ET0=1;
EA=1;//打开总中断
while(1)
{
Display ();
}
}
//定时器中断
void time0() interrupt 1
{
static unsigned int j;
TH0 = 0xDC;
TL0 = 0x00; //10ms
j++;
if(j==100) //1s
{
j=0;
second++;
if(second==60) //秒满60清零
{
second=0;
minit++;
if(minit==60) //分满60清零
{
minit=0;
hours++;
if(hours>15)hours=0; //时满16清零
}
}
}
}