51单片机红外解码C程序

问题补充:我用89c52控制ULN2003去控制多个继电噐。单片机3.3脚接Hs0038接收红外。发射的遥控器为38K。准备在网上买。也就是有二元左右键的那种遥(好像二元... 问题补充: 我用89c52控制ULN2003去控制多个继电噐。单片机3.3脚接Hs0038接收红外。发射的遥控器为38K。准备在网上买。也就是有二元左右键的那种遥(好像二元左右)单片机的p0口和p2口控制2003。由于很久没搞程序了。希望大家给个程序,晶振11059200.要不12M的也行。因为自己装修房子用,所以自已搞。程序对了给你充30元话费,留言的朋友请留手机号码,不过我月底才加工pcB。所以充话费要迟一点。谢谢

上为原理图。
下面为发射

2.产品内含1个CR2025纽扣电
4.发射管红外波长:940Nm
5. 振荡频率455KHz, 红外载波频率: 38KHz
用0到9键控制P0到P2前面的十个脚。其它的我自已加上去。每个数按一次为开,再按为关。要完整C程序,谢!!
展开
 我来答
中团8L
2013-03-16 · TA获得超过566个赞
知道小有建树答主
回答量:401
采纳率:0%
帮助的人:152万
展开全部
单片机采用外部中断P3.3管脚和红外接收头的搜袜信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位操作码提取出来在数码管上显示。
// 解码值在Im[2]中,当IrOK=1时解码有效。 
/* 51单片机红外遥控解码程序 */
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#include <reg52.h>
#define uchar unsigned char 
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar f;
#define Imax 14000    //此处为晶振为11.0592时的取值, 
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 1450    //要改变相应的取乱漏态值。
#define Inum2 700 
#define Inum3 3000
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
  uchar j,k; 
  for(j=i;j>0;j--)
  哗源  for(k=125;k>0;k--);
}
void display()
{
   dula=0;
   P0=table[show[0]];
   dula=1;
   dula=0;
   wela=0;
   P0=0xfe;
   wela=1;
   wela=0;
   delay(5);
   P0=table[show[1]];
   dula=1;
   dula=0;
   P0=0xfd;
   wela=1;
   wela=0;
   delay(5);
} //外部中断解码程序
void intersvr1(void) interrupt 2 using 1
{
 Tc=TH0*256+TL0;                                               //提取中断时间间隔时长
 TH0=0; 
    TL0=0;              //定时中断重新置零
 if((Tc>Imin)&&(Tc<Imax))
      { 
  m=0;
        f=1;
  return;
      }       //找到启始码
   if(f==1)
      {
        if(Tc>Inum1&&Tc<Inum3) 
    {
   Im[m/8]=Im[m/8]>>1|0x80; m++; 
       }
      if(Tc>Inum2&&Tc<Inum1) 
        {
         Im[m/8]=Im[m/8]>>1; m++; //取码
  }
  if(m==32) 
   {
         m=0;  
         f=0;
         if(Im[2]==~Im[3]) 
      {
           IrOK=1; 
   }
        else IrOK=0;   //取码完成后判断读码是否正确
     }
               //准备读下一码
   }
}
/*演示主程序*/
void main(void)
{
    unsigned int  a;
 m=0;
    f=0;
 EA=1;
 IT1=1;EX1=1;
 TMOD=0x11;  
 TH0=0;TL0=0;
 TR0=1;//ET0=1;
 while(1)
 {
       if(IrOK==1) 
  {
      show[1]=Im[2] & 0x0F;     //取键码的低四位
           show[0]=Im[2] >> 4;  
           IrOK=0;
  }
           for(a=100;a>0;a--)
          {
    display();
   }
 }
}
解码程序这个就能实现
百度网友25510dd
推荐于2017-11-25 · TA获得超过217个赞
知道小有建树答主
回答量:131
采纳率:100%
帮助的人:130万
展开全部
关键程序如下:世没
//外部中断为边沿触发,接低电平进入
//1838将外部的高电平转为低搜让纳电平
//NEC的码为1时,初次进入外部中断,滑运启动定时器,下一次进入外部中断时通过定时器数值判断
//上一脉冲的周期,从而区分引导码或0码1码......
void intersvr1(void) interrupt 2 using 1 //外部中断
{
Tc=TH0*256+TL0;
TH0=0;
TL0=0; //定时中断重新置零
if((Tc>Imin)&&(Tc<Imax)) //8-14毫秒对应引导码13.5毫秒(9高4.5低)
{
m=0;
f=1;
return;
//在函数中,如果碰到return 语句,那么程序就会返回调用该函数的下一条语句执行,也就是说跳出函数的执行,回到原来的地方继续执行下去。
}
if(f==1)
{
if(Tc>Inum1&&Tc<Inum3) //1.45-3.0毫秒对应NEC码的1.125(0.565;0.565)毫秒的1
{
Im[m/8]=Im[m/8]>>1|0x80; m++; //取一位码,共32个位,放在数组Im[4]的4字节中
}
if(Tc>Inum2&&Tc<Inum1) //0.7-1.45毫秒对应NEC码的1.125(0.565;1.685)毫秒的0
{
Im[m/8]=Im[m/8]>>1; m++; //取一位码,共32个位,放在数组Im[4]的4字节中
}
if(m==32)
{
m=0;
f=0;
if(Im[2]==~Im[3]) //Im[2]为8位数据码,Im[3]为8位数据码的反码
{
IrOK=1;
}
else IrOK=0; //取码完成后判断读码是否正确
}
}
}

