目标实现功能
51单片机解码红外遥控器的信号,控制直流电机的启停。
1.红外遥控器
红外遥控器是由键盘电路、红外编码电
路、电源电路和红外发射电路组成。按下遥控键值时,红外遥控器先将按键键值按相应的编码方式形成二进制脉冲编码,再将编码调制在一定频率的载波上,最终在发射端经红外发光二极管发射出去,完成电信号到光信号的转变。
本次设计用到的红外遥控器发送端采用的载频频率是38KHz,该频率是由发射端使用的455KHz的晶振经过12分频而来。
红外遥控器每次先发送一个起始码,起始码由9ms左右的高电平、和4.5ms左右的低电平组成。紧跟在起始码后是32位的数据:用户码、用户反码、数据码、数据反码,其中用户码是可以防止其它类型的红外遥控器的干扰,用户反码用于接收端对用户码正确性的校验。数据码是我们常用的功能码,数据反码和用户反码的功能类似。
特别注意:32位数据的每一位都是由高低电平组成的脉冲码。例如二进制数0,用0.565ms左右的高电平和0.565ms左右的低电平表示;例如二进制数1,用0.565ms左右的高电平和1.695ms左右的低电平表示。
2.红外接收设备
红外接收设备是由红外接收电路、红外解码、电源和应用电路组成。当收到红外遥控信号时,接收设备先将光信好转换成电信号,经过放大、限幅、检波、整形,形成遥控指令脉冲,输出至遥控微处理器。
本次设计采用一体化的红外接收头作为接收设备。红外接收头对外引出3个引脚:电源正( VDD)、电源负(GND)和数据输出(VOUT),其中数据输出连接单片机的I/O口,需要编写代码对遥控指令脉冲识别、解码。需要注意的是,数据输出引脚输出的是发射码的反码。例如:输出的起始码由9ms左右的低电平、和4.5ms左右的高电平组成,正好与发射的起始码相反。为加强红外遥控的实时性,采用外部中断的方式,执行对红外信号的解码。代码如下:
/*红外接收初始化*/
void ir_init()
{
EA=1;//总中断允许
EX0=1;//外部中断0允许
IT0=1;//下降沿触发
IR=1;//红外接收数据输出引脚初始化
}
/*读取红外接收数据*/
void ir_read() interrupt 0
{
uchar i,j;
uint error=1000;//定义变量error,用于超时退出
delay(942);//先延时8494us左右,再判断
if(IR==0)
{
while(IR==0)//低电平则等待
{
error=error-1;
if(error==0) return;//超时退出
}
delay(442);//先延时3994us左右,再判断
if(IR==0) return;//错误的信号
error=1000;
while(IR==1)//高电平则等待
{
error=error-1;
if(error==0) return;//超时退出
}
for(i=0;i<4;i++)//共计4组数据(用户码、用户反码、数据码、数据反码)
{
for(j=0;j<8;j++)//每组数据有8位
{
error=1000;
while(IR==0)//低电平则等待
{
error=error-1;
if(error==0) return;//超时退出
}
delay(76);//先延时700us左右,再判断
error=2000;
if(IR==0) Irdata[i]=Irdata[i]>>1;//位0
else//如果是位1
{
Irdata[i]=Irdata[i]>>1;
Irdata[i]=Irdata[i]|0X80;
while(IR==1)//等待高电平结束
{
error=error-1;
if(error==0) return;//超时退出
}
}
}
}
}
}
3.直流电机
直流电机的结构由定子和转子两大部分组成。在直流电机两端加上直流电就能工作。特别注意单片机引脚不能直接驱动电机。
在本次设计中,将直流电机的一个引脚接5V电压,另一个引脚由单片机引脚连接驱动芯片ULN2003间接控制。
4.演示结果
51单片机红外通信—直流电机
注:详细代码已经上传至资源,大家可以自行下载。祝大家天天开心!!!