微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 自己做了一个简易时钟,但是为什么数码管走一秒等于现实的三秒?求大神指导

自己做了一个简易时钟,但是为什么数码管走一秒等于现实的三秒?求大神指导

时间:10-02 整理:3721RD 点击:
#include <reg51.h>      //添加头文件
#define uint unsigned int   
#define uchar unsigned char
uchar H,M,S,count=0;     //时分秒
uchar DAT[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};    //共阴数码管编码0~9
void delay(unsigned int i)
{
    char j;
    for(i; i > 0; i--)
        for(j = 200; j > 0; j--);
}
void judge()   //改变时分秒的值,使分秒都为60进制,时为24进制
{
if(S==60)
{
S=0;
M++;
}
if(M==60)
{
M=0;
H++;
}
if(H==24)
H=0;
}
void show()   //显示函数,P2为位选,P0为段选
{
                P2=0X7F;
                P0=DAT[H/10];
                delay(50);    //第一位选中时,显示时的高位,延时下   
                P2=0XBF;
                P0=DAT[H%10];
                delay(50);    //第二位选中时,显示时的低位,延时下
                P2=0XDF;
                P0=0X40;
                delay(50);         //第三位选中时,显示“-”,延时下
                P2=0XEF;
                P0=DAT[M/10];
                delay(50);    //第四位选中时,显示分的高位,延时下
                P2=0XF7;
                P0=DAT[M%10];
                delay(50);    //第五位选中时,显示分的低位,延时下
                P2=0XFB;
                P0=0X40;
                delay(50);         //第六位选中时,显示“-”,延时下
                P2=0XFD;
                P0=DAT[S/10];
                delay(50);    //第七位选中时,显示秒的高位,延时下
                P2=0XFE;
                P0=DAT[S%10];
                delay(50);    //第八位选中时,显示秒的低位,延时?
}
void main()    //主函数
{
                TMOD=0X01;    //定时器0工作在方式1
                TH0=(65536-50000)%256;     
                TL0=(65536-50000)/256;    //设置定时器的初值,使得定时时间为50ms(晶振为12MHZ时)
                EA=1;        //开启总中断
                ET0=1;       //允许定时器0中断
                TR0=1;       //开启定时器0
                while(1){
                show();      //一直执行显示函
}
}
void timer0()interrupt 1  //定时器0中断服务程序
{
TH0=(65536-50000)%256;     
TL0=(65536-50000)/256;           //重新设置初值
count++;          //每中断一次,计数寄存器加1
if(count==4)     //当定时20次时,即50MS*20=1000ms=1s
{
count==0;         //将计数值重新归零
S++;
judge();          //修改时分秒的值
}

隐患:if(count==4)     //当定时20次时,即50MS*20=1000ms=1s
错误:count==0;         //将计数值重新归零

void timer0()interrupt 1  //定时器0中断服务程序
{
    TH0=(65536-50000)%256;     
    TL0=(65536-50000)/256;           //重新设置初值
    count++;          //每中断一次,计数寄存器加1
    if(count>=4)     //当定时20次时,即50MS*20=1000ms=1s
    {
        count=0;         //将计数值重新归零
        S++;
        judge();          //修改时分秒的值
    }
}

TH0=(65536-50000)%256;     
TL0=(65536-50000)/256;           //重新设置初值
这两个写反了吧

void timer0()interrupt 1  //定时器0中断服务程序
{
        TH0=(65536-50000)/256;      
        TL0=(65536-50000)%256;          //重新设置初值
        count++;          //每中断一次,计数寄存器加1
        if(count>=20)     //当定时20次时,即50MS*20=1000ms=1s
        {
                count=0;         //将计数值重新归零
                S++;
                judge();          //修改时分秒的值
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top