搜索
bottom↓
回复: 70

[古董贴][共享] 一个AVR红外发送和接收的头文件——请勿挖古墓

[复制链接]

出0入296汤圆

发表于 2005-4-24 11:32:13 | 显示全部楼层 |阅读模式
/********************************************************************

*  函数库说明:包含了红外通讯常用收发函数和工具                     *

*  版本说明: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<n)

   {

        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 < 0x38)                                //0.5ms为低电平

                {

                        ray_data_in &= ~(1<<i);

                }

                if(ray_count_array >=0x38)                                //1ms为高电平

                {

                        ray_data_in |= (1<<i);

                }

         }          

         ray_ordar = ray_data_in;  

}




-----此内容被Gorgon Meducer于2005-04-26,13:27:24编辑过

出0入0汤圆

发表于 2005-4-25 10:41:23 | 显示全部楼层
要用哪一种编译器编译?采用哪一种红外通讯协议啊?

出0入296汤圆

 楼主| 发表于 2005-4-25 21:46:31 | 显示全部楼层
使用ICC编译,通讯协议是自定义的,头文件中包含了完成这个协议的所有必须代码。

出0入0汤圆

发表于 2005-4-25 23:00:37 | 显示全部楼层
好东西要顶啊~~

要是能把您自定义的协议说明一下就更棒了~

出0入296汤圆

 楼主| 发表于 2005-4-26 13:29:22 | 显示全部楼层
关于协议,其实非常简单,通过频宽表示数据 长的表示1,短的表示0

其实,对于红外通讯,发送可以使用串口来发送,接收可以用捕获来做。

出0入0汤圆

发表于 2006-4-3 18:08:12 | 显示全部楼层
新手,有几个问题想请教一下

1、红外协议能否比较详细的描述一下,接受和发送的?

2、用的是什么晶振频率?

出0入54汤圆

发表于 2006-4-3 20:02:02 | 显示全部楼层
对,我也想知道编码和解码的协议,呵呵

出0入0汤圆

发表于 2006-4-4 08:32:30 | 显示全部楼层

出0入0汤圆

发表于 2006-4-25 11:22:44 | 显示全部楼层
有没有哪位大虾用MAX3131做过红外通信的,请指教

出0入0汤圆

发表于 2006-4-26 21:56:39 | 显示全部楼层
有没有大家



作过对讲机的?

出0入0汤圆

发表于 2006-5-14 11:30:55 | 显示全部楼层
再弄一个典型的应用电路就好了!

呵呵

出0入0汤圆

发表于 2006-5-18 10:22:53 | 显示全部楼层
不错 不错! 支持 !!!

出0入0汤圆

发表于 2006-6-26 23:04:14 | 显示全部楼层
好东西,谢谢共享

出0入0汤圆

发表于 2006-6-27 09:11:18 | 显示全部楼层
有硬件吗?

看看!

也可以作遥控?!

出0入0汤圆

发表于 2006-7-23 19:59:34 | 显示全部楼层
ding

出0入0汤圆

发表于 2006-7-24 09:16:00 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2006-7-25 09:09:21 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2006-11-8 10:10:54 | 显示全部楼层
好东西!收下了,谢谢!

出0入0汤圆

发表于 2006-11-30 22:51:30 | 显示全部楼层
好东西啊,谢了

出0入0汤圆

发表于 2007-6-17 10:21:55 | 显示全部楼层
终于找到了,谢谢了,我也想试下了,刚上班的时候帮老大做了硬件部分,一直想自己搞下程序.

出0入0汤圆

发表于 2007-6-17 11:34:26 | 显示全部楼层
怎么是xky183的?

出0入0汤圆

发表于 2008-3-12 20:31:15 | 显示全部楼层
好东西学习了

出0入0汤圆

发表于 2008-7-1 14:40:14 | 显示全部楼层
没看懂

出0入0汤圆

发表于 2008-7-11 10:45:27 | 显示全部楼层
IR  mark

出0入0汤圆

发表于 2008-8-4 15:47:57 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2008-8-4 19:34:55 | 显示全部楼层
好东西

出0入0汤圆

发表于 2008-8-5 16:47:47 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-11-7 15:04:32 | 显示全部楼层
顶顶,对新手学习很有用

出0入0汤圆

发表于 2008-11-7 15:32:53 | 显示全部楼层
通常古墓里都会有宝藏,不挖不行。哈哈....闪人

出0入0汤圆

发表于 2009-3-1 12:55:43 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-3-2 14:43:15 | 显示全部楼层
顶,好家伙!

出0入0汤圆

发表于 2009-3-2 15:21:52 | 显示全部楼层
Mark!

出0入0汤圆

发表于 2009-3-9 17:40:11 | 显示全部楼层
最近在用8515玩这个,定时器1输入下降沿捕捉。
红外的协议太多了,有个万能遥控器,一次输出>>150位的脉冲数据;
我faint啊,sram放不下,直接串口输出的话又怕太慢了丢失数据;
至少包含了两种格式的引导码,一种是9ms的,另一种是12.66ms的。

今晚再试一下吧,边接收,边发送。

出0入0汤圆

发表于 2009-3-25 14:30:06 | 显示全部楼层
VERY GOOD!

出0入0汤圆

发表于 2009-3-25 16:57:13 | 显示全部楼层
好东西!!顶~~

出0入0汤圆

发表于 2009-5-31 12:59:51 | 显示全部楼层
好啊

出0入0汤圆

发表于 2009-5-31 13:06:49 | 显示全部楼层
这个有挖的价值呀

出0入0汤圆

发表于 2009-7-12 16:48:42 | 显示全部楼层
顶一下~

出0入0汤圆

发表于 2009-8-1 18:04:21 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-13 11:33:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-18 10:54:50 | 显示全部楼层
mark 好东西

出0入0汤圆

发表于 2009-8-18 11:32:34 | 显示全部楼层
挖出来验验成色,看看古董做的像不像。

出0入0汤圆

发表于 2009-9-12 19:20:34 | 显示全部楼层
来迟了

出0入0汤圆

发表于 2009-12-7 12:17:38 | 显示全部楼层
MARK

出10入12汤圆

发表于 2009-12-19 13:35:29 | 显示全部楼层
挖起来看看

出0入0汤圆

发表于 2010-1-26 14:56:22 | 显示全部楼层
能再给多点这方面的资料吗

出0入0汤圆

发表于 2010-1-31 16:36:18 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-2-24 21:01:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-4-2 16:18:50 | 显示全部楼层
mark

出235入235汤圆

发表于 2010-4-2 16:42:54 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-4-2 18:52:34 | 显示全部楼层
果然是古墓

出0入0汤圆

发表于 2010-4-9 14:21:20 | 显示全部楼层
好 东西 顶

出0入0汤圆

发表于 2010-4-13 17:07:10 | 显示全部楼层
现在红外都用什么芯片控制发送和接收?

出0入0汤圆

发表于 2010-4-13 17:43:09 | 显示全部楼层
挖挖看宝贝~

出0入0汤圆

发表于 2010-5-6 01:05:44 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-5-6 08:37:03 | 显示全部楼层
ddddddd

出0入0汤圆

发表于 2010-5-6 09:34:38 | 显示全部楼层
我偷偷的挖一下..

出0入0汤圆

发表于 2010-5-7 20:50:52 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2010-5-24 21:49:24 | 显示全部楼层
载波信号是被调制在高电平还是低电平上?

出0入0汤圆

发表于 2010-5-25 10:38:41 | 显示全部楼层
收藏

出0入0汤圆

发表于 2010-6-3 15:12:04 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-7-31 21:46:19 | 显示全部楼层
xuexi ~~

出0入0汤圆

发表于 2010-8-15 15:08:54 | 显示全部楼层
收藏

出0入0汤圆

发表于 2010-9-25 21:36:57 | 显示全部楼层
mark,留着后用

出0入0汤圆

发表于 2010-10-5 13:50:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-1-4 18:29:46 | 显示全部楼层
*  函数说明:定时器0中断处理程序,用来产生40MHz的载波               *

笔误吧?没见过40M的,SONY的遥控器有40K的,常见的38K。

我用PWM 产生38K 载波,延时直接软件延时,精度也够了。

解码只用了一个外部中断,也不错了。没有误码。

出0入0汤圆

发表于 2011-2-23 11:51:35 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2011-10-16 10:27:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-17 09:55:13 | 显示全部楼层
mark
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-1 06:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表