红外发射模块怎么用51单片机编程使用

红外发射模块怎么用51单片机编程使用,第1张

红外发射模块用51单片机编程使用:用定时器中断来做,红外发送引脚连接到P10口, 计数一下定时初值(让P10的翻转频率为38KHZ),进定时器中断就对P10取反,这样红外就发送出去了。

红外线发射管(IR LED)也称红外线发射二极管,属于二极管类。它是可以将电能直接转换成近红外光(不可见光)并能辐射出去的发光器件。

红外线发射管(IR LED)也称红外线发射二极管,属于二极管类。它是可以将电能直接转换成近红外光(不可见光)并能辐射出去的发光器件,主要应用于各种光电开关、触摸屏及遥控发射电路中。红外线发射管的结构、原理与普通发光二极管相近,只是使用的半导体材料不同。红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装。

这里面有个误区,定时,不一定需要用定时器,也不一定需要中断。

发红外遥控码,时间要求不是很精确,最简单的办法是直接用程序定时,51一个机器周期12个振荡周期,12兆晶振下,一条单周期指令是1个微秒,26个周期差不多就是38K。需要9ms,就是9000除以26,循环346次就可以了。

红外线遥控器解码程序

2007-02-07 18:52 红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。现在工业设备中,也已经广泛在使用。。。。。

1 红外遥控系统

通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制 *** 作,如图1所示。发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

2 遥控发射器及其编码

遥控发射器专用芯片很多,根据编码格式可以分成脉冲宽度调制和脉冲相位调制两大类,这里我们以运用比较广泛,解码比较容易的脉冲宽度调制来加以说明,现以3310组成发射电路为例说明编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征:

采用脉宽调制的串行码,以脉宽为0565ms、间隔056ms、周期为1125ms的组合表示二进制的“0”;以脉宽为0565ms、间隔1685ms、周期为225ms的组合表示二进制的“1”

上述“0”和“1”组成的42位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,

3310产生的遥控编码是连续的42位二进制码组,其中前26位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后16位为8位的 *** 作码和8位的 *** 作反码用于核对数据是否接收准确。

当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个45ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。

解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以056ms的低电平开始,不同的是高电平的宽度不同,“0”为056ms,“1”为168ms,所以必须根据高电平的宽度区别“0”和“1”。如果从056ms低电平过后,开始延时,056ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比056ms长些,但又不能超过112ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(112ms+056ms)/2=084ms最为可靠,一般取084ms左右即可。

根据红外编码的格式,程序应该等待9ms的起始码和45ms的结果码完成后才能读码。

接收器及解码

LT0038是塑封一体化红外线接收器,它是一种集红外线接收、放大、整形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出与TTL电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外线遥控和红外线数据传输。

下面是一个对51ISP编程实验开发板配套的红外线遥控器的解码程序,它可以把红外遥控器每一个按键的键值读出来,并且通过实验板上P1口的8个LED显示出来,在解码成功的同时并且能发出“嘀嘀嘀”的提示音。

ORG 0000H

AJMP MAIN;转入主程序

ORG 0003H ;外部中断P32脚INT0入口地址

AJMP INT ;转入外部中断服务子程序(解码程序)

;以下为主程序进行CPU中断方式设置

MAIN:SETB EA ;打开CPU总中断请求

SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发

SETB EX0 ;打开INT0中断请求

;以下对单片机的所有引脚进行初始化,全部设置成高电平

MOV P2,#11111111B

AJMP $

;以下为进入P32脚外部中断子程序,也就是解码程序

INT: CLR EA ;暂时关闭CPU的所有中断请求

MOV R6,#10

SB: ACALL YS1;调用882微秒延时子程序

JB P32,EXIT;延时882微秒后判断P32脚是否出现高电平如果有就退出解码程序

DJNZ R6, SB;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序

;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB P32, $ ;等待高电平避开9毫秒低电平引导脉冲

ACALL YS2 ;延时474毫秒避开45毫秒的结果码

MOV R7,#26;忽略前26位系统识别码

JJJJA:JNB P32,$;等待地址码第一位的高电平信号

LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

MOV C,P32;将P32引脚此时的电平状态0或1存入C中

JNC UUUA;如果为0就跳转到UUUA

LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束

UUUA: DJNZ R7,JJJJA

MOV R1,#1AH ;设定1AH为起始RAM区

MOV R2,#2;接收从1AH到1BH的2个内存,用于存放 *** 作码和 *** 作反码

PP: MOV R3,#8;每组数据为8位

JJJJ: JNB P32,$;等待地址码第一位的高电平信号

LCALL YS1;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态

MOV C,P32;将P32引脚此时的电平状态0或1存入C中

JNC UUU;如果为0就跳转到UUU

LCALL YS3;检测到高电平1的话延时1毫秒等待脉冲高电平结束

UUU: MOV A,@R1;将R1中地址的给A

RRC A;将C中的值0或1移入A中的最低位

MOV @R1,A;将A中的数暂时存放在R1数值的内存中

DJNZ R3,JJJJ;接收满8位换一个内存

INC R1;对R1中的值加1,换下一个RAM

DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中

MOV A,1AH

CPL A;对1AH取反后和1BH比较

CJNE A,1BH,EXIT;如果不等表示接收数据发生错误,放弃

MOV P1,1AH;将按键的键值通过P1口的8个LED显示出来!

CLR P20;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功

LCALL YS2

LCALL YS2

LCALL YS2

SETB P20;蜂鸣器停止(使用时可以将J2的YINYUE脚用跳线接J4 的XS1脚才可以使用蜂鸣器)可以看原理图

EXIT: SETB EA ;允许中断

