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

📄 11.c

📁 实现无线控制功能
💻 C
字号:
#include <iom32v.h> 
#include <macros.h> 
#define wuxian_js    PA3  //无线接收
#define study_key    PC1  //报警
#define zhuangtai_d  PC7  //LED
#define power_led    PC6 
#define   UDRE  5	
#define   DATA_REGISTER_EMPTY        (1<<UDRE)
unsigned char D[3],D1[3]; 
unsigned char flag;
unsigned long DATA=0;
#define  uchar  unsigned char
uchar forward[14]={0x00,0x7f,0x7f,0xff,0xff,0xfb,0x00,0x00,0x7f,0xff,0xff,0xff,0xfd,0x00};
uchar back[14]={0x00,0x7f,0x7f,0xff,0xff,0xfd,0x00,0x00,0x7f,0xff,0xff,0xff,0xfd,0x00};
uchar UP[7]={0xff,0x01,0x00,0x08,0x00,0x2f,0x38};
uchar DOWN[7]={0xff,0x01,0x00,0x10,0x00,0x2f,0x40};
uchar left[7]={0xff,0x01,0x00,0x04,0x3f,0x00,0x44}; 
uchar right[7]={0xff,0x01,0x00,0x02,0x3f,0x00,0x42};
uchar STOP[7]={0xff,0x01,0x00,0x00,0x00,0x00,0x01};
void delay_ms(void)                         //毫秒延时  
{     
     unsigned int i; 
     for (i=0;i<140;i++)  
          { 
          } 
} 

void delay_nms(unsigned int n)              //延时周期 
{ 
     unsigned int i; 
     for (i=0;i<n;i++) 
          { 
           delay_ms(); 
          } 
} 

//==============================================================================
void eeprom_writ(uchar dz,uchar sj) //写EEPROM  
{
     CLI(); //清总中断
	 while(EECR & (1<<EEWE)){;}
	 EEARH=0x00;
	 EEARL=dz;
	 EEDR=sj;
	 EECR |= (1<<EEMWE);
	 EECR |= (1<<EEWE);
     SEI();
}
//==============================================================================
uchar eeprom_read(uchar dz)     //读EEPROM
{
    CLI(); //清总中断
	while(EECR & (1<<EEWE)){;}
	EEARH=0x00;
	EEARL=dz;
	EECR |= (1<<EERE);
	SEI();
	return(EEDR); 
}

void uart0_init(void)
{
 UCSRB = 0x00; //disable while setting baud rate
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06;
 UBRRL = 0x19; //set baud rate lo
 UBRRH = 0x00; //set baud rate hi
 UCSRB = 0x08;
}    
//发送单字节字符
void  uart_transmit_byte( unsigned char data)
{
 while(!(UCSRA&DATA_REGISTER_EMPTY));
 UDR=data;
}
unsigned char decode(void)                 //无线解码 
{ 
     //unsigned long DATA;                    //记录数据 
     unsigned char count,i;                 //暂时计数 
      signed  char j;    
/*一共接收三字节*/         
     
     //DATA=0;                                //   
     for (count=0;count<24;count++)         //开始收集 
          { 
            
/*测量高电平宽度*/         

           i=0;                                 //宽度计数 
           while (PINA&(1<<3))           //高位计数 
            {        
                 asm("nop");           // 
                 i++;                  //计数增加  
                                        
                 if (i>192) goto end;  //限时解码 
                }                                    
                 
/*分辨出电平高低*/                 
        
          DATA*=2;                       //数据左移 
                  
      if (i<64)                             //分辨高低  
           {     
            if (!((56>i)&(i>24))) goto end;     //电平合法                                 
            DATA+=0;                            //记低电平 
           } 
            
          else 
           {      
            if (!((168>i)&(i>72))) goto end;    //电平合法                                 
            DATA+=1;                            //记高电平 
           } 
            
/*测量低电平宽度*/         
    
           while (!(PINA&(1<<3)))               //低位计数 
            {        
                 asm("nop");                 // 
                 i++;                        //计数增加  
                                        
                 if (i>224) goto end;        //限时解码 
                }           
                 
/*低电平是否过窄*/                 
                  
           if (i<96) goto end;                  //对比宽度                                  
      } 
          
/*解码成功返结果*/         
        for(j=2;j>=0;j--)
					      {
						   D[j]=DATA;                        
                           DATA>>=8;
						  }                      
         return 1;                          //成功返回  
          
/*有误码结束解码*/          
          
     end:          
         return 0;                              //误码结束 
} 
  
void ana_decode(void)
   {
    //unsigned long  DATA;
	uchar key_var;
	uchar i;
	DDRC&=~(1<<study_key);PORTC|=(1<<study_key);
	key_var=PINC&(1<<study_key);
	if(key_var==0)
	   {
	      while(1)
		     {
	          while(1)
    		   {
    		       flag=decode();
				   if(flag==1)  {break;}
    		   }
			   for(i=0;i<2;++i){D1[i]=D[i];}
			   while(1)
    		   {
    		       flag=decode();
				   if(flag==1)  {break;}
			
    		   }
			   for(i=0;i<2;++i){if(D1[i]!=D[i]){break;}}
			   if(i==2){flag=1;break;}
	         }
			 if(flag==1)	
			    {    
				    for(i=0;i<2;++i)
    		           {
   				         eeprom_writ(i,D[i]);
   			            } 
				}	
			  return;	 
		}		  
	// else  return; 
	 flag=decode();
	 if(flag==1)
	    {
		     for(i=0;i<2;++i)
    		           {
   				         if(eeprom_read(i)!=D[i])  {flag=0;break;};
   			            } 
		} 
	if(flag==1)	
	  { 
	             if(D[2]==0xc0)
				       {
					     for(i=0;i<14;i++)
                         {  
                       uart_transmit_byte(forward[i]);
                         }
					   }
			     else if(D[2]==0x30)
				       {
					     for(i=0;i<14;i++)
                         {  
                       uart_transmit_byte(back[i]);
                         }
					   }		   
	             else if(D[2]==0xf0)   //上
			           {
			          for(i=0;i<7;i++)
                         {  
                       uart_transmit_byte(UP[i]);
                         }
			
	                  }
			      else if(D[2]==0x0c)//下
			          {
			            for(i=0;i<7;i++)
                            {  
                              uart_transmit_byte(DOWN[i]);
                            }
			           }
			
    		     else if(D[2]==0xcc)//左
    		          {
			           for(i=0;i<7;i++)
                          {  
                            uart_transmit_byte(left[i]);
                          }
    		         }
    		    else if(D[2]==0x3c)//右
    		         {
    		          for(i=0;i<7;i++)
                         {  
                          uart_transmit_byte(right[i]);
                     } 
	  }   
   } 
  }  
void main(void) 
{ 
     //unsigned long DATA;                                
     //signed char i;                   
     DDRC|=(1<<power_led);PORTC&=~(1<<power_led);  //电源显示灯
     DDRA |=0x40;                      //无线输入通道 
     PORTA|=0x40;               //上拉选择 
     uart0_init(); 
     while (1) 
        { 
		  ana_decode();
        }
}	

⌨️ 快捷键说明

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