hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 188|回复: 0

共享一个AVR红外发送和接收的头文件

[复制链接]

261

主题

438

帖子

969

积分

中郎将

Rank: 4

积分
969
发表于 2024-4-2 20:02:24 | 显示全部楼层 |阅读模式
  1. /******************************************************************** * 函数库说明:包含了红外通讯常用收发函数和工具 * * 版本说明: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[i] < 0x38) //0.5ms为低电平 { ray_data_in &= ~(1<<i); } if(ray_count_array[i] >=0x38) //1ms为高电平 { ray_data_in |= (1<<i); } } ray_ordar = ray_data_in; }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-7 15:04 , Processed in 0.057194 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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