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

📄 main.c

📁 我学习AVR的代码例子
💻 C
📖 第 1 页 / 共 2 页
字号:
		   a=a-Old_hours;
		   if(a==24) a=0;
		   if(Tov1==0xff) Tov1=1;
		   c=a/10;
		   if(c==0) c=10;
		   SENDCOMB(0x2c);                           //Write address
           SendByte(pgm_read_byte(S+c)|(Fuse1<<4));     //write data
	       SendByte(pgm_read_byte(S+a%10)|(Fuse2<<4));     //write data
		   SendByte(pgm_read_byte(S+b/10)|(Tov1<<4)); 
	       SendByte(pgm_read_byte(S+b%10)); //write data	
		   if(Tov1==1) Tov1=0xff;
		   return;
		 }
	   if(Sign1==1)
		 {
	       Sign1=0;
		   Old_hours=a;
	       Old_minutes=b;
		 }
	   a=Old_hours/10;
	   b=Old_minutes/10;
	   if(a==0) a=10;
	  // if(b==0) b=10;	            
	   SENDCOMB(0x2c); /*                         //Write address
       SendByte(S[a]|(Fuse1<<4));   //write data
	   SendByte(S[Old_hours%10]|(Fuse2<<4));   //write data
	   SendByte(S[Old_minutes/10]|(1<<4)); //write data
	   SendByte(S[Old_minutes%10]);        //write data*/
	   SendByte(pgm_read_byte(S+a)|(Fuse1<<4));   //write data
	   SendByte(pgm_read_byte(S+Old_hours%10)|(Fuse2<<4));   //write data
	   SendByte(pgm_read_byte(S+Old_minutes/10)|(1<<4)); //write data
	   SendByte(pgm_read_byte(S+Old_minutes%10));        //write data
	   return;
     }
 }
void disp1(void)
  {
    SENDCOMB(0x1c);                            //write address
    SendByte(pgm_read_byte(S+tmp_old[0]/10));            //write data
    SendByte(pgm_read_byte(S+tmp_old[0]%10));            //write data
	
	SENDCOMB(0x0c);                            //write address
    SendByte(pgm_read_byte(S+tmp_old[1]/10)|(sign2<<4)); //write data
    SendByte(pgm_read_byte(S+tmp_old[1]%10));          //write data 
  }
void Done_adc1(void)//温度采集数据处理
 {   
   float r1;
   volatile signed char Tmp;                      //温度值                                         
   if(ADC_rel>=949) Tmp=-30;
   else if(ADC_rel<=181) Tmp=70;
   else 
     {
	   r1=(float)10/((float)1024/ADC_rel-1);
       if(r1>=28.46)               //-30~0
         {
           Tmp=-0.000031*r1*r1*r1+0.009489*r1*r1-1.155047*r1+25.894894;
         }
       if(r1>=8.264 && r1<28.46)   //0~30
         {
           Tmp=-0.002114*r1*r1*r1+0.166363*r1*r1-5.233344*r1+62.928421;
         }
       if(r1<8.264)                //30~70
         {
           Tmp=-0.13*r1*r1*r1+2.81*r1*r1-24.06*r1+109.99;
         }
	 } 
   if(ADC_mux==0)
     {
	   if(Tmp<0)  tmp_rel[0]=0;
	   else tmp_rel[0]=(WORD)(Tmp);
	   //tmp_rel[0]=((tmp_rel[0]<<1)+(tmp_old[0]<<3))/10;
	   tmp_old[0]=tmp_rel[0];
	 } 
   if(ADC_mux==1)
     {
	   if(Tmp<0)  {tmp_rel[1]=(WORD)(-Tmp);sign2=1;}
	   else {tmp_rel[1]=Tmp;sign2=0;}
	   //tmp_rel[1]=((tmp_rel[1]<<1)+(tmp_old[1]<<3))/10;
	   tmp_old[1]=tmp_rel[1];
	 }
   WDR();
 }
//#pragma interrupt_handler int1_isr:3
//void int1_isr(void)
SIGNAL(SIG_INTERRUPT1)
 {
   int1_off();/*
   disp_init();
   WDT_init();
   ADCSRA |=(1<<ADEN);*/
 }
//#pragma interrupt_handler timer2_ovf:5
//void timer2_ovf(void)
SIGNAL(SIG_OVERFLOW2)
 {
   //CLI();
   TCNT2=0x64;
   Tov2++;
   if(Tov2>10)
     {
	   ADCSRA |=(1<<ADSC);
	   Tov2=0;
	   WDR();
	 }  
   //SEI();   
 }
//#pragma interrupt_handler timer1_ovf:9
//void timer1_ovf(void)                    //位闪动即修改
SIGNAL(SIG_OVERFLOW1)
 {
   //CLI();
   TCNT1H=0xc2;
   TCNT1L=0xf7;
   TCCR1B=0x04;
   T++;
   if(Tov1==0xff) Tov1=0;
   else Tov1=0xff;
   if(N==3) N=0;
   if(M[0]==3) M[0]=1;
   if(M[1]==2) M[1]=0;
   Gettime();
   disp();
   disp1();
   WDR(); 
   //SEI();
 }
//#pragma interrupt_handler timer0_ovf:10
//void timer0_ovf(void)
SIGNAL(SIG_OVERFLOW0)
 {
   //CLI();
   TCNT0=6;
   Tov0++;  
   if(Tov0>500)
     {
	   if(N!=2)
	     {
		   if(M[0]!=0) M[0]=0;
	       if(M[0]==0) N=0;
		 }
	   Tov0=0;
	 }
   WDR();
   //SEI();   
 }
