这个是学校单片机上机考试的一个例题,自己简单编了一下。
上方是一个简单的原理图,利用的是共阳极的八位数码管。
下方就直接附上程序。
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar code t[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar code seg1[]={0xa4,0xc0,0xa4,0xb0,0xf9,0xa4,0xa4,0x80};//20231228
uchar list[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
uchar seg2[8]={0xa4,0xb0,0xbf,0x92,0x90,0xbf,0x92,0xc0}; //重点,如果数组里的数需要改变的话,不能定义为uchar code ,23-59-50
uchar a=23,b=59,c=50;//a存储小时,b存储分钟,c存储秒
uchar a1,a2,b1,b2,c1,c2;//a1,a2存储小时拆分成十位和个位,其他同理
uchar temp=0;//存储50ms的计数值,满20使秒数进1
void delayXms(uint x)
{
uchar j;
while(x--)for(j=0;j<125;j++){;}
}
void int0() interrupt 1 using 1
{
TH0=0x3c; //定时值50ms
TL0=0xb0;
temp++;
if(temp==20)
{
temp=0;
c++;
c1=c/10;
c2=c%10;
seg2[6]=list[c1];
seg2[7]=list[c2];
if(c==60)
{
c=0;
c1=c/10; //重新对于c清零后的数组赋值
c2=c%10;
seg2[6]=list[c1];
seg2[7]=list[c2];
b++;
b1=b/10;
b2=b%10;
seg2[3]=list[b1];
seg2[4]=list[b2];
if(b==60)
{
b=0;
b1=b/10; //重新对于b清零后的数组赋值
b2=b%10;
seg2[3]=list[b1];
seg2[4]=list[b2];
a++;
a1=a/10;
a2=a%10;
seg2[0]=list[a1];
seg2[1]=list[a2];
if(a==24)
{
a=0;
a1=a/10; //重新对于a清零后的数组赋值
a2=a%10;
seg2[0]=list[a1];
seg2[1]=list[a2];
}
}
}
}
}
void main(void)
{
uchar i;
TMOD=0x01;
EA=1;
ET0=1;
TH0=0x3c; //定时值50ms
TL0=0xb0;
TR0=1;
while (1)
{
if(c2>=0&&c2<5)
{
for(i=0;i<8;i++)
{
P2=t[i];
P0=seg2[i];
delayXms(3);
}
}
if(c2>=5&&c2<=9)
{
for(i=0;i<8;i++)
{
P2=t[i];
P0=seg1[i];
delayXms(3);
}
}
}
}