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

📄 main__.c

📁 基于AVR单片机
💻 C
字号:
#include <mega16.h>
#include <delay.h>
#include <1820.h>
/**************************************************************
timeset-----------------PD2
temperature-------------PD3
hour--------------------PD4
miniute-----------------PD5
**************************************************************/
//time[0]--------HOURS
//time[1]--------miniutes
//temperature[0]---温度百位
//temperature[1]---温度十位
//temperature[2]---温度个位 
#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;
}  
#include <mega16.h>
#define PD6 6
#define DQ_IN	DDRD &= ~(1 << PD6)		/*设置输入*/
#define DQ_OUT	DDRD |= (1 << PD6)		/*设置输出*/
#define DQ_CLR	PORTD &= ~(1 << PD6)	/*置低电平*/
#define DQ_SET	PORTD |= (1 << PD6)		/*置高电平*/
#define DQ_R	PIND & (1 << PD6)		/*读了电平*/
unsigned char flag;						/*中断标志缓存*/
/*
延时函数
延时时间:10um
CPU频率为:4MHz。
*/      
void delay_2us(void)
{  #asm("NOP");
   return;
}       
void delay_10us(unsigned char i) {

	 unsigned char j;
	
	while (i--) {   
	      j=5;
	      while(j--);	      	      		
		}
}
/*DS18B20复位函数*/
unsigned char ds1820_reset(void) {

	unsigned char i;
	flag = SREG;				/*中断保护*/
	#asm("cli")						/*关中断*/
	DQ_OUT;
	DQ_CLR;
	delay_10us(50);				/*延时500uS(480-960)*/
	DQ_SET;
	DQ_IN;
	delay_10us(8);				/*延时80uS*/
	i = DQ_R;
	delay_10us(50);				/*延时500uS(保持>480uS)*/
	if (flag & 0x80) {			/*恢复中断状态*/
		#asm("sei")
		}
	if (i) {
	  	return 0x00;
	 	}
	else {
		return 0x01;
		}
}
/*DS18B20字节读取函数*/
unsigned char ds1820_read_byte(void) {
	unsigned char i;
	unsigned char value = 0;
	flag = SREG;				/*中断保护*/
	#asm("cli")						/*关中断*/
	for (i = 8; i != 0; i--) {
		value >>= 1;
		DQ_OUT;
		DQ_CLR;
		delay_2us();					/*延时4uS*/
		delay_2us();
		
		DQ_SET;
		DQ_IN;
		delay_10us(1);					/*延时10uS*/
		if (DQ_R) {
			value|=0x80;
			}
		delay_10us(6);			/*延时60uS*/
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		#asm("sei")
		}
	return(value);
}
/*DS18B20字节写入函数*/
void ds1820_write_byte(unsigned char value) {

	unsigned char i;
	flag = SREG;				/*中断保护*/
	#asm("cli")						/*关中断*/
	for (i = 8; i != 0; i--) {
		DQ_OUT;
		DQ_CLR;
		delay_2us();					/*延时4uS*/
		delay_2us();
		if (value & 0x01) {
			DQ_SET;
			}
		delay_10us(8);			/*延时80uS*/
		DQ_SET;					/*位结束*/
		value >>= 1;
		}
	if (flag & 0x80) {			/*恢复中断状态*/
		#asm("sei")
		}
}
/*启动ds1820转换*/
void ds1820_start(void) {

	ds1820_reset();
	ds1820_write_byte(0xCC);	/*勿略地址*/
	ds1820_write_byte(0x44);	/*启动转换*/
}
/*DS8B20读取温度信息*/
unsigned int ds1820_read_temp(void) 
{
	unsigned int i;
	unsigned char buf[9];
	ds1820_reset();
	ds1820_write_byte(0xCC);	/*勿略地址*/
	ds1820_write_byte(0xBE);	/*读取温度*/
	for (i = 0; i < 9; i++) {
		buf[i] = ds1820_read_byte();
		}
	i = buf[1];
	i <<= 8;
	i |= buf[0];	
	return i;
}

⌨️ 快捷键说明

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