想要完整的demo留邮箱
更多追问追答
追问
你重新看下问题补充,由于时间紧。没时间学。最好注释。我当然要学会并关掉资料写程序上去,才有成就感
追答
程序很简单,你现在有什么问题,要我给你写完整的程序???你至少也得描述清楚几个继电器,还有什么控制。
我的这个解码可以接NEC编码的遥控器。
自己装房子,你想达到遥控电器的目的??
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
田少聪tsc
2013-03-16 · 超过13用户采纳过TA的回答
知道答主
回答量:106
采纳率:0%
帮助的人:27.9万
展开全部
哈哈,这个我最近刚写出来,遥控器和你那个一样,1~8键控制8个IO口,按下0键关闭所迅丛有IO口,电源键可接继电器控制总开关,程序改写简单,家里的遥控简岩器均可利用,多拦昌御种工作方式,加qq:657054041
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
硬件开发88
2013-03-15 · TA获得超过8674个赞
知道大有可为答主
回答量:1757
采纳率:84%
帮助的人:585万
展开全部
给你个我做项目用的42位电视剧遥控器解码源代码 参考程序:
/**************************************************
*
* 51单片机精简遥控解码实验程序
*
*实验功能 :数码管显示遥控器键码
*
* 遥控器是42位电视遥控器
*
* 数正羡码管上电默认显示【 E--000 】
***************************************************/
#include "REG52.H"

sbit delu = P2^6; //数码管段选sbit wela = P2^7; //数码管位选
sbit IR_dat = P3^2; //遥控数据口sbit Bee_tp = P2^3;
unsigned int IR_boke;
unsigned char IR_temp;
unsigned char IR_vnum;
unsigned char IR_data[4];

unsigned char code value_tab[] =
{
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F
}; //0-9

#define IR_200 (200 * 110592 / 120000)
#define IR_800 (800 * 110592 / 120000)
#define IR_1120 (1120* 110592 /举稿拍 120000)
#define IR_2000 (2000* 110592 / 120000)
#define IR_8500 (8500* 110592 / 120000)
#define IR_9500 (9500* 110592 / 120000)
#define IR_4000 (4000* 110592 / 120000)
#define IR_4500 (4500* 110592 / 120000)

/*
** 外部中断初始化子函数
**/
void INTO_Init(void)
{
TMOD = 0x01;
EA = 1;
EX0 = 1;
IT0 = 1;
}

/*
** 红外下升沿低电平延时时间计算子函数
**/
unsigned int IR_Interrupt_LSB(void)
{
TL0 = 0;
TH0 = 0;
TR0 = 1;

while(!IR_dat && (TH0 & 0x80) == 0);
TR0 = 0;
return(TH0 * 256 + TL0);
}

