⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c~

📁 基于AVR单片机
💻 C~
字号:
#include <mega16.h>
#include <delay.h>
#include <1820.h> 
/*******************功能原理***********************************
一共有4个键,
时间设定键:在RUN模式,即正常工作状态,电风扇转动,按下时如果
时间设定标志位为1,就关闭定时功能,否则就置位时间设定标志位。
时间寄存器清零。如果按下时,模式为设定时间状态就进入RUN正常工作中去。
温度设定:在RUN模式下,按下时若温度控制标志位为1就关闭温度控制,归零,
否则置位;如果原来模式是温度设定过程,就进入RUN中。
时,温度十位键:时间设定状态,‘时’+1;在温度设定状态,'十位+1;
在RUN状态,显示时间标志位置1;
/**************************************************************
timeset-----------------PD2
temperature-------------PD3
hour--------------------PD4
miniute-----------------PD5
**************************************************************/
//time[0]--------HOURS
//time[1]--------miniutes
//temperature[0]---温度百位
//temperature[1]---温度十位
//temperature[2]---温度个位
//temperature[3]---温度小数
#define TEMPERATURE_SET  1
#define TIME_SET         2
#define RUN              3
#define time_page        1
#define T_page           2
flash  unsigned char led_7[10]={0,0,0,0,0,0,0};
flash  unsigned char position[4]={0,0,0,0};
unsigned char T;
unsigned char timeMAX;
unsigned char TMAX;
unsigned char time[3]={0,0,0};
unsigned char time_v=0;
unsigned char posit;
unsigned char temperature[4]={0,0,0,0};
unsigned char dis_buff[4]={0,0,0,0}; 
unsigned char mode;
int time_counter=0;
bit time_10s_ok=0;
bit time_1s_ok=0;
bit time_control_flag=0;
bit point_on=0;
bit T_control_flag=0;
bit time_dis_flag=1;
unsigned char get_temperature(void);
void stop_fan(void);
void time_to_disbuffer (void);
void display(unsigned char page);
unsigned char get_temperature()
{       
                unsigned int i;
                unsigned char j;
                ds1820_reset();						/*复位D18B20*/
	        ds1820_start();					/*启动一次转换*/
		delay_ms(1000);							/*等待转换结束*/
		i = ds1820_read_temp();			       				/*读取温度数值*/  		                
                i = (i * 10) / 16;
                j=(unsigned char )i/10;	                
		 		/*将显示信息加载到显示缓存区*/	
		temperature[0] = (char)(i /1000); //十位 			
		temperature[1] = (char)(i %1000/ 100); //十位		
		temperature[2] = (char)(i %100/ 10);//个位
		temperature[3] = (char)(i % 10);   //小数位
		return j; 
}

void main (void )
{
   unsigned char  buttons     = 0;
   unsigned char  buttons2    = 0;
   while( 1 )//功能键连接端口
   {
      buttons =  PIND  & 0x3C;  
      delay_ms(10);
      buttons2 =  PIND  & 0x3C;		
      if( ( buttons == buttons2 ) && ( buttons != 0x3C ) )
      { 
          while( ( PIND  & 0xF0 ) != 0x3C ); // wait for button release 
         switch( buttons )
         {
           case 0x38  :             //PD2按下timeset
           if(mode==TIME_SET)
             {
              time_control_flag=1;
              mode=TEMPERATURE_SET;
             }
           else if (mode==RUN)
           {
                   if(time_control_flag)
                   {
                    #asm("cli");
                    time_control_flag=0;
                    time_v=0;
                    time[0]=0;
                    time[1]=0;
                    time[2]=0;
                    dis_buff[0]=0;
                    dis_buff[1]=0;
                    dis_buff[2]=0;
                    dis_buff[3]=0;
                    }
                    else
                     mode=TIME_SET;
           }         
           break;
           
           case 0x34 :                         //PD3  温度设定temperature_set
           if (mode==TEMPERATURE_SET)
            {
             T_control_flag=1;
             TMAX=temperature[1]*10+temperature[2];         
             mode=RUN; 
            }
             else if(mode==RUN)
              {
                 if(T_control_flag)
                 {
                  T_control_flag=0;
                 }
                  else
                   mode=TEMPERATURE_SET;
              }
           break;
           
           case 0x2C :                     //PD4时间‘时’设定
           if (mode==TIME_SET)
              {
               time[0]++;
               if (time[0]>24)
                 time[0]=0;
               time_to_disbuffer();
              }
           else if (mode==TEMPERATURE_SET)
                  {
                   temperature[1]++;
                   if(temperature[1]>9)
                     temperature[1]=0;
                   }
                   else //mode==RUN
                       time_dis_flag=1;
           break;
           
           case 0x1C :                    //PD5时间‘分’设定
           if (mode==TIME_SET)
              {
               time[1]++;
               if (time[1]>60)
                 time[1]=0;
                 time_to_disbuffer();
              }
           else if (mode==TEMPERATURE_SET)
                  {
                   temperature[2]++;
                   if(temperature[2]>9)
                     temperature[2]=0;
                   } 
                   else //mode==RUN
                       time_dis_flag=0; 
           break;
           default : break;
         }
       }      
//每10S检测一次温度,若温度低于设定值就关闭风扇
//温度控制一直有,要是不想温度控制,可以把温度下限设置很高,比如50度       
          if(time_10s_ok)
          { 
           time_10s_ok=0;
           T=get_temperature();
           if(T_control_flag)
           {
            if (T<TMAX)
              {
               #asm("cli");
               stop_fan();
              }
            }
          }      
 //检测时间,如果时间超过定时上限,就关闭风扇。由于定时功能可有可没有,
 //所以要检测定时标志位      
        if(time_control_flag)
        { 
         if( time_v>timeMAX)
          { 
            #asm("cli");
            stop_fan();
          } 
         }
   }
} 
void time_to_disbuffer (void)
{
   dis_buff[0]=time[0]/10;
   dis_buff[1]=time[0]%10;
   dis_buff[2]=time[1]/10;
   dis_buff[3]=time[1]%10;
}
void stop_fan(void)
{
  PORTD&=~0x80; 
}  
interrupt [TIM0_COMP] void timer0_comp_isr (void)
{     //2ms计时器
         if(time_dis_flag)
          display(time_page);
          else 
            display(T_page);        
          if (++time_counter>=500)  //1s 
              {
             time_counter=0;
             time_1s_ok=1;                       
                   if (++time[2] >=60) 
                   { 
                   time[2]=0;
                     if (++time[1] >=60) //time 1 是分
                        {
                         time[1]=0;
                             if (++time[2] >=99)
                                time[1]=0;
                         }
                   }
               }
}

void display(unsigned char page)
{
  
    PORTC=0xff;
    if(page==time_page)
     { 
       PORTA=led_7[dis_buff[posit]];
       if(point_on&&posit==1)     PORTA|=0x80; 
     }
    else if(page==T_page )
         { 
           PORTA=led_7[temperature[posit]];
           if(posit==1)     PORTA|=0x80;
         } 
      PORTC=position[posit];
     if(++posit>=4)    posit=0;
}  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -