您的位置:首页单片机AVR单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

AVR红外发送和接收的头文件

[日期:2008-01-20 ] [来源:EDA网 作者:] [字体: (投递新闻)
 
*  函数库说明:包含了红外通讯常用收发函数和工具                     *
*  版本说明:1.0 Bate                                               *
*  作者:xky183                                                     *
*  日期:2003年7月                                                  *
*  修改:GorgonMeducer                                              *
*  日期:2005年4月21日                                              *
*  平台:RC 8M                                                      *
*                                                                   *
*  说明:红外通讯使用的格式为字节直接发送模式,提供4位自校验的函数  *
*        通讯时记录载波宽度。未使用串口帧格式。软件载波。           *
*                                                                   *
*  硬件连接说明:PC5发送数据(可以修改宏定义)  外中断0接收数据     *
*                                                                   *
*  使用说明:添加必要的代码到定时器中断,并且使用头函数中的定时器初 *
*            始化程序。使用程序中的外中断初始化程序,添加必要的部分 *
*            到外中断处理程序中。                                   *
*            发送 数据的时候,调用函数RaySend(),也可以调用KeyDeal()*
*            来处理并发送4位的控制信号。                            *
*            对于接收信号,直接从Ordar或者RayDataIn中读取收到的字节 *
*            请自己清空RayDataIn变量                                *
*            接受到的数据保存在变量ray_ordar                        *
*            开启红外线接收时要开外中断0: GICR=0x40;                *
********************************************************************/


/*------------------------------------------------------------------*
*                      红外发射程序                                 *
*------------------------------------------------------------------*/


#define ray_IO_on  PORTC |=0B00100000;
#define ray_IO_off PORTC &=0B11011111;
#define T1I_on     TIMSK |=0B00000001;
#define T1I_off    TIMSK &=0B11111110;
/*---------------------*/
/*  红外发射全局变量   */
/*---------------------*/
char ray_Flag = 0;
char ray_Sign = 0;

/*---------------------*/
/*      函数声明区     */
/*---------------------*/
char KeyDeal(char TempData);                //数据编码发送函数      
void RaySend(unsigned char DataTemp);         //数据红外发送函数      
void delay_1ms(void);
void Delay_Ms(unsigned int n);
void Timer0_init(void);
void ray_send_init(void);

/***********红外线发射*****************
void ray_send_init(void)              *
{                                     *
   Timer0_init();             *
}                                     *
**************************************/

/********************************************************************
*  函数说明:1 MS延时程序                                           *
********************************************************************/
void delay_1ms(void)

unsigned int i;
for(i=1;i<(unsigned int)(8*143-2);i++)
   ;
}

