注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hellorobot

全民机器人,零起步实现你童年的梦想

 
 
 

日志

 
 

智能篇(3)----------------------------------------------------------红外遥控  

2012-03-12 05:31:48|  分类: 51单片机与机器人 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

红外遥控系统一般由红外发射装置和红外接收设备两大部分组成。红外发射装置又可由键盘电路、红外编码芯片、电源和红外发射电路组成。红外接收设备可由红外接收电路、红外解码芯片、电源和应用电路组成。通常为了使信号能更好的被传输发送端将基带二进制信号调制为脉冲串信号,通过红外发射管发射。
智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot
教程中将使用常见的迷你红外遥控器和一体式红外接收头来进行六足红外遥控功能的扩展。

智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot
这种红外遥控器是采用常见的NEC编码方式,采用脉宽调制的串行码,以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms 的组合表示二进制的“0”;以脉宽为 0.565ms、间隔 1.685ms、周期为 2.25ms 的组合表示二进制的“1”。



智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot
“0”和“1”组成的 32 位二进制码经 38kHz 的载频进行二次调制以提高发射效率,然后再通过红外发射二极管产生红外线向空间发射。

 
 智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot

智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot

当一个键按下超过 36ms,振荡器使芯片激活,将发射一组 108ms 的编码脉冲,这108ms 发射代码由一个引导码(9ms),一个结果码(4.5ms),低 8 位地址码(9ms~18ms),高 8 位地址码(9ms~18ms),8 位数据码(9ms~18ms)和这 8 位数据的反码(9ms~18ms)组成。如果键按下超过 108ms 仍未松开,接下来发射的代码(重复码)将仅由起始码(9ms)和结束码(2.25ms)组成。
 
智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot

接收电路上很简单,只需要把一体式红外接收头的信号输出脚接到扩展板的P3.2接口上,GND对应GND,5V对应5V就完成了接收电路。


 智能篇(3)----------------------------------------------------------红外遥控 - 懒猫侠 - hellorobot

 
在写程序之前我们还要获得红外遥控器的用户码和按键对应的键值,如下图,右边遥控器上四个黑色按键我们作为触发六足的前进,后退,左转,右转动作的功能键。对应键值分别是40,19,07,09。

程序代码如下:

#include <STC12C5A60S2.h>
#define uchar unsigned char
uchar data IRcode[4]; //定义一个4字节的数组用来存储代码
uchar CodeTemp; //编码字节缓存变量
uchar i,j,k,aa; //延时用的循环变量
sbit IR=P3^2; //接收头OUT端直接连P3.2(INT0)
sbit LED = P3^5;
sbit LEDL = P3^3;
sbit LEDR = P3^4;

