各位路过的朋友过来看看,以STC89C52单片机控制数码管显示 时-分-秒 问题

2024-12-02 22:14:18
推荐回答(3个)
回答1:

#include

#define _TH0_TL0_ (65536 - 50000)
#define HI (_TH0_TL0_ / 256) //给高8位赋值
#define LO (_TH0_TL0_ % 256) //给低8位赋值
#define M 20 //(1000/50)1秒要50个中断的累计

sbit wei1=P2^0;
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;
sbit wei5=P2^4;
sbit wei6=P3^3;

unsigned char hour = 12, min = 0, sec = 0; //初始化时分秒的值
unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字

///////////////////////////////////////////////////
void delay(unsigned long time)
{
while(time--);
}
//////////////////////////////////////////////////
void Disp(void)//数码管显示
{
wei6 = 1;//第一个数码管显示时的十位
P0 = SEG_TAB[ hour / 10 ];
delay(60);
wei6 = 0;

wei5 = 1;//第2个数码管显示时的个位
P0 = SEG_TAB[ hour % 10 ]&0x7F;
delay(60);
wei5 = 0;

wei4 = 1;//第4个数码管显示分的十位
P0 = SEG_TAB[ min / 10 ];
delay(60);
wei4 = 0;

wei3 = 1;//第5个数码管显示分的个位
P0 =SEG_TAB[ min % 10 ]&0x7F;
delay(60);
wei3 = 0;

wei2 = 1;//第7个数码管显示秒的十位
P0 = SEG_TAB[ sec / 10 ];
delay(60);
wei2 = 0;

wei1 = 1;//第8个数码管显示秒的各位。
P0 = SEG_TAB[ sec % 10 ];
delay(60);
wei1 = 0;
}

void IsrTimer0(void) interrupt 1 using 1 //定时器0中断服务程序
{
static unsigned char count = 0; //定义静态变量count

TR0 = 0; //以下调整出栈入栈的时间误差
TL0 += (_TH0_TL0_ + 9) % 256;
TH0 += (_TH0_TL0_ + 9) / 256 + (char)CY;
TR0 = 1;

count++;
if(count == M)//1秒种时间到
{
count = 0;
sec++;
if(sec == 60)//1分钟时间到
{
min++;
sec = 0;
if(min == 60)//1小时时间到
{
hour++;
min = 0;
if(hour == 24)//24小时时间到
{
hour = 0;
min = 0;
sec = 0;
}
}
}
}//if
}

void Timer0Init(void) //初始化定时器0程序
{
TMOD = 0x01; //设置模式1 定时器0 工作方式0

TH0 = HI; //给TH0,TL0赋初始值
TL0 = LO;

TR0 = 1; //启动定时器0
ET0 = 1; //定时器中断开
EA = 1; //总中断开
}

void main(void)//主函数
{
Timer0Init();//初始化定时器0

while(1)
{
Disp();//显示时间
}
}

回答2:

如果要求精度的话就要用专门的时钟芯片,不要求精度就直接用定时器中断来做就可以了

回答3:

我这有个proteus仿真,要不?