微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 温度计和秒表不知道该怎么弄写 ,求帮忙 !

温度计和秒表不知道该怎么弄写 ,求帮忙 !

时间:10-02 整理:3721RD 点击:
我要做的是只能电子钟   有秒表,日期,时钟  闹钟  温度计       ,但是温度计和秒表不知道该怎么弄写 ,求帮忙  !(下面我的已经实现时钟 闹钟  日期的显示和调节   )


#include <REGX51.H>
#define uchar unsigned char
#define uint  unsigned int
//可位寻址单元的位定义
sbit LE1= P2^0;
sbit LE2= P2^1;
sbit KEY1= P2^2;
sbit KEY2= P2^3;
sbit KEY3= P2^4;
sbit KEY4=P2^5;
sbit SPEAK= P2^6;
sbit KEY5= P2^7;


//共阳LED显示代码
uchar LED_Duanxuan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
                     0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};
//共阴LED显示代码
uchar LED_Duanxuan1[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
                     0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//LED位选
uchar LED_weixuan[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//显示缓冲区
uchar LED_DIS[8]={0,0,0,0,0,0,0,0};
uchar LED_Saomiao =0;
uchar time_50ms,i=0;
uchar second,minute,hour,minute1,day,mon,year,alhour,almin,alsecond;
uchar number_key;
void delay(void);          //延时程序
void display(void);

void key_process(void);    //按键处理程序
void Initialize(void);
int Leepyear(unsigned int year);   
void Initialize(void)
{
   second = 0;                              //秒
   minute = 0;                                  //分
   hour = 0;       
   day = 1;                                          
   mon = 1;                                          
   year = 0;                          
   number_key = 0;                          //按键次数
   TH0=(65536-50000)/256;          //定时50ms
   TL0=(65536-50000)%256;
   EA = 1;                             //开中断总开关;
   ET0 = 1;                                 //允许定时器0中断开关;
   TR0 = 1;                                         //启动定时器T0;
   LED_DIS[0] = LED_Duanxuan[0];        //显示缓冲区初始化
   LED_DIS[1] = LED_Duanxuan[1];
   LED_DIS[2] = LED_Duanxuan[2];
   LED_DIS[3] = LED_Duanxuan[3];
   LED_DIS[4] = LED_Duanxuan[4];
   LED_DIS[5] = LED_Duanxuan[5];
   LED_DIS[6] = LED_Duanxuan[6];
   LED_DIS[7] = LED_Duanxuan[7];       
}

void key_process(void)
{
    KEY1 = 1;
   KEY2 = 1;
   KEY3 = 1;   
   if(KEY4==1&&KEY5==1)      
  {if(KEY1 == 0)              
   {
      (minute ==59)?(minute = 0):(minute++);
          while(KEY1 == 0) display();         //等待按键释放;
   }
   if(KEY2 == 0)              
   {
      (hour ==23)?(hour = 0):(hour++);
          while(KEY2 == 0) display();         //等待按键释放;
   }
   if(KEY3==0)
        {(second==59)?(second=0):(second++) ;
        while(KEY3==0)display();
        }
}         
  if(KEY4==0&&KEY5==1)
  {if(KEY1==0)
  {  (day ==31)?(day = 1):(day++);
          while(KEY1 == 0) display();       
  }
  if(KEY2 == 0)              
   
      {(mon ==12)?(mon= 1):(mon++);
          while(KEY2 == 0) display();
  }       
              
           if(KEY3==0)
   {
      (year==99)?(year=0):(year++);
          while(KEY3==0)  display();
   }
}                 
                     if(KEY4==1&&KEY5==0)
        {if(KEY1 == 0)                                      //闹钟时分修改
   {
      (almin ==59)?(almin = 0):(almin++);
          while(KEY1 == 0) display();         
   }
   if(KEY2 == 0)              
   {
      (alhour ==23)?(alhour = 0):(alhour++);
          while(KEY2 == 0) display();     
   }       
                }
                }
                 void alarm()
{if((hour==alhour)&&(minute==almin))          
        SPEAK=1;

        if (KEY4==0&&KEY5==0)                                 
        while(KEY4==0&&KEY5==0) display();
        SPEAK=0;                 
}
void main(void)                                                                         
{
   
     Initialize();         
         while(1)
         {
       display();             //调用显示程序
           key_process();         //调用按键处理程序
                   alarm() ;
         }

}
void display(void)                       //动态扫描显示
{
        uint temp=100;
        LED_Saomiao++;
        if(LED_Saomiao == 8) LED_Saomiao=0;
       
        P0 = LED_weixuan[LED_Saomiao];          //位选
        LE2 = 1;
        LE2 = 0;
       
        P0 = LED_DIS[LED_Saomiao];                 //段选
        LE1 = 1;
        LE1 = 0;
       
        while(temp--);

}
void timing(void) interrupt 1            //定时器T0中断,50ms中断一次
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        time_50ms++;
        if(time_50ms==200)               
        {
          time_50ms = 0;
          second++;                           //秒加1;
          
          if(second==60)
          {
            second = 0;
                minute++;                           //分钟加1;
               
                if(minute==60)
                {
                  minute = 0;
                  hour++;
                  if(hour == 24)
                  {
                    hour = 0;
                        day++               ;
                  }
                  if(mon==2&&day==29&&!Leepyear(year))                   
                         {day=1;
                         mon++;}                  
       
                  if(mon==2&&day==30&&Leepyear(year))                  
                          {day=1;
                          mon++;}
                  if((mon==4|mon==6|mon==9|mon==11)&&day==31)
                     {day=1;
                         mon++;}
                  if((mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)&&day==32)
                         {day=1;
                           if(mon==12)
                            {mon=1;
                                year++;}
                           else
                            mon++;         }
                }
          }
        }
        if(KEY4==1&&KEY5==1)
   
        {LED_DIS[0] = LED_Duanxuan[hour/10];            //时
        LED_DIS[1] = LED_Duanxuan[hour%10];
          
        LED_DIS[2] = 0xBF;                            //-
        LED_DIS[3] = LED_Duanxuan[minute/10];   //分
        LED_DIS[4] = LED_Duanxuan[minute%10];
       
        LED_DIS[5] = 0xBF;                            //-
        LED_DIS[6] = LED_Duanxuan[second/10];   //秒
        LED_DIS[7] = LED_Duanxuan[second%10];
       
}
          if(KEY4==0&&KEY5==1)
        {LED_DIS[0] = LED_Duanxuan[year/10];            
        LED_DIS[1] = LED_Duanxuan[year%10];
          
        LED_DIS[2] = 0xBF;                           
        LED_DIS[3] = LED_Duanxuan[mon/10];   
        LED_DIS[4] = LED_Duanxuan[mon%10];
       
        LED_DIS[5] = 0xBF;                            
        LED_DIS[6] = LED_Duanxuan[day/10];   
        LED_DIS[7] = LED_Duanxuan[day%10];
       
                }
                if(KEY4==1&&KEY5==0)
        {LED_DIS[0] = LED_Duanxuan[alhour/10];            
        LED_DIS[1] = LED_Duanxuan[alhour%10];
          
        LED_DIS[2] = 0xBF;                            
        LED_DIS[3] = LED_Duanxuan[almin/10];   
        LED_DIS[4] = LED_Duanxuan[almin%10];
       
        LED_DIS[5] = 0xBF;                            
        LED_DIS[6] = LED_Duanxuan[alsecond/10];   
        LED_DIS[7] = LED_Duanxuan[alsecond%10];       
    }
        }
                                int Leepyear(unsigned int year)
       {
           if (year%4==0)          
           return 1;
           else
             return 0;
      }

爱莫能助,不过帮你顶一下~~~

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

网站地图

Top