
这是采用STC12C5A60S2单片机的红外解码程序及其说明。
;采用脉宽调制的串行码,以脉宽为0565ms、间隔056ms、周期为1125ms的组合表示二进制的"0";
;以脉宽为0565ms、间隔1685ms、周期为225ms的组合表示二进制的"1
;上述"0"和"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,
;达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射
;遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,
;防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H
;后16位为8位 *** 作码(功能码)及其反码。
;当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),
;一个结果码(45ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)
;和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,
;接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(25ms)组成。
;
;解码的关键是如何识别"0"和"1",接收端而言,"0"是056ms的高+056ms的低。"1"是168ms的高+056ms的低。
;所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,056ms以后,若读到的电平为低,
;说明该位为"0",反之则为"1",为了可靠起见,延时必须比056ms长些,但又不能超过112ms,否则如果该位为"0",
;读到的已是下一位的高电平,因此取(112ms+056ms)/2=084ms最为可靠,一般取084ms左右均可。
;为了共用引导部分延时程序,这里用09ms延时。
;-------------红外解码程序---------------------------
EXINT0:
PUSH ACC
PUSH PSW
PUSH 1
PUSH 2
PUSH 6
CLR EA ;暂时关闭中断请求
MOV R6,#10
EXINT10:
LCALL DELAY09MS ;调用900us延时子程序
JB IRIN,INTOUT1 ;判断P32是否有高电平,如果有就退出解码程序
DJNZ R6,EXINT10 ;循环10次,检测在900微妙中是否存在高电平。以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB IRIN,$ ;等待高电平避开9毫秒低电平引导脉冲
LCALL DELAY45MS ;延时45毫秒
;-------------接受32位代码--------------------------
MOV R1,#IRUSERL
MOV R2,#04H
EXINT101:
MOV R6,#08H ;每组数据位8位
EXINT102:
JNB IRIN,$ ;等待地址码第一组数据的高电平信号
LCALL DELAY09MS ;高电平开始后延时判断信号此时的高/低状态
MOV C,IRIN ;将P32引脚此时的电平状态0或1存入C中
JNC INT1OUT ;如果为0跳出
LCALL DELAY1MS
INT1OUT:
MOV A,@R1
RRC A ;将C中的数据0/1移入A中最低位
MOV @R1,A ;将A中的数据暂存在R1
DJNZ R6,EXINT102 ;接受完8位代码
INC R1
DJNZ R2,EXINT101 ;接受完4组32位代码
;--------------数据码比较-------------------------------
MOV A,IRDATAL
; LCALL SENDRXDAT
MOV A,IRDATAL
CPL A
CJNE A,IRDATAH,INTOUT1 ;判断数码正误,不等退出
MOV IR_DAT,IRDATAL ;相等则保存正确数据
MOV A,IR_DAT
; LCALL SENDRXDAT
SETB IRBIT
INTOUT1:
LCALL DELAY45MS
SETB EA ;允许中断
POP 6
POP 2
POP 1
POP PSW
POP ACC
RETI
;;110592900=9953
DELAY09MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#20 ;2
DLY900:
MOV R3,#122 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY900 ;4
MOV R4,#11 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=9952
;;110592560=6193
DELAY056: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#12 ;2
DLY5600:
MOV R3,#122 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY5600 ;4
MOV R4,#71 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=6194
;;1105924500=49766
DELAY45MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#52 ;2
DLY45:
MOV R3,#236 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY45 ;4
MOV R4,#85 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;;TOTAL=49768
;;1105921000=11059
DELAY1MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#20 ;2
DLY1MS:
MOV R3,#136 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY1MS ;4
MOV R4,#8 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=11060
;;
DELAY100US: ;6
PUSH 4 ;4
MOV R4,#140 ;2
DJNZ R4,$ ;4
MOV R4,#131 ;2
DJNZ R4,$ ;4
POP 4 ;3
RET ;4
;TOTAL=1105
;;
给你一段430单片机遥控器解码的程序吧,也就是接收部分
毕竟世界太现实只能这么帮你
#ifndef _IR_
#define _IR_
char t0,t1,t2;
uchar IR;
void DelayIR()
{
uint i=130;
while(i--);
}
void init_port2(void)
{
P2DIR&=~BIT0;
P2SEL&=~BIT0;
P2IES|=BIT0;
P2IE|=BIT0;
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
char CounterIR;
P2IES&=~BIT0;
if(P2IFG&BIT0)
{
P2IFG&=~BIT0;
}
CounterIR=0;
while(!(P2IN&BIT0))
{
DelayIR();
CounterIR++;
}
if(CounterIR>85)
{
if(CounterIR<95)
{
t1++;
for(char k=0;k<17;k++)
{
CounterIR=0;
while((P2IN&BIT0)&&(CounterIR<50))
{
DelayIR();
CounterIR++;
}
CounterIR=0;
while((!(P2IN&BIT0))&&(CounterIR<10))
{
DelayIR();
CounterIR++;
}
}
for(char j=0;j<8;j++)
{
CounterIR=0;
while((P2IN&BIT0)&&(CounterIR<25))
{
DelayIR();
CounterIR++;
}
IR<<=1;
if(CounterIR>11)
IR|=BIT0;
CounterIR=0;
while((!(P2IN&BIT0))&&(CounterIR<10))
{
DelayIR();
CounterIR++;
}
}
if((IR!=0xff)&&(IR!=0x00))
{
if(!(flag&dataflag))
{
if(IR==0x22)
{
flag|=runflag;
}
else
{
Tar[0]=Tar[1];
Tar[1]=Tar[2];
Tar[2]=Tar[3];
Tar[3]=Tar[4];
switch (IR)
{
//case 0x22 : flag|=runflag;break;
case 0x68 : Tar[4]=0;flag|=dataflag;break;
case 0x30 : Tar[4]=1;flag|=dataflag;break;
case 0x18 : Tar[4]=2;flag|=dataflag;t2++;break;
case 0x7a : Tar[4]=3;flag|=dataflag;break;
case 0x10 : Tar[4]=4;flag|=dataflag;break;
case 0x38 : Tar[4]=5;flag|=dataflag;break;
case 0x5a : Tar[4]=6;flag|=dataflag;break;
case 0x42 : Tar[4]=7;flag|=dataflag;break;
case 0x4a : Tar[4]=8;flag|=dataflag;break;
case 0x52 : Tar[4]=9;flag|=dataflag;break;
default : break;
}
}
}
}
IR=0;
}
}
for(int m=0;m<250;m++)
DelayIR();
P2IES|=BIT0;
}
#endif
给你一个我编的红外解码的程序,这个程序会将接收到的红外编码中的8位码通过串口发送到上位机,你可以通过串口调试助手来看看,程序是正确的,希望对你有参考价值。 ////////////////////////////////////////////////////////////////// //////////////////////////yorkWorldDream///////////////////////// ///////////////////////////////////////////////////////////////// #include"reg52h" #define uchar unsigned char #define uint unsigned int //tc9012 uchar flag=0;//是否接到起始位标志 未接到为0 接到为1 uchar traflag=0;//翻译是否完成标记 完成为1 uchar rec[33];//接收遥控器发送的所有数据 用来记录两个下降沿之间的时间 uchar recok=0;//是否接收完一帧数据标记 接收完为1 uchar sendok=0;//是否发送完毕标记 发送完成为1 uchar num=0;//变相记录时间 uchar n=0;//rec[]中的数组定位 void timerinit();//定时器0初始化 void ruptinit();//外部中断0初始化 void tradata();//一帧数据的翻译 即把时间记录转换成0/1 void send();//把收到的数据发给上位机 void delay(); //////////////////////////定时器 中断初始化///////////////////////////////// void timerinit()//定时器0 { TMOD=0x02;//定时器0使用方式2 TH0=0x00; TL0=0x00; EA=1; ET0=1;//定时器中断开 TR0=1;//计时开 } void ruptinit()//外部中断0 { EA=1; EX0=1;//外部中断开 IT0=1;//下降沿触发 0是电平触发 } ////////////////////////////定时器 中断函数////////////////////////////// void timer() interrupt 1 //系统从0x00记到0xff 每记一次时间大概为1us 记256次 即256us中断一次 { num++;//num记录的是256us的个数 总时间=num256us } void rupt() interrupt 0 //外部中断0 当遇到下降沿时触发 { if(flag==1)//flag为1 说明收到了起始位 接下来要开始进行记录了 { if(num>32)//时间为32256us=82ms是整个起始位的时间 { n=0; } rec[n]=num;//记录两个下降沿之间的num值 这样也就相当于记录了其间的时间 num=0; n++; if(n==33)//因为前面是n++ 所以当n=33时 数组已经从0记到了32 已经记满了 { recok=1;//标记 接收一帧数据完成 n=0; } } else//首次得到下降沿到达这里 使flag变1 用来说明收到了起始位 { flag=1; } } /////////////////////////////时间翻译函数/////////////////////////////////////// void tradata()//一帧数据的翻译 即把时间记录转换成0/1 { uchar i; for(i=1;i/0的数据时间是num=44 1的数据时间是num=88 { //记住要从rec[1]开始 因为rec[0]记录的是引导码的num值 if(rec[i]>6)//使用6做中间值 小于则为0 大于为1 用0/1替换rec中的数据 这样就进行了翻译 { rec[i]='1'; }//因为要以字符串发送 所以这里用字符形式 else rec[i]='0'; } traflag=1;//翻译完成标记 } /////////////////////////////发送数据函数//////////////////////////////////// void send()//把收到的数据发送给上位机 具体细节不懂看串口通信 mcu to pc { uchar i; TMOD=0x20; TH1=0xfd; TL1=0xfd; TR1=1; SM0=0; SM1=1; REN=1; for(i=25;i/选择要发送出去的数据 这里是从25开始发送的 { SBUF=rec[i]; while(!TI); TI=0; } sendok=1; } //////////////////////////////////////////////////////////////////////// void delay()//1ms { unsigned char a,b,c; for(c=1;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main() { timerinit();//定时器0初始化 ruptinit();//外部中断0初始化 while(1) { if(recok==1)//接收一帧数据完成 { P1=0xfe;//灯亮一下 为了指示是否收到了数据 tradata();//翻译数据 } delay(); if(traflag==1)//翻译完成 { send();//发送 } delay(); if(sendok==1)//发送完成 { flag=0; traflag=0; recok=0; sendok=0; P1=0xff; timerinit(); ruptinit(); } //全部恢复初始 }
若是使用的vivo手机,手机中没有相关开关,手机默认开启,vivo手机有红外感应器,通过发射红外线遇到物体反射并接收后感知物体与手机的距离,用来触发一系列的功能(如:接电话时手机靠近人脸自动熄屏)。可进入手机设置--系统管理/我的设备--客户服务--使用手册--手机概览与快速入门--手机外观简介里查看具体位置。
(部分机型需进入设置--更多设置--使用手册/说明书--手机概览与快速入门--手机外观简介查看)
若指的是红外遥控,目前支持红外遥控功能的机型有:iQOO Z7、iQOO Neo7竞速版、iQOO 11系列、iQOO Neo7 SE、X90系列、iQOO Neo7、X Fold+、iQOO 10、iQOO 10 Pro、iQOO Neo6 SE、X80系列、iQOO Neo6、X Fold、X Note、iQOO 9 Pro、X70系列。
使用红外遥控的方法可以参考以下信息:
添加遥控
打开“智慧生活”APP--首页--智能遥控--拍照识别/手动添加 遥控器
拍照识别:将拍摄框上下边缘与遥控器顶部和底部对齐,识别添加遥控器。
手动添加:选择电器类型,如:空调、电视等,再选择品牌,将手机顶部(红外发射孔)朝向电器,手机与电器距离15米范围内,按照屏幕提示点击按键测试,测试成功后,设定遥控器名称,点击“立即使用”即可。
添加遥控到桌面
1、将遥控器添加到桌面快捷方式:打开“智慧生活”APP--首页--智能遥控--长按对应遥控器--桌面快捷
2、在桌面添加遥控组件:从屏幕中间上滑--原子组件--智慧生活/智能遥控--长按拖动到桌面--点击桌面遥控器原子组件--添加对应遥控器(最多添加5个)。如需再次进入遥控器原子组件编辑页面,添加或删除遥控器,可以长按桌面遥控器原子组件图标--管理遥控 进行相应 *** 作。
使用遥控
1、打开“智慧生活”APP--首页--智能遥控--选择对应遥控器使用;
2、点击桌面的遥控快捷方式进入遥控界面;
3、点击桌面遥控器原子组件,左右滑动可以切换不同的遥控器,点击进入对应遥控界面。
更多使用疑惑可进入vivo官网--我的--在线客服--输入人工,咨询在线客服反馈。
(1)发送程序
#include <reg52h>
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned int temp; //按键
static unsigned char flag; //红外发送标志
static unsigned char num;
sbit ir_in=P3^4;
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 2009-8-11 <br>4 <br>红外数据传输 <br>0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳数码管 0~~f
void SendIRdata(char p_irdata);
void delay(unsigned int);
void keyscan();
/主函数/
void main(void)
{
num=0;
P2=0x3f;
count = 0;
flag = 0;
OP = 0;
ir_in= 0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1;//开始计数
iraddr1=3;//00000011
iraddr2=252;//11111100
do{keyscan(); <br>}while(1);
}
/定时器0中断处理 /
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
ir_in= OP;
}
void SendIRdata(char p_irdata)
{ 2009-8-11
5
红外数据传输
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
/发送45ms的结果码/
endcount=117;
flag=0;
count=0;
do{}while(count<endcount);
/发送十六位地址的前八位/
irdata=iraddr1;
for(i=0;i<8;i++)
{
/先发送056ms的38KHZ红外波(即编码中056ms的低电平)/
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
/停止发送红外信号(即编码中的高电平)/
if(irdata-(irdata/2)2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/发送十六位地址的后八位/
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)2)
{
endcount=41;
}
else
{ 2009-8-11
6
红外数据传输
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/发送八位数据/
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
/发送八位数据的反码/
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
2009-8-11
7
红外数据传输
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay(unsigned int z)
{
unsigned char x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/4×4键盘扫描按下按键发射数据/
void keyscan()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=1;
break;
case 0xde:num=2;
break;
case 0xbe:num=3;
break;
case 0x7e:num=4;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
P2=table[num-1];
SendIRdata(table[num-1]);
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=5;
break;
case 0xdd:num=6;
break;
case 0xbd:num=7;
break;
case 0x7d:num=8; 2009-8-11
8
红外数据传输
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
P2=table[num-1];
SendIRdata(table[num-1]);
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=9;
break;
case 0xdb:num=10;
break;
case 0xbb:num=11;
break;
case 0x7b:num=12;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
P2=table[num-1];
SendIRdata(table[num-1]);
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=13;
break;
case 0xd7:num=14;
break;
case 0xb7:num=15;
break;
case 0x77:num=16;
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
} 2009-8-11
9
红外数据传输
P2=table[num-1];
SendIRdata(table[num-1]);
}
}
(2)接收程序
#include"reg52h"
#define uchar unsigned char
#define uint unsigned int
uchar dis_num,num,num1,num2,num3;
sbit led=P1^0;
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e}; //共阳数码管 0~~f
sbit prem =P3^2; //定义遥控头的接收脚
uchar ram[4]={0,0,0,0};//存放接受到的4个数据 地址码16位+按键码8位+按键码取反的8位
void delaytime(uint time) //延迟90uS
{
uchar a,b;
for(a=time;a>0;a--)
{
for(b=40;b>0;b--);
}
}
void rem()interrupt 0 //中断函数
{
uchar ramc=0; //定义接收了4个字节的变量
uchar count=0; //定义现在接收第几位变量
uint i=0; //此处变量用来在下面配合连续监测9MS 内是否有高电平
prem=1;
for(i=0;i<1100;i++) //以下FOR语句执行时间为8MS左右
{
if(prem) //进入遥控接收程序首先进入引导码的前半部判断,即:是否有9MS左右的低电平
return; //引导码错误则退出
}
while(prem!=1); //等待引导码的后半部 45 MS 高电平开始的到来。
delaytime(50); //延时大于45MS时间,跨过引导码的后半部分,来到真正遥控数据32位中
//第一位数据的056MS开始脉冲
for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节
{ for(count=0;count<8;count++) //循环8次接收8位(一个字节)
{
while(prem!=1); //开始判断现在接收到的数据是0或者1 ,首先在这行本句话时,
//保已经进入数据的056MS 低电平阶段
//等待本次接受数据的高电平的到来。
delaytime(9);//高电平到来后,数据0 高电平最多延续056MS,而数据1,高电平可 2009-8-11
10
红外数据传输
//延续166MS大于08MS 后我们可以再判断遥控接收脚的电平,
if(prem) //如果这时高电平仍然在继续那么接收到的数据是1的编码
{
ram[ramc]=(ram[ramc]<<1)+1;//将目前接收到的数据位1放到对应的字节中
delaytime(11); //如果本次接受到的数据是1,那么要继续延迟1MS,这样才能跨入
//下个位编码的低电平中(即是开始的056MS中)
}
else //否则目前接收到的是数据0的编码
ram[ramc]=ram[ramc]<<1; //将目前接收到的数据位0放到对应的字节中
} //本次接收结束,进行下次位接收,此接收动作进行32次,正好完成4个字节的接收
}
if(ram[2]!=(~(ram[3]&0x7f))) //本次接收码的判断
{
for(i=0;i<4;i++) //没有此对应关系则表明接收失败,清除接受到的数据
ram[i]=0;
return ;
}
dis_num=ram[2]; //将接收到的按键数据赋给显示变量
}
main()
{
IT0=1; //设定INT0为边沿触发
EX0=1; //打开外部中断0
EA=1; //全局中断开关打开
while(1)
{
switch(dis_num)
{
case 0x81: num=0; break;
case 0xcf: num=1; break;
case 0x92: num=2; break;
case 0x86: num=3; break;
case 0xcc: num=4; break;
case 0xa4: num=5; break;
case 0xa0: num=6; break;
case 0x8f: num=7; break;
case 0x80: num=8; break;
case 0x84: num=9; break;
case 0x88: num=10;break;
case 0xe0: num=11;break;
case 0xb1: num=12;break;
case 0xc2: num=13;break;
case 0xb0: num=14;break;
case 0xb8: num=15;break;
}
P2=table[num];
P1=0x01;
delaytime(5);
}
}
单片机红外电视遥控器C51程序代码单片机程序
//
//名称:单片机红外电视遥控器C51程序代码()
/--------------------------------------------------------------
描述:
一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz的方波进行
脉冲幅度调制而产生的当发射器按键按下后,即有遥控码发出,所按的键
不同遥控编码也不同。这种遥控码具有以下特征:
采用脉宽调制的串行码,以脉宽为0565ms、间隔056ms、周期为1125ms的
组合表示二进制的“0”;以脉宽为0565ms、间隔1685ms、周期为225ms
的组合表示二进制的“1”。上述“0”和“1”组成的32位二进制码经38kHz
的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。
一般电视遥控器的遥控编码是连续的32位二进制码组,其中前16位为用户识
别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位
为8位的 *** 作码和8位的 *** 作反码,用于核对数据是否接收准确。
根据红外编码的格式,发送数据前需要先发送9ms的起始码和45ms的结果码。
接收方一般使用TL0038一体化红外线接收器进行接收解码,当TL0038接收到
38kHz红外信号时,输出端输出低电平,否则为高电平。
所以红外遥控器发送红外信号时,参考上面遥控串行数据编码波形图,在低
电平处发送38kHz红外信号,高电平处则不发送红外信号。
----------------------------------------------------------------/
//编辑:
//日期:
//
#define uchar unsigned char //定义一下方便使用
#define uint unsigned int
#define ulong unsigned long
#include <reg51h> //包括一个51标准内核的头文件
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
void SendIRdata(char p_irdata);
void delay();
//
void main(void)
{
count=0;
flag=0;
OP=0;
P3_4=0;
EA = 1; //允许CPU中断
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0 = 1; //开始计数
iraddr1=3;
iraddr2=252;
do{
delay();
SendIRdata(12);
}
while(1);
}
//
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
else
P3_4 = OP;
}
//
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count)
//发送45ms的结果码
endcount=117;
flag=0;
count=0;
do{}while(count)
//----------------------发送十六位地址的前八位-------------------
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送056ms的38KHZ红外波
endcount=10; //(即编码中056ms的低电平)
flag=1;
count=0;
do{}while(count)
//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)2) //判断二进制数个位为1还是0
{ endcount=41; //1为宽的高电平
}
else
{ endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count)
irdata=irdata>>1;
}
//-----------------------发送十六位地址的后八位-------------------
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count)
if(irdata-(irdata/2)2)
else
flag=0;
count=0;
do{}while(count)
irdata=irdata>>1;
}
//-----------------------发送八位数据------------------------------
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count)
if(irdata-(irdata/2)2)
else
flag=0;
count=0;
do{}while(count)
irdata=irdata>>1;
}
//-------------------------发送八位数据的反码----------------------
irdata=~p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count)
if(irdata-(irdata/2)2)
else
flag=0;
count=0;
do{}while(count)
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count) flag=0;
}
//
void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++) ;
}
}
C51
#include <stc12c5a60s2h>
sbit P3_2=P3^2;
sbit P2_0=P2^0; //P20接一个LED用于指示,led正极接单片机
void main()
{
while(1)
{
if(P3_2)
{
P2_0=0; //未对准,led灭
}
else
{
P2_0=1; //对准,led亮
}
}
}
整个单片机就干这么一个活,太浪费了。
如果还有其他的要执行,就用外部中断,下降沿触发。
以上就是关于51单片机红外接收端的程序怎么写,我想知道写的方法和原理,最好有一个具体的模版,好让我参考.全部的内容,包括:51单片机红外接收端的程序怎么写,我想知道写的方法和原理,最好有一个具体的模版,好让我参考.、用C语言编写一个红外发送和接收的程序、想知道红外遥控LED等遥控器方面的程序要怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)