//#pragma interrupt_handler adc_isr:15   
//void adc_isr(void)                    //ADC完成中断
SIGNAL(SIG_ADC)
 {
   WORD adc;
   adc=(WORD)(ADCH<<8)+ADCL;
   ADC_rel+=adc&0x3ff;
   if (ADC_ov<15) ADC_ov++;
   else
     {
       ADC_rel=ADC_rel>>4;       //16点平均滤波
	   Done_adc1();              //转换完数据处理 
	   if(ADC_mux==0) ADC_mux=1;
	   else ADC_mux=0;
	   ADMUX=(1<<REFS0) | (ADC_mux&0x07);//选择外部AVCC为基准
	   ADC_rel=0;
	   ADC_ov=0;
	 }     
   WDR();
   //SEI();  
   return;	
 }
/*-- N为当前显示状态 -- 0,3显示时间,1显示日期,2时间记录 --*/
/*-- M为位闪耀状态 -- 0未闪耀,1低位,2高位 --*/
void Done_C(void)//'+'键处理
 {
   if(N==0) 
     {
	   if(M[0]==1)
	     {
		   i2c_Write(0,0);
		   minutes=DEC(minutes);
	       minutes++;                        
           if(minutes>59) minutes=0;
           i2c_Write(BCD(minutes),1);                
		   return;
		 }
       if(M[0]==2)
	     {
		   hours=DEC(hours);
		   hours++;
           if(hours>23) hours=0;
           i2c_Write(BCD(hours),2);
		   return;
		 }
	   return;
	 }
   if(N==1) 
     {
	   if(M[0]==1)
		 {
		   date=DEC(date);
		   date++;
           if(date>31) date=1;
           i2c_Write(BCD(date),4);
		   return;
		 }
	   if(M[0]==2)
	     {
		   month=DEC(month);
		   month++;
           if(month>12) month=1;
           i2c_Write(BCD(month),5);
		   return;
		 }
	   return;         
     }
   return;
 }
//'-'键处理
void Done_D(void)
 {
   if(N==0) 
     {   
	   if(M[0]==1)
	     {
		   i2c_Write(0,0);
	       minutes=DEC(minutes);
		   minutes--;
           if(minutes<0) minutes=59;
           i2c_Write(BCD(minutes),1);                
		   return;
		 }
	   if(M[0]==2)
	     {
		   hours=DEC(hours);
		   hours--;
           if(hours<0) hours=23;
           i2c_Write(BCD(hours),2);
		   return;
		 }
       return;
	 }     
   if(N==1) 
     {
	   if(M[0]==1)
	     {
		   date=DEC(date);
		   date--;
           if(date<0) date=31;
           i2c_Write(BCD(date),4);
		   return;
		 }
	   if(M[0]==2)
	     {
		   month=DEC(month);
		   month--;
           if(month<0) month=12;
           i2c_Write(BCD(month),5);
		   return;
		 }    
		return; 
	 }
   return;
 }
int main(void)
 {
   volatile BYTE i;
   port_init();
   disp_init();
   I2C_init();
   //time_init();
   adc_init();
   T_init();
   int1_off();
   //WDT_init(); 
   TIMSK=0X45;
   cli();
   //down();
   sei();
   M[0]=0;
   M[1]=0; 
   while(1)
     {/*
	   if(!(PIND & 1<<PD3))
	     {*/
		   if(!(PIND & 1<<PD0))
             {
		       cli();
		       if(M[1]!=1) 
		         {
				   TCNT0=6;
                   Tov0=0;
			       if(M[0]==0) N++; 
			       else  M[0]=0;
		           sei();
		           delay_ms(500);
			     }
		       sei();
		     }    			   		 		                     
           if(!(PIND & 1<<PD1))
             {
		       cli();
			   TCNT0=6;
               Tov0=0;
		       if(N!=2) M[0]++;
		       else {M[1]++;M[0]=0;}
		       sei();
		       delay_ms(500);		          
	         }   
           if(!(PIND & 1<<PD2))
             {
		       cli();
			   TCNT0=6;
               Tov0=0;
		       Done_C();
		       delay_ms(500);
		       sei();
		     }
           if((PIND & 1<<PD3))
             {
		       cli();
			   TCNT0=6;
               Tov0=0;
               Done_D();
		       delay_ms(500);
		       SEI();
			   disp_off();
	           WDT_off();
			   int1();
	           ADCSRA &=~(1<<ADEN);
	           sei();
	           SLEEP();
			   disp_init();
			   ADCSRA |=(1<<ADEN);
               WDT_init();
	         }/**/
	       i=PINA;
	       Close[0]=(i & 1<<PA2)>>PA2;
	       Close[1]=(i & 1<<PA3)>>PA3;
	       Close[2]=(i & 1<<PA4)>>PA4;
	       Close[3]=(i & 1<<PA5)>>PA5;
	       if((i & 1<<PA6) && (i & 1<<PA7)) 
             {
	           if(T>2) 
	             {
		           Fuse1=0;
		           Fuse2=0;	  
		           T=0;
		         }
	         }
           else if(i & 1<<PA6) {Fuse1=0;Fuse2=1;T=0;}  //1灯丝完好
           else if(i & 1<<PA7) {Fuse2=0;Fuse1=1;T=0;}  //1灯丝完好
           else {Fuse1=1;Fuse2=1;}
	       delay_ms(50);
		 /*}
	   else
	     {
		   delay_ms(1000);
		   if(PIND & 1<<PD3)
		     {
			   disp_off();
	           WDT_off();
	           int1();
			   ADCSRA &=~(1<<ADEN);
	           SLEEP();
			 }
		 }*/
      } 
 }

⌨️ 快捷键说明

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