找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8325|回复: 7
打印 上一主题 下一主题
收起左侧

红外解码 控制继电器开关

[复制链接]
跳转到指定楼层
楼主
ID:60515 发表于 2015-5-31 10:04 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上都有很多种红外解码显示,就是不明白如何改成实用控制程序?比如9012遥控器解码,需要将哪部分修改才能实现?我想要控制继电器。哪位老师能指点一下?谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:66287 发表于 2015-6-1 15:17 | 只看该作者
必须先解出码值,再每个码值对应不同的看着就行了
回复

使用道具 举报

板凳
ID:60515 发表于 2015-6-1 17:18 来自手机 | 只看该作者
bhjyqjs 发表于 2015-6-1 15:17
必须先解出码值,再每个码值对应不同的看着就行了

谢谢!
回复

使用道具 举报

地板
ID:35471 发表于 2015-6-1 19:01 | 只看该作者
最后先分析出波形,再解码!
回复

使用道具 举报

5#
ID:60515 发表于 2015-6-2 20:38 来自手机 | 只看该作者
二十出头 发表于 2015-6-1 19:01
最后先分析出波形,再解码!

#include
#define uchar unsigned char
#define uint unsigned int
int irtime;
uchar disp[8];
uchar startflag;//开始标志
uchar irdata[33];//数据一共33位加上引导码
uchar bitnum;
uchar irreceok;//接收一帧数据完成
uchar ircode[4];//4个字节的数据
uchar irprosok;//处理完成

sbit SH_CP=P2^4;
sbit DS=P2^5;
sbit ST_CP=P1^5;

uchar code wei[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code duan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //0123456789abcdef


void send_dat(unsigned dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
DS=dat&0x80;
SH_CP=1;
SH_CP=0;
dat<<=1;
}
}



void timer0init(void)
{
TMOD=0X02;
TH0=0;
TL0=0;
ET0=1;
EA=1;
TR0=1;
}

void int0init(void)
{
IT0=1;
EX0=1;
EA=1;
}

void irwork()
{
//disp[0]=ircode[0]/16;
//disp[1]=ircode[0];
//disp[2]=ircode[1]/16;
//disp[3]=ircode[1];
// disp[4]=ircode[2]/16;
// disp[5]=ircode[2]/100;
// disp[6]=ircode[2]0/10;
// disp[7]=ircode[2];

switch (ircode[2])
{
  case 6 : disp[6]=0;disp[7]=1;break;
case 12 :disp[6]=0;disp[7]=2 ;break;
case 47 :disp[6]=0;disp[7]=3;break;
case 4 : disp[6]=0;disp[7]=4;break;
case 14 :disp[6]=0;disp[7]=5 ;break;
case 45 :disp[6]=0;disp[7]=6;break;
case 33: disp[6]=0;disp[7]=7;break;
case 41 :disp[6]=0;disp[7]=8 ;break;
case 37 :disp[6]=0;disp[7]=9;break;

default : disp[5]=0;
disp[6]=15;
disp[7]=15 ;
}

}

void irpros(void)   //处理函数
{
uchar k,i,j;
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
if(irdata[k]>10)//时间长度等于1.125ms就是0 等于2.25ms就是1;
{
value=value|0x80;
}
else
{
value=value;
}
if(i<8)
{
value=value>>1;
}
k++;
}
ircode[j]=value;//ircode[j]返回的是十六进制数。
value=0;
}
irprosok=1;
}

void display(void)
{
uchar i;
for(i=5;i<8;i++)
{
   send_dat(duan[disp]);       //定义段   0亮
send_dat(wei); //定义位 1亮  
   ST_CP=1;
ST_CP=0;
//delay(2);
}
}

void main()
{
timer0init();
int0init();
while(1)
{
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irwork();
irprosok=0;
}
display();
}
}

void timer0 () interrupt 1
{
irtime++;
}

void int0 () interrupt 0
{
if(startflag)
{
if(irtime<126&&irtime>=66)//检测引导码9ms
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}

}



比如这个改成三个控制继电器应该怎么改?

回复

使用道具 举报

6#
ID:35471 发表于 2015-6-9 21:24 | 只看该作者
GUOPK 发表于 2015-6-2 20:38
#include
#define uchar unsigned char
#define uint unsigned int

不是读到数据了么,if判断不同的数值,再进行不同的操作不就行了。
回复

使用道具 举报

7#
ID:35471 发表于 2015-6-9 21:28 | 只看该作者
GUOPK 发表于 2015-6-2 20:38
#include
#define uchar unsigned char
#define uint unsigned int

比如说红外按键1读到的是0x01,dat=ircode[2];
if(dat==0x01)
{
flag++;
if(flag==2)
flag=0;
}
if(!flag)
jidianqi1=1;//开继电器1
else
jidianqi1=0//关继电器
回复

使用道具 举报

8#
ID:35471 发表于 2015-6-9 21:29 | 只看该作者
GUOPK 发表于 2015-6-2 20:38
#include
#define uchar unsigned char
#define uint unsigned int

比如说红外按键1读到的是0x01,dat=ircode[2];
if(dat==0x01)
{
flag++;
if(flag==2)
flag=0;
}
if(!flag)
jidianqi1=1;//开继电器1
else
jidianqi1=0//关继电器
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表