本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
- /********************************************************************
- * 函数库说明:包含了红外通讯常用收发函数和工具 *
- * 版本说明: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;
- }
复制代码 |