/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{
uchar i,j;
for(i=12;i>0;i--)
for(j=180;j>0;j--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{
uchar i,j;
for(i=12;i>0;i--)
for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{
uchar i,j;
for(i=60;i>0;i--)
for(j=225;j>0;j--) ;
}
/**************************** 延时子程序 ************************/
void Delay(void)
{
uchar i,j,k;
for(i=60;i>0;i--)
for(j=200;j>0;j--)
for(k=10;k>0;k--) ;
}

void DELAY_MS (unsigned int a){
unsigned int i;
while( a-- != 0){
for(i = 0; i < 600; i++);
}
}
/************************串口发送***********************************/
void UART_T (uchar UART_data)
{
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
void UART_TC (unsigned char *str)
{
while(*str != '\0')
{
UART_T(*str);
*str++;
}
*str = 0;
}
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0 using 2
{
EA=0;
for(k=0;k<10;k++) //不同型号请改成5/10
{
Delay0_9ms();
if (IR==1) //如果0.9ms后IRsignal=1,说明不是引导码
{
k=10;break;
}
else if(k==9) //如果持续了10×0.9ms=9ms的低电平,说明是引导码
{
while(IR==0);
Delay4_5ms(); //跳过持续4.5ms的高电平
for(i=0;i<4;i++) //分别读取4个字节
{
for(j=1;j<=8;j++) //每个字节8个bit的判断
{
while(IR==0); //等待上升沿
Delay0_9ms(); //从上升沿那一时刻开始延时0.9ms,再判断IRsignal
if(IR==1) //如果IRsignal是"1",则向右移入一位"1"
{
Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
}
IRcode[i]=CodeTemp;
CodeTemp=0;
}
Delay();
Delay();
}
aa=1;
}
EA=1;
}
/***********************动作组指令*********************/
void forward (){ //前进

UART_TC("#1P1500#2P1500#3P838#4P894#6P1500#7P1000#8P781#10P1500#11P810#12P838#13P1500#14P1852#15P2106#17P1500#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1200#3P838#4P894#6P1500#7P1000#8P781#10P1200#11P810#12P838#13P1500#14P1852#15P2106#17P1800#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1200#3P1034#4P894#6P1500#7P1000#8P781#10P1200#11P1100#12P838#13P1500#14P1852#15P2106#17P1800#18P1966#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1500#7P781#8P781#10P1500#11P1100#12P838#13P1500#14P2219#15P2106#17P1500#18P1966#19P2106#21P1500#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1200#7P781#8P781#10P1500#11P1100#12P838#13P1800#14P2219#15P2106#17P1500#18P1966#19P2106#21P1800#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1200#7P1007#8P781#10P1500#11P1100#12P838#13P1800#14P1852#15P2106#17P1500#18P1966#19P2106#21P1800#22P2021#23P2021T300\r\n");
DELAY_MS (200);
}



void back (){ //后退

UART_TC("#1P1500#2P1500#3P838#4P894#6P1500#7P1000#8P781#10P1500#11P810#12P838#13P1500#14P1852#15P2106#17P1500#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1800#3P838#4P894#6P1500#7P1000#8P781#10P1800#11P810#12P838#13P1500#14P1852#15P2106#17P1200#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1800#3P1034#4P894#6P1500#7P1000#8P781#10P1800#11P1100#12P838#13P1500#14P1852#15P2106#17P1200#18P1966#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1500#7P781#8P781#10P1500#11P1100#12P838#13P1500#14P2219#15P2106#17P1500#18P1966#19P2106#21P1500#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1800#7P781#8P781#10P1500#11P1100#12P838#13P1200#14P2219#15P2106#17P1500#18P1966#19P2106#21P1200#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1800#7P1007#8P781#10P1500#11P1100#12P838#13P1200#14P1852#15P2106#17P1500#18P1966#19P2106#21P1200#22P2021#23P2021T300\r\n");
DELAY_MS (200);
}

void left (){ //左转

UART_TC("#1P1500#2P1500#3P838#4P894#6P1500#7P1000#8P781#10P1500#11P810#12P838#13P1500#14P1852#15P2106#17P1500#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1200#3P838#4P894#6P1500#7P1000#8P781#10P1200#11P810#12P838#13P1500#14P1852#15P2106#17P1200#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1200#3P1034#4P894#6P1500#7P1000#8P781#10P1200#11P1100#12P838#13P1500#14P1852#15P2106#17P1200#18P1966#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1500#7P781#8P781#10P1500#11P1100#12P838#13P1500#14P2219#15P2106#17P1500#18P1966#19P2106#21P1500#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1200#7P781#8P781#10P1500#11P1100#12P838#13P1200#14P2219#15P2106#17P1500#18P1966#19P2106#21P1200#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1200#7P1007#8P781#10P1500#11P1100#12P838#13P1200#14P1852#15P2106#17P1500#18P1966#19P2106#21P1200#22P2021#23P2021T300\r\n");

}

void right (){ //右转

UART_TC("#1P1500#2P1500#3P838#4P894#6P1500#7P1000#8P781#10P1500#11P810#12P838#13P1500#14P1852#15P2106#17P1500#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1800#3P838#4P894#6P1500#7P1000#8P781#10P1800#11P810#12P838#13P1500#14P1852#15P2106#17P1800#18P2331#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1800#3P1034#4P894#6P1500#7P1000#8P781#10P1800#11P1100#12P838#13P1500#14P1852#15P2106#17P1800#18P1966#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1500#7P781#8P781#10P1500#11P1100#12P838#13P1500#14P2219#15P2106#17P1500#18P1966#19P2106#21P1500#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1800#7P781#8P781#10P1500#11P1100#12P838#13P1800#14P2219#15P2106#17P1500#18P1966#19P2106#21P1800#22P2247#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P1034#4P894#6P1800#7P1007#8P781#10P1500#11P1100#12P838#13P1800#14P1852#15P2106#17P1500#18P1966#19P2106#21P1800#22P2021#23P2021T300\r\n");
DELAY_MS (200);


}
void DD (){ //待定

UART_TC("#1P1500#2P1500#3P979#4P894#6P1500#7P979#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1500#18P1966#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);

}

void KEY1 (){ //挑衅

UART_TC("#1P1500#2P1500#3P979#4P894#6P1500#7P979#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1500#18P1966#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1500#7P640#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1500#18P2276#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1063#7P640#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P2276#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1063#7P979#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P1937#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1063#7P1430#8P1176#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P1683#19P1796#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1148#11P1034#12P838#13P2009#14P1852#15P2106#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1768#13P2009#14P2219#15P1176#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1768#13P2009#14P2050#15P1034#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P1007#12P2106#13P2009#14P2247#15P1176#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1796#13P2009#14P1993#15P894#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P1007#12P2106#13P2009#14P2247#15P1176#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1796#13P2009#14P1993#15P894#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P1007#12P2106#13P2009#14P2247#15P1176#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1796#13P2009#14P1993#15P894#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P1007#12P2106#13P2009#14P2247#15P1176#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1796#13P2009#14P1993#15P894#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1000#11P753#12P1768#13P2009#14P2219#15P1176#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (100);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1148#11P1034#12P838#13P2009#14P1852#15P2106#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T200\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P669#4P894#6P1063#7P1430#8P1176#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P1683#19P1796#21P1500#22P2360#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1063#7P1430#8P1176#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P1683#19P1796#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1063#7P979#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P1937#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1063#7P640#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1880#18P2276#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);
UART_TC("#1P1500#2P1500#3P979#4P894#6P1500#7P640#8P781#10P1500#11P1034#12P838#13P1500#14P1852#15P2106#17P1500#18P2276#19P2106#21P1500#22P1993#23P2021T300\r\n");
DELAY_MS (200);



}

/***********************串口初始化程序*********************/
void initUart(void)
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xfe; //串口1选择定时器1为波特率发生器
TMOD &= 0x0f; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFA; //设定定时初值
TH1 = 0xFA; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}

/**************************主程序*************************/
void main()
{
uchar a;
initUart();
IT0=1; //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
EX0=1; //外部中断INT0开, (1:开, 0:关 )
EA=1; //开所有中断
CodeTemp=0; //初始化红外编码字节缓存变量
Delay();


if(aa==1)
{
for(a=0;a<2;a++)  

{
if(IRcode[a]==0xff)

{
for(a=2;a<3;a++)

{
switch (IRcode[a])

{
case 0x45:
DD();
break;
case 0x0C:
KEY1();
break;
case 0x40:
forward();
break;
case 0x19:
back();
break;
case 0x07:
left();
break;
case 0x09:
right();
break;
default:
break;
}
}


}
}
Delay();
aa=0;
}


}


点击回目录
  评论这张
 
阅读(4369)| 评论(1)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017