/********************************************************************
*  函数说明:MS延时程序                                             *
*  输入:需要延时的时长                                             *
********************************************************************/
void Delay_Ms(unsigned int n)
{
unsigned int i=0;
while(i   {
   delay_1ms();
    i++;
   }
}
/*-------------------------------------------------------------------
*      发射程序需要定时器0的支持,请粘贴以下代码到主程序            *
--------------------------------------------------------------------/
/********************************************************************
*  函数说明:定时器0中断处理程序,用来产生40MHz的载波               *
*********************************************************************
#pragma interrupt_handler timer0_ovf_isr:10                          
void timer0_ovf_isr(void)     //需要定时器0的中断支持本函数库          
{                                                    
     TCNT0=0xa5;                                        
     ray_Flag++;                                        
     ray_Sign=1;                                        
}                                                     
/********************************************************************
*  函数说明:定时器0初始化程序                                      *
*********************************************************************
void Timer0_init(void)                                     
{                                                       
     TCCR0=0x01;       // CK                               
     TCNT0=0x9b;                                             
                                                       
}                                                                    
-------------------------------------------------------------------*/
                                                       
/*******************************************************************
* 函数说明:红外发送程序                                           *
* 输入:要发送的数据                                               *
*******************************************************************/
void RaySend(unsigned char DataTemp)
{
 unsigned char i=0,DataBit=0; 
 
    ray_Flag=0;
    ray_Sign=0;
    T1I_off;

   for (i=0;i<8;i++)
    {        
         DataBit=DataTemp & 0x01;
         if(DataBit==0)
            {    
               T1I_on;
               while (ray_Flag<40)
               {     
                     ray_IO_on;                                  //产生高电平         
                   ray_Sign=0;
                  while( ray_Sign !=1);
                     ray_IO_off;                                 //产生低电平         
                     ray_Sign=0;
                   
                 while( ray_Sign !=1);    
                  }   
              ray_Flag=0;
              ray_Sign=0;
               ray_IO_off;                                        //产生低电平         
                                                                     //13.125us的时间      
              while (ray_Flag<=40);                              //50               
               T1I_off;
              ray_Flag=0;  
              ray_Sign=0;
              
              DataTemp=DataTemp>>1;     
          }
        else     
           {     
               T1I_on;
               while (ray_Flag<80)
                {     ray_IO_on;                                  //产生高电平         
                   ray_Sign=0;
                  while( ray_Sign !=1);
                     ray_IO_off;                                 //产生低电平         
                     ray_Sign=0;
                   
                 while( ray_Sign !=1)
                 ;    
                   }   
              ray_Flag=0;
              ray_Sign=0;
               ray_IO_off;                                        //产生低电平         
                                                                     //13.125us的时间      
              while (ray_Flag<=40);                              //50               
               T1I_off;
              ray_Flag=0;  
              ray_Sign=0;
              DataTemp=DataTemp>>1;   
          }   
    }
    
    ray_Flag=0;
     ray_IO_off;                                                     //为低电平            
    i=0;
    T1I_off;
     
    Delay_Ms(6);                                                    //两个字节的数据之间间隔
}

char KeyDeal(char TempData)
/********************************************************************
*  函数说明:数据格式转换(4位数据加上自己的反码作交验)            *
*  输入:需要转换和发送的信息                                       *
*  输出:转换好的数据,并自动发送数据                               *
********************************************************************/
{
 char TempReturn=0;
 char i=0;
 TempReturn =~ TempData & 0x0f; 
 TempReturn <<= 4;
 TempReturn |= 0x0f & TempData;
 for(i=0;i<10;i++)
   {
   RaySend(TempReturn);
   Delay_Ms(6);
   }
 return TempReturn;
}




/*------------------------------------------------------------------*
*                      红外接受程序                                 *
*------------------------------------------------------------------*/

/*---------------------*/
/*  红外接收全局变量   */
/*---------------------*/
char ray_singal_num = 0;                                             //接受信号              
char  ray_data_in = 0;                                                //ray_data_in为接收的数据
char ray_symbol = 0;
char ray_count_array[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//Bit位数组              
char ray_ordar = 0;                                                  //最终得到的命令(鸡肋) 

/*---------------------*/
/*      函数声明区     */
/*---------------------*/
void ray_judger(void);
void int0_init(void);
void Timer1_init(void);

/*******红外线接收**********
void ray_receive_init(void) 
{                           
  int0_init();              
  Timer1_init();            
}                           
***************************/


/*-------------------------------------------------------------------
*    发射程序需要定时器1和外中断0的支持,请粘贴以下代码到主程序     *
--------------------------------------------------------------------/
/********************************************************************
*  函数说明:定时器1初始化程序                                      *
*********************************************************************
void Timer1_init(void)                                               
{                                                                    
    TCNT1 =0;                                                        
    TCCR1B =0x03;                                                   
}                                                                    
/********************************************************************
*  函数说明:外中断0初始化程序                                      *
*********************************************************************
void int0_init(void)                                                 
{                                                                    
    MCUCR=0x02;//开中断0、下降沿触发脉冲                             
    GIFR=0Xff;                                                       
}                                                                    
#pragma interrupt_handler ext_int0:2    //M8参考外中断向量           
/********************************************************************
*  函数说明:外中断0中断处理程序                                    *
*********************************************************************
void ext_int0(void)                                                   
{                                                                    
     char temp =0;                                                   
    temp = TIMSK;                                                   
    TIMSK = 0;                                                      
    if(ray_symbol == 0)                                             
    {                                                               
      if(TCNT1 >= 0x00ff)        //大于4MS则重置指针               
      {                                                            
          ray_singal_num = 0;                                      
      }                                                            
      TCNT1 = 0X00;              //0.5ms记数值为31                 
      MCUCR = 0X03;              //INT0上升沿触发                  
      ray_symbol = 1;                                              
    }                                                               
     else                                                            
     {                                                               
      if((TCNT1H == 0)&&(TCNT1 <= 0x00ff))                         
      {                                                            
         ray_count_array[ray_singal_num] = TCNT1L;                
          ray_singal_num ++;                                       
         if (ray_singal_num == 8)                                
          {                                                        
             ray_singal_num = 0;                                   
             ray_judger();                                         
          }                                                        
          ray_symbol = 0;                                          
      }                                                            
      else                                                         
      {                                                            
                                                                     
          ray_singal_num = 0;                                      
      }                                                            
                                                                   
      MCUCR = 0X02;              //INT0下降沿触发                  
      TCNT1 = 0;                                                   
    }                                                               
    TIMSK = temp;                                                   
}                                                                    
/*******************************************************************/

/********************************************************************
*   函数说明:红外信号处理程序                                      *
********************************************************************/
void ray_judger(void)
{    
     char i=0;
     ray_data_in=0;      
    
     for(i=0;i<8;i++)                                               //加入适当的冗错处理
    {
      if(ray_count_array[i] < 0x38)                                //0.5ms为低电平
      {
       , ;  ray_data_in &= ~(1<      }
      if(ray_count_array[i] >=0x38)                                //1ms为高电平
      {
         ray_data_in |= (1<      }
    }     
    ray_ordar = ray_data_in;  
}
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
赞助商广告