智能车制作

标题: 求教 红外解码???? [打印本页]

作者: chengeiis    时间: 2010-5-31 13:50
标题: 求教 红外解码????
我想做一个红外控制 利用电视遥控器来控制小车的前后左右 怎样才能达到效果 呢

程序如下  用遥控器的频道+-音量+-分别控制P2口的参数   可以达到吗  请高手详解。。。。感激不尽

我想达到的效果是比如按 电视的遥控器的频道+ P2=0X.. 频道-=0X..    ......
这程序的效果是数码管 以递增的形式16进制++

#include "reg52.h"
sbit ir=P3^3;    //红外接收IO口
unsigned char duan,wei,flag,jc,jc1;
unsigned int m,Tc;  //12M晶振
#define tmin 13220 //协议中高电平560us平分,提高容限
#define tmax 13780 // 9+4.5=13.5 + -280:13.22~13.78
#define thh 2530 //数据1
#define thl 1970 //2.25ms  不能大于 重复码9+2.25=11.25   10.97~11.53
#define tlh 1400 //数据0
#define tll 840  // 1.12ms
unsigned char dat[4]={0,0,0,0};//接收32为地址和命令码
//数码管显示表
unsigned char code tableduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code tablewei[]= {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};
void display();
void main()
{
ir=1;//开外部中断INT1
m=0;
EA=1;
EX1=1;
IT1=1;
ET0=0;//启动定时器0,只做计数不开启中断
TMOD=0x01;
TH0=0;
TL0=0;
TR0=1;

while(1)
{//---只显示了命令码,地址码可自行加入----
  duan=flag/16;//得到命令码高4位,16进制显示
  wei=6;
  display();
  duan=flag%16;//低4位
  wei=7;
  display();
  duan=jc%16;//显示引导码获得次数、判断是否检测到引导
  wei=0;     //码,调试用
  display();
  duan=jc1%16;//显示接收到数据“1”次数,低四位的数据
  wei=1;
  display();
}
}
void display()
{
unsigned char i=100;
P2=tableduan[duan];//P2口输出数码管段选数据
P1=tablewei[wei]; //P1的P10~P12 3个IO实现8数码管位选控制
while(i--);
}
void int0() interrupt 2
{
Tc=TH0*256+TL0;//得到一个低电平+高电平时序计时值
TH0=0;         
TL0=0;//继续下一个计时
if((Tc>tmin)&&(Tc<tmax))
{
  m=0;//检测到引导码
  jc++;  //不用管清零,加满后自动归0
}
if(m<32)
{
  if((Tc>thl)&&(Tc<thh))//取码
  {
   dat[m/8]=(dat[m/8]>>1)|0x80;
   m++;
   jc1++;
  }
  else if((Tc>tll) && (Tc<tlh))
  {
   dat[m/8]=(dat[m/8])>>1;
   m++;
  }
}
else m=0;//在没接收到引导码的情况下清0,调试用
if(dat[2]==~dat[3])//判断数据是否正确,正确就取出
  flag=dat[2];//取码完成后判断读码是否正确
}




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2