51单片机红外接收端的程序怎么写,我想知道写的方法和原理,最好有一个具体的模版,好让我参考.

51单片机红外接收端的程序怎么写,我想知道写的方法和原理,最好有一个具体的模版,好让我参考.,第1张

这是采用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等遥控器方面的程序要怎么写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9283225.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存