微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 自己想的一个定时器,求建议

自己想的一个定时器,求建议

时间:10-02 整理:3721RD 点击:
/*最长定时为60分;四位数码管显示,数码管是共阴数码管*/
#include<reg52.h>
sbit fm=P2^3;
sbit du=P2^6;
sbit we=P2^7;
sbit s8=P3^1;
sbit k1=P3^4;
sbit k2=P3^5;
sbit k3=P3^6;
sbit k4=P3^7;
unsigned char k,j,we1,we2,we3,we4,a,b,c,d,miao,miao1,miao2,fen1,fen2,pp;
int fen;
unsigned char code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
void delay(unsigned char i)
{
  for(i=i;i>0;i--)
    for(j=125;j>0;j--);
}
  void display(a,b,c,d)  //四位数码管显示
  {
          du=1;    //高电平开数码管段的译码器        
    P0=table[a];
        du=0;    //低电平关数码管的段译码器把段锁存
        P0=0xfe;  //1111 1110 选择位1数码管
        we=1;     //把位译码器打开
        we=0;     //把位译码器锁存
        delay(5);
        du=1;
    P0=table[b];
        du=0;
        P0=0xfd;
        we=1;
        we=0;
    delay(5);
        du=1;
    P0=table[c];
        du=0;
        P0=0xfb;
        we=1;
        we=0;
        delay(5);
        du=1;
    P0=table[d];
        du=0;
        P0=0xf7;
        we=1;
        we=0;  
        delay(5);
}
   void main()
   {
    we1=0;
    we2=0;
    we3=0;
    we4=0;
       while(1)          //设定时间
           {
           if(k1==0)     //如果按下K1
                   {
            while(!k1);  //当放开K1时
            we1++;       //we1加1
                        if(we1==7)we1=0;
                   }
                   if(k2==0)
                   {
                        while(!k2);
            we2++;
                        if(we2==10)we2=0;
                                             }
           if(k3==0)
                   {
                        while(!k3);
            we3++;
                    if(we3==7)we3=0;
                   }
           if(k4==0)
                   {while(!k4);
            we4++;
                        if(we4==10)we4=0;
                   }
                       a=we1;
                       b=we2;
                       c=we3;
                       d=we4;
               display(a,b,c,d); //数码管显示设定的时间
     if(s8==0)       //如果按下S8
     {
                while(!s8);  //当放开S8时
        TMOD|=0x01;  //定时器0为工作方式1
        TH0=(65536-46080)/256; //所用的晶振为11.0592,设定计时50ms
        TL0=(65536-46080)%256;
        EA=1;
        TR0=1;
        ET0=1;
        miao=we3*10+we4;
        fen=we1*10+we2;
                if(miao==0&&fen==0)//如果秒和分同时为0,这种情况为不设定时间就开始计时
                   while(1)
                         {
                          du=1;    //数码管全亮
                          P0=0XFF;
                          du=0;
                          P0=0X00;
                          we=1;
                          we=0;
                          fm=0;  //蜂鸣器持续报警
                     }
                 while(1)   
                                 {
                          if(miao==0&&fen==0)  //这种情况和上个情况不一样;是设定了初值后倒计时完成
                                while(1)
                                          {
                                           du=1;
                                       P0=0XFF;
                                           du=0;
                                           P0=0X00;
                                           we=1;
                                           we=0;
                                           fm=0;
                                          }
                            if(TF0==1)   //当50ms时间到
                                                {
                                 TF0=0;      //TF0重置0
                                 pp++;      
                                     TH0=(65536-46080)/256;
                                     TL0=(65536-46080)%256;
                              if(pp==20)  //当PP加到20次时,所用时间为1S
                                                  {
                            if(fen!=0&&miao==0) //这时如果分不为0,秒为0的话,比如fen为2,秒为0
                                                        {
                                          fen--;           //分减1,得1
                                             miao=60;          //秒被赋值60
                                                        }
                            miao--;            //秒减1得59
                                         pp=0;              //PP重置0,等待计时器再次到来,PP加到20,进行下次循环秒再次减1,以次 类推
                                                  }
                                                }
       miao1=miao%10;//秒除以10的余数的值赋给miao1,miao1是秒的个位;比如说48除以10的余数得8
       miao2=miao/10;//秒除以10 的商的值赋给miao2,miao2是秒的十位;48除以10的商得4
       fen1=fen%10;
       fen2=fen/10;
       du=1;
       P0=table[miao1];
       du=0;
       P0=0xf7;
       we=1;
       we=0;
           delay(6);
       du=1;
       P0=table[miao2];
       du=0;
       P0=0xfb;
       we=1;
       we=0;
           delay(6);
       du=1;
       P0=table[fen1];
       du=0;
       P0=0xfd;
       we=1;
       we=0;
           delay(6);
       du=1;
       P0=table[fen2];
       du=0;
       P0=0xfe;
       we=1;
       we=0;
           delay(6);
                }       
       }
    }
}




多多少少三天终于调试好了,,太有成就感了

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

网站地图

Top