扫一扫关注官方微信
您需要 登录 才可以下载或查看,没有帐号?注册会员
在本实例中,我们利用串口将单片机从一体化红外接收器接收到的红外遥控键值发送到计算机上,通过计算机的串口助手观察接收到的数据。
红外遥控的数据接收主要在外部中断函数中进行处理:处理过程为:当有遥控键值发送的时候,红外一体化接收器的脉冲信号输出脚发生一个下降沿的电平变化,外部中断采用下降沿出发的方式接收到由外部中断事件发生,程序进入外部中断处理函数,首先关闭外部中断,然后根据一体化接收器脉冲信号输出引脚的高低电平变化时间判断红外遥控发送的数据,共有4个字节的数据,处理完这4个字节数据后,利用单片机的串口将数据发送到计算机。
下面是完整代码:其中串口数据发送部分的程序请查看前面关于串口的实现部分 #include <AVR/io.h> #include <util/delay.h> #include <avr/interrupt.h> //中断函数头文件 #include "usart.h" void INT_Init(void); //外部中断初始化 void Delayus(unsigned int lus); //us延时函数 void Delayms(unsigned int lms); //ms延时函数 int main(void) { Port1_Init(); Usart1_Init(); INT_Init(); sei(); //使能全局中断 while(1) { } } //外部中断初始化 void INT_Init(void) { EICRB |= (1 << ISC41); //选择外部中断4,下降沿触发中断 EIMSK |= (1 << INT4); //使能外部中断4 } // ISR(INT4_vect) { unsigned char i,j,k = 0,addr[4] = {0}; EIMSK = 0x00; //禁止外部中断4 关闭外部中断,开始接受数据 for(i = 0;i < 14;i++) { Delayus(400); if(PINE & (1 << PE4)) //9MS内有高电平,则判断为干扰,退出处理程序 { EIMSK |= (1 << INT4); //使能外部中断4 return; } } while(!(PINE & (1 << PE4))); //等待9ms低电平过去 for(i = 0;i < 4;i++) // { for(j = 0;j < 8;j++) // { while(PINE & (1 << PE4)); //等待4.5ms高电平过去 while(!(PINE & (1 << PE4))); //等待变高电平 while(PINE & (1 << PE4)) //计算高电平时间 { Delayus(100); k++; if(k >= 30) //高电平时间过长,则退出处理程序 { EIMSK |= (1 << INT4); //使能外部中断4 return; // } } addr = addr >> 1; //接受一位数据 if(k >= 8) { addr = addr | 0x80; //高电平时间大于0.56,则为数据1 } k = 0; //计时清零 } } Usart1_PutChar(addr[0]); //通过串口发送接收到的4个字节 Usart1_PutChar(addr[1]); Usart1_PutChar(addr[2]); Usart1_PutChar(addr[3]); EIMSK |= (1 << INT4); //使能外部中断4 } // //us级别的延时函数 void Delayus(unsigned int lus) { while(lus--) { _delay_loop_2(4); //_delay_loop_2(1)是延时4个时钟周期,参数为4则延时16 //个时钟周期,本实验用16M晶体,则16个时钟周期为16/16=1us } } //ms级别的延时函数 void Delayms(unsigned int lms) { while(lms--) { _delay_loop_2(4000); //延时1ms } } 复制代码
举报
本版积分规则 发表回复 回帖后跳转到最后一页