微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用51内部计时器做倒计时器时实际时间总是比理论慢好多

用51内部计时器做倒计时器时实际时间总是比理论慢好多

时间:10-02 整理:3721RD 点击:
大二新人一枚,刚接触51,最近发现一个很严重的问题,每次我用内部计时器来做倒计时的时候,实际经历的时长总是远远长于理论时长。比如我设定了30秒倒计时,最后可能倒了60多秒还没有倒完,求教各位大神这是为什么啊?顺便放上一个交通的灯程序,别的部分都可以实现,只有倒计时这块出了我描述的问题。
#include<reg52.h>
unsigned char code aa[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0x76,0x79,0x38,0x3f};//对应数字的数码管编码
sbit add=P2^2;                 //按键1加交通灯时间
sbit sub=P2^3;                 //按键2减交通灯时间
sbit addy=P2^4;                 //按键3加黄灯时间
sbit suby=P2^5;                 //按键4减黄灯时间
sbit confirm=P2^6;         //按键5确认
sbit can=P2^7;                 //按键6取消(重置),暂缺省
unsigned char numst=0,numyst=0,//初始设置保存变量
              num,numy,time,   //交通灯其作用时使用的变量
                          flag=1,flagc=1,count=0;//定义标志变量
void delay(int x)                 //延时函数
{
        int j;
        for(;x>0;x--)
        for(j=124;j>0;j--);       
}
void display(int num,int numy)        //数码管动态显示函数
{
        int shi,ge,shiy,gey;
        shi=num/10;
        ge=num%10;
        shiy=numy/10;
        gey=numy%10;
        P1=aa[shi];          //红绿灯显示时间
        P0=0x00;
        delay(1);
        P0=0x04;
        delay(1);
        P1=aa[ge];
        P0=0x01;
        delay(1);
        P0=0x05;
        delay(1);
        P1=aa[shiy]; //黄灯显示时间
        P0=0x02;
        delay(1);
        P0=0x06;
        delay(1);
        P1=aa[gey];
        P0=0x03;
        delay(1);
        P0=0x07;
        delay(1);               
}
//use P3 and P2^0 and P2^1 to control the lights
//P3^0 P3^2 control red1 P2^1 P3^5 control red2
//P3^1 P3^4 control        green1 P3^7 P2^0 control green2
//P3^3 control        yellow1         P3^6 control yellow2
void initial() //初始化函数
{       
    TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
}
void timeadjustment()  //时间设置函数
{
        while(1)
        {
                if(add==0)
                {
                        delay(5);
                        if(add==0)
                        {
                        delay(5);
                        numst++;
                        }
                        while(!add)
                        display(numst,numyst);
                }
       
                if(sub==0)
                {
                        delay(5);
                        if(sub==0)
                        {
                        delay(5);
                        numst--;
                        }
                        while(!sub)
                        display(numst,numyst);
                }
                if(addy==0)
                {
                        delay(5);
                        if(addy==0)
                        {
                        delay(5);
                        numyst++;
                        }
                        while(!addy)
                        display(numst,numyst);
                }
               
                if(suby==0)
                {
                        delay(5);
                        if(suby==0)
                        {
                        delay(5);
                        numyst--;
                        }
                        while(!suby)
                        display(numst,numyst);
                }
               
                if(confirm==0)
                {
                        delay(5);
                        if(confirm==0)
                        {
                        delay(5);
                        }
                        while(!confirm);
                        break;
                }
        display(numst,numyst);
        }
}
/*void cancel()         //重置函数(暂缺省)
{
    if(can==0)
        {
                delay(5);
                if(can==0)
                {
                delay(5);
                }
                while(!can);
                timeadjustment();
        }                         
}*/
void light() //交通灯控制函数
{
                if(flag==1)
                {
                        if(flagc==1)
                        {
                                P3=0x7a;
                                P2=0xfe;
                                display(num,0);
                        }
                        else
                        {
       
                                P3=0xcd;
                                P2=0xfd;
                                display(num,0);               
                        }
                 }
                 else
                 {
                            P3=0xb7;
                          P2=0xff;
                          display(0,numy);
                 }       
}
void main()
{
    void timesdjustment();
        initial();
        timeadjustment();
        num=numst;
        numy=numyst;
        TR0=1;
       
        while(1)
        {
                light();               
        }
}
void daojishi() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        count++;
        if(count==20)
        {
                if(flag==1)
                {
                num--;
                if(num==0)
                {
                num=numst;
                flagc=~flagc;
                flag=0;
                }
                }
                else
                {
                 numy--;
                 if(numy==0)
                 {
                 numy=numyst;
                 flag=1;
                 }
                }
        }       
}

没人理…………自己顶……

....居然能在这看到你.蓝一3043路过帮顶

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

网站地图

Top