我要用 89c52单片机做 一个 时钟程序 起始时间是0:00,但是 发现 定时器1的中断程序一直都不执行?

2024-11-19 05:34:55
推荐回答(2个)
回答1:

节省一点资源,只用一个定时器就够了

而且采用自装入方式定时,可以减少计时误差

试试:

#include 

sbit wei=P2^7;
sbit duan=P2^6;

unsigned char times=0,times1=0,s=0,m=0,h=0,shua=0; 
unsigned char i_x=0;  

unsigned char time[4]={0};

unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

unsigned char code tablew[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

void Deplay(unsigned char c);  //延迟函数

void XianShi();  //数码管显示函数

void Init();  //初始化函数

void Timing();  //计算分钟 小时 的数值

void main()
{
  Init();
while(1)
{
            PCON=0x01; //休眠
}
}

void Init()
{
    TMOD=0x2;  //方式2:8位自装入
    TH0=0x6;  //基础定时250us
    TL0=0x6;
    TR0=1;
    ET0=1;
    EA=1;
}

void Delay(unsigned char c)   //延迟函数
{
    unsigned char i;
    while(c--)
    {
        for(i=0;i<200;i++);
    }
}

void flash() interrupt 1  //计时器 动态刷数码管
{
    if(++times>=20)  //定时5ms
    {
        times=0;
        if(++times1>=200)//定时1秒
        {
            times1=0;
            Timing();//计时+1秒
        }       
        XianShi();//逐位显示
    }
}

void XianShi() //数码管逐位显示
{
    unsigned char dis_Num;
    if(++i_x>3)
    {
        i_x=0;
        P0=tablew[i_x]; //位选 第几个 数码管亮
wei=1;
wei=0;

        dis_Num=time[i_x];
        P0=table[dis_Num]; //段选 此数码管该亮什么图案
        duan=1;
        duan=0;
        //Delay(1);
    }
}

void Timing()
{
if(++s>=60)
    {
        s=0;
        if(++m>=60)
        {
            m=0;
            if(++h>=24)h=0;
        }
    }   
time[0]=h/10;
time[1]=h%10;

time[2]=m/10;
time[3]=m%10;
}

回答2:

没有具体实验,只是估计为程序只在忙活T0中断了,顾不上T1了,建议定时器初始化程序中设置下T1中断优先,如果能改善的话就是了,如果影响到显示的扫描,就用延时函数来控制动态扫描