/*
** 红外上升沿高电平延时时间计算子函数
**/
unsigned int IR_Interrupt_MSB(void)
{
TL0 = 0;
TH0 = 0;
TR0 = 1;

while(IR_dat && (TH0 & 0x80) == 0);
TR0 = 0;
return(TH0 * 256 + TL0);
}

/*
** 软敬租件延时1ms子函数
**/
void Delay_1ms(unsigned int time)
{
unsigned int x, y;
for(x = time; x > 0; x--)
for(y = 120; y > 0; y--);
}

void Buf_beepCmd(void)
{
unsigned char i;
for(i = 0; i < 100; i++)
{
Bee_tp = 0;
}
Delay_1ms(20);
Bee_tp = 1;
}

/*
** 数码管显示遥控器按键值子函数
**/
void Shumg_Display_dataCmd(unsigned char value_bai)
{
delu = 1; /*************** E ***************/
P0 = 0x79;
delu = 0;
P0 = 0xFF;
wela = 1;
P0 = 0xFE;
wela = 0;
Delay_1ms(2);

delu = 1; /*************** - ***************/
P0 = 0x40;
delu = 0;
P0 = 0xFF;
wela = 1;
P0 = 0xFD;
wela = 0;
Delay_1ms(2);

delu = 1; /*************** - ***************/
P0 = 0x40;
delu = 0;
P0 = 0xFF;
wela = 1;
P0 = 0xFB;
wela = 0;
Delay_1ms(2);

delu = 1;
P0 = value_tab[value_bai / 100]; /************** 百位 *************/
delu = 0;
P0 = 0xFF;
wela = 1;
P0 = 0xF7;
wela = 0;
Delay_1ms(2);

delu = 1;
P0 = value_tab[value_bai % 100 / 10]; /************** 十位 *************/
delu = 0;
P0 = 0xFF;
wela = 1;
P0 = 0xEF;
wela = 0;
Delay_1ms(2);

delu = 1;
P0 = value_tab[value_bai % 10]; /************** 个位 *************/
delu = 0;
P0 = 0xFF;
wela = 1;
P0 = 0xDF;
wela = 0;
Delay_1ms(2);
}

/*
** 函数主体
**/
int main(void)
{
INTO_Init();
while(1)
{
Shumg_Display_dataCmd(IR_data[2]);
}
}

/*
** 外部中断服务程序
**/
void INTO_timero()interrupt 0
{
unsigned char i;
unsigned char temp;

IR_dat = 1;
IR_boke = IR_Interrupt_LSB();
if((IR_boke < IR_8500) || (IR_boke > IR_9500)) /*******判断低电平引导码9ms********/
{
return;
}

IR_boke = IR_Interrupt_MSB();
if((IR_boke < IR_4000) || (IR_boke > IR_4500)) /******判断高电平引导码4.5ms******/
{
return;
}
IR_vnum = 3;
for(i = 1; i < 43; i++)
{ /******电视遥控器是42位编码*******/
IR_temp >>= 1;
IR_boke = IR_Interrupt_LSB();
if((IR_boke < IR_200) || (IR_boke > IR_800)) /********判断低电平0.56ms*********/
{
return;
}

IR_boke = IR_Interrupt_MSB();
if((IR_boke < IR_200) || (IR_boke > IR_2000)) /********判断高电平1.68ms********/
{
return;
}

if(IR_boke > IR_1120) /*********判断键码1还是0**********/
{
IR_temp |= 0x80;
}
if(i == 13 || i == 26 || i == 34 || i == 42)
{
IR_vnum++;
if(IR_vnum == 4)
{
IR_vnum = 0;
}
IR_data[IR_vnum] = IR_temp;
IR_temp = 0;
}
}

if((IR_data[0]) != (~ IR_data[1]) || (IR_data[2]) != (~ IR_data[3])) //判断用户吗和按键码
{
return;
}
temp = IR_data[2] / 16;
IR_data[2] = IR_data[2] % 16;
IR_data[2] = IR_data[2] + temp * 10; //得到的十六进制键码头转换成十进制数
Buf_beepCmd();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式