RETI ;退出解码子程序

YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒

D1: MOV R5,#20

DJNZ R5,$

DJNZ R4,D1

RET

YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒

D2: MOV R5,#235

DJNZ R5,$

DJNZ R4,D2

RET

YS3: MOV R4,#2;延时程序3,精确延时1000微秒

D3:MOV R5,#248

DJNZ R5,$

DJNZ R4,D3

RET

END

以上程序紧供参考。

0A 01

11 12 13 14

15 16 17 18

19 10 1A 1B

0E 02 03 1C

06 04 05 0C

0D 08 09 1D

00 1F 1E 0B

07 0F

这是按照红外遥控器按键的实际位置给出的32个按键的键值(16进制)

红外解码,先有引导码9ms高电平45ms低电平,然后是用户正码,用户反码,按键正码,按键反码,IRCOM[2]是一个4位数组,用来存放红外接受码的,IRCOM[0]是用来存放用户正码IRCOM[1]用户反码、IRCOM[2]按键正码、IRCOM[3]按键反码,你程序里面:

if (IRCOM[2]!=取反IRCOM[3]) //判断如果按键正码不等于取反按键反码

{

EX0=1; //打开外部中断0

return; //跳出结束

}

IRCOM[0]用户正码、IRCOM[1]用户反码,0和1是用来区别不同遥控器的,市场上面遥控器很多,都是用用户码来区别不同遥控器的,希望我的回答对你有帮助!

/-----------------------------------------------

遥控器上1-9会在数码管上对应显示

------------------------------------------------/

#include<reg52h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

sbit IR=P3^2; //红外接口标志

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换

sbit LATCH1=P2^2;//定义锁存使能端口 段锁存

sbit LATCH2=P2^3;// 位锁存

/------------------------------------------------

全局变量声明

------------------------------------------------/

unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9

unsigned char irtime;//红外用全局变量

bit irpro_ok,irok;

unsigned char IRcord[4];

unsigned char irdata[33];

/------------------------------------------------

函数声明

------------------------------------------------/

void Ir_work(void);

void Ircordpro(void);

/------------------------------------------------

定时器0中断处理

------------------------------------------------/

void tim0_isr (void) interrupt 1 using 1

{

irtime++; //用于计数2个下降沿之间的时间

}

/------------------------------------------------

外部中断0中断处理

------------------------------------------------/

void EX0_ISR (void) interrupt 0 //外部中断0服务函数

{

static unsigned char i; //接收红外信号处理

static bit startflag; //是否开始处理标志位

if(startflag)

{

if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+45ms

i=0;

irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1

irtime=0;

i++;

if(i==33)

{

irok=1;

i=0;

}

}

else

{

irtime=0;

startflag=1;

}

}

/------------------------------------------------

定时器0初始化

------------------------------------------------/

void TIM0init(void)//定时器0初始化

{

TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值

TH0=0x00; //重载值

TL0=0x00; //初始化值

ET0=1; //开中断

TR0=1;

}

/------------------------------------------------

外部中断0初始化

------------------------------------------------/

void EX0init(void)

{

IT0 = 1; //指定外部中断0下降沿触发,INT0 (P32)

EX0 = 1; //使能外部中断

EA = 1; //开总中断

}

/------------------------------------------------

键值处理

------------------------------------------------/

void Ir_work(void)//红外键值散转程序

{

switch(IRcord[2])//判断第三个数码值

{

case 0x0c:DataPort=dofly_DuanMa[1];break;//1 显示相应的按键值

case 0x18:DataPort=dofly_DuanMa[2];break;//2

case 0x5e:DataPort=dofly_DuanMa[3];break;//3

case 0x08:DataPort=dofly_DuanMa[4];break;//4

case 0x1c:DataPort=dofly_DuanMa[5];break;//5

case 0x5a:DataPort=dofly_DuanMa[6];break;//6

case 0x42:DataPort=dofly_DuanMa[7];break;//7

case 0x52:DataPort=dofly_DuanMa[8];break;//8

case 0x4a:DataPort=dofly_DuanMa[9];break;//9

default:break;

}

irpro_ok=0;//处理完成标志

}

/------------------------------------------------

红外码值处理

------------------------------------------------/

void Ircordpro(void)//红外码值处理函数

{

unsigned char i, j, k;

unsigned char cord,value;

k=1;

for(i=0;i<4;i++) //处理4个字节

{

for(j=1;j<=8;j++) //处理1个字节8位

{

cord=irdata[k];

if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差

value|=0x80;

if(j<8)

{

value>>=1;

}

k++;

}

IRcord[i]=value;

value=0;

}

irpro_ok=1;//处理完毕标志位置1

}

/------------------------------------------------

主函数

------------------------------------------------/

void main(void)

{

EX0init(); //初始化外部中断

TIM0init();//初始化定时器

DataPort=0xfe; //取位码 第一位数码管选通,即二进制1111 1110

LATCH2=1; //位锁存

LATCH2=0;

while(1)//主循环

{

if(irok) //如果接收好了进行红外处理

{

Ircordpro();

irok=0;

}

if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等

{

Ir_work();

}

}

}

红外发射

模块用

51单片机

编程使用:用

定时器中断

来做,红外发送引脚连接到P10口,

计数一下定时初值(让P10的翻转频率为38KHZ),进定时器中断就对P10

取反

以上就是关于红外发射模块怎么用51单片机编程使用全部的内容,包括:红外发射模块怎么用51单片机编程使用、51单片机红外遥控问题(新手)、求单片机C51红外线收发方案(最好有详细解释)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9986252.html

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

发表评论

登录后才能评论

评论列表(0条)

保存