导航:首页 > 操作系统 > 基于单片机红外遥控系统

基于单片机红外遥控系统

发布时间:2022-11-27 10:33:16

❶ 51单片机红外遥控程序

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7;
sbit lcdrs = P2^6;
sbit lcdwr = P2^5;
sbit IR = P3^2;
uchar IRCOM[6];//数组,用于存储红外编码
uchar code table1[] = "remote control";
uchar code table2[] = "CODE:";
void delayms(uchar x)// 延时x*0.14ms
{
uchar i;
while(x--)
for(i=0;i<13;i++){}
}
void delay(uchar x) //延时xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/****************************LCD部分***********************************************/
void write_com(uchar com)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0; //别忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0;
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void lcd_init(void)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*****************main()************************/
void main(void)
{
uchar count=0;
IR = 1;
lcd_init();
write_com(0x80);
while(table1[count]!='\0')
{
write_date(table1[count]);
count++;
delay(5);
}
count = 0;
write_com(0x80+0x40);
while(table2[count]!='\0')
{
write_date(table2[count]);
count++;
delay(5);
}

IE = 0x81; //开中断
TCON = 0x01;//脉冲负边沿触发
while(1);

}
/*********************红外中断**************************/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1
EX0 = 0; //关闭中断
delayms(5);
if(1 == IR)
{
EX0 = 1;
return;
}
while(!IR) //跳过9ms前导低电平
delayms(1);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR) //跳过4.5ms的前导高电平
delayms(1);
while(!IR) //跳过0.56ms的低电平
delayms(1);

while(IR)
{
TimeNum++; //计时高电平时间从而判断读取的是0还是1
delayms(1);
}
if(TimeNum>=30)//按键按下时间过长 跳过
{
EX0 = 1;
return;
}
IRCOM[i] = IRCOM[i]>>1;
if(TimeNum >= 8) //8*0.14ms 这时读取的是1;
{
IRCOM[i] = IRCOM[i]|0x80;
}
TimeNum = 0;
}
}
if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等
{
EX0 = 1;
return;
}
IRCOM[4] = IRCOM[2]&0x0f;//取低四位
IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] > 9) //转换成字符
{
IRCOM[4] = IRCOM[4] + 0x37;
}
else
IRCOM[4] = IRCOM[4] + 0x30;
if(IRCOM[5] > 9)
{
IRCOM[5] = IRCOM[5] + 0x37;
}
else
IRCOM[5] = IRCOM[5] + 0x30;
delay(5);
write_com(0x80 + 0x40 + 5);
write_date(IRCOM[5]);
write_date(IRCOM[4]);
EX0 = 1; //重新开启外部中断
}

❷ 基于单片机的红外万能空调遥控的源代码

我也认为这个该付费的,网上上搜了很多,找不到合适的,自己研究了很长时间,不很成功,不过已能学习几个按键,方法就是用定时器把所有的高低电平持续时间测出来,存入EEPROM中,并不识别什么是0,什么是1,原样保存,原样使用,这样对单片机的速度和内存要求高一些,空调器的控制码有100多位,实际上能学习一个按键,就成功了一半,但下一部还是要与析它的代码规律,以舍弃一些不必要的代码,空调器常用的按键就没几个,但不同工作条件下同一个按键发出的控制码是不同的,全部存储,不仅浪费存储空间,而且会给查找调用带来不方便

❸ 基于单片机的红外遥控收发系统的设计与实现

红外遥控一般采用38KHz载波

❹ 51单片机最小系统怎样连接红外遥控模块

红外信号的发射由红外发射电路中的红外发光二极管完成,通常情况下为了提高抗干扰能力与降低电源消耗,遥控器将遥控信号(二进制脉冲码)调制在载波(载波是传送信息的物理基础和承载工具)上经放大后发送至红外二极管,再由二极管转换为红外信号发送出去。遥控器上不同的按键有着不一样的键值,按下相对应的键,红外二极管就会发送对应的信号,接收装置接收到信号后会对信号进行信号解调后会得到相应按键的键值,再根据不同的键值执行相应的操作。

❺ 基于51单片机红外遥控代码(C语言)

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。

;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 *
;* *
;********************************************************************************
;遥控键值解码-数码管显示 *
;********************************************************************************/

#include <reg51.h>
#include <intrins.h>

void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();

sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;

unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x1; //触发方式为脉冲负边沿触发
delay(1);

IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}

} //end main

void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delay(1);}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 变为低电平
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;

}

void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}

void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}

void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}

void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

❻ 课程设计:红外遥控解码器(基于单片机AT89C51),能同过数码管把相应的按键显示出来~ 各位高手帮帮忙

//实例97:用红外遥控器控制继电器
#include<reg51.h> //包含单片机寄存器的头文件
sbit IR=P3^2; //将IR位定义为P3.2引脚
unsigned char a[4]; //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度
sbit Relay=P1^3; //将Relay位定义为P1.3引脚
/************************************************************
函数功能:对4个字节的用户码和键数据码进行解码
说明:解码正确,返回1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)
{

unsigned char i,j;
unsigned char temp; //储存解码出的数据
for(i=0;i<4;i++) //连续读取4个用户码和键数据码
{
for(j=0;j<8;j++) //每个码有8位数字
{
temp=temp>>1; //temp中的各数据位右移一位,因为先读出的是高位数据
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==0) //如果是低电平就等待
; //低电平计时
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平宽度
TH0=0; //定时器清0
TL0=0; //定时器清0
TR0=1; //开启定时器T0
while(IR==1) //如果是高电平就等待
;
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存高电平宽度
if((LowTime<370)||(LowTime>640))
return 0; //如果低电平长度不在合理范围,则认为出错,停止解码
if((HighTime>420)&&(HighTime<620)) //如果高电平时间在560微秒左右,即计数560/1.085=516次
temp=temp&0x7f; //(520-100=420, 520+100=620),则该位是0
if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在1680微秒左右,即计数1680/1.085=1548次
temp=temp|0x80; //(1550-250=1300,1550+250=1800),则该位是1
}
a[i]=temp; //将解码出的字节值储存在a[i]
}
if(a[2]=~a[3]) //验证键数据码和其反码是否相等,一般情况下不必验证用户码
return 1; //解码正确,返回1
}
/************************************************************
函数功能:执行遥控功能
*************************************************************/
void Function(void)
{
Relay=!Relay; //对P1.3引脚取反,控制继电器的吸合、释放

}
/************************************************************
函数功能:主函数
*************************************************************/
void main()
{
EA=1; //开启总中断
EX0=1; //开外中断0
ET0=1; //定时器T0中断允许
IT0=1; //外中断的下降沿触发
TMOD=0x01; //使用定时器T0的模式1
TR0=0; //定时器T0关闭
while(1) //等待红外信号产生的中断
;
}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0 using 0
{
EX0=0; //关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==0) //如果是低电平就等待,给引导码低电平计时
;
TR0=0; //关闭定时器T0
LowTime=TH0*256+TL0; //保存低电平时间
TH0=0; //定时器T0的高8位清0
TL0=0; //定时器T0的低8位清0
TR0=1; //开启定时器T0
while(IR==1) //如果是高电平就等待,给引导码高电平计时
;
TR0=0; //关闭定时器T0
HighTime=TH0*256+TL0; //保存引导码的高电平长度
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))
{
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300+500=8800.
if(DeCode()==1)
Function(); //如果满足条件,执行遥控功能
}
EX0=1; //开启外中断EX0
}

❼ 用51单片机制作学习型红外遥控器的原理

以下是程序,调试成功,LCD1602显示

//本解码程序适用于NEC的upd6121及其兼容芯片的解码,支持大多数遥控器实验板采用11.0592MHZ晶振

#include<reg52.h>//包含单片机寄存器的头文件

#include<intrins.h>//包含_nop_()函数定义的头文件

sbitIR=P3^2;//将IR位定义为P3.2引脚

sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚

sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚

sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚

sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚

sbitBEEP=P3^6;//蜂鸣器控制端口P36

unsignedcharflag;

unsignedcharcodestring[]={"1602IR-CODETEST"};

unsignedchara[4];//储存用户码、用户反码与键数据码、键数据反码

unsignedintLowTime,HighTime;//储存高、低电平的宽度

/*****************************************************

函数功能:延时1ms

***************************************************/

voiddelay1ms()

{

unsignedchari,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++)

;

}

/*****************************************************

函数功能:延时若干毫秒

入口参数:n

***************************************************/

voiddelay(unsignedcharn)

{

unsignedchari;

for(i=0;i<n;i++)

delay1ms();

}

/*********************************************************/

voidbeep()//蜂鸣器响一声函数

{

unsignedchari;

for(i=0;i<100;i++)

{

delay1ms();

BEEP=!BEEP;//BEEP取反

}

BEEP=1;//关闭蜂鸣器

delay(250);//延时

}

/*****************************************************

函数功能:判断液晶模块的忙碌状态

返回值:result。result=1,忙碌;result=0,不忙

***************************************************/

unsignedcharBusyTest(void)

{

bitresult;

RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态

RW=1;

E=1;//E=1,才允许读写

_nop_();//空操作

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

result=BF;//将忙碌标志电平赋给result

E=0;

returnresult;

}

/*****************************************************

函数功能:将模式设置指令或显示地址写入液晶模块

入口参数:dictate

***************************************************/

voidWriteInstruction(unsignedchardictate)

{

while(BusyTest()==1);//如果忙就等待

RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令

RW=0;

E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,

//就是让E从0到1发生正跳变,所以应先置"0"

_nop_();

_nop_();//空操作两个机器周期,给硬件反应时间

P0=dictate;//将数据送入P0口,即写入指令或地址

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:指定字符显示的实际地址

入口参数:x

***************************************************/

voidWriteAddress(unsignedcharx)

{

WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"

}

/*****************************************************

函数功能:将数据(字符的标准ASCII码)写入液晶模块

入口参数:y(为字符常量)

***************************************************/

voidWriteData(unsignedchary)

{

while(BusyTest()==1);

RS=1;//RS为高电平,RW为低电平时,可以写入数据

RW=0;

E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,

//就是让E从0到1发生正跳变,所以应先置"0"

P0=y;//将数据送入P0口,即将数据写入液晶模块

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=1;//E置高电平

_nop_();

_nop_();

_nop_();

_nop_();//空操作四个机器周期,给硬件反应时间

E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令

}

/*****************************************************

函数功能:对LCD的显示模式进行初始化设置

***************************************************/

voidLcdInitiate(void)

{

delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间

WriteInstruction(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口

delay(5);//延时5ms

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x38);

delay(5);

WriteInstruction(0x0C);//显示模式设置:显示开,有光标,光标闪烁

delay(5);

WriteInstruction(0x06);//显示模式设置:光标右移,字符不移

delay(5);

WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除

delay(5);

}

/************************************************************

函数功能:对4个字节的用户码和键数据码进行解码

说明:解码正确,返回1,否则返回0

出口参数:dat

*************************************************************/

bitDeCode(void)

{

unsignedchari,j;

unsignedchartemp;//储存解码出的数据

for(i=0;i<4;i++)//连续读取4个用户码和键数据码

{

for(j=0;j<8;j++)//每个码有8位数字

{

temp=temp>>1;//temp中的各数据位右移一位,因为先读出的是高位数据

TH0=0;//定时器清0

TL0=0;//定时器清0

TR0=1;//开启定时器T0

while(IR==0)//如果是低电平就等待

;//低电平计时

TR0=0;//关闭定时器T0

LowTime=TH0*256+TL0;//保存低电平宽度

TH0=0;//定时器清0

TL0=0;//定时器清0

TR0=1;//开启定时器T0

while(IR==1)//如果是高电平就等待

;

TR0=0;//关闭定时器T0

HighTime=TH0*256+TL0;//保存高电平宽度

if((LowTime<370)||(LowTime>640))

return0;//如果低电平长度不在合理范围,则认为出错,停止解码

if((HighTime>420)&&(HighTime<620))//如果高电平时间在560微秒左右,即计数560/1.085=516次

temp=temp&0x7f;//(520-100=420,520+100=620),则该位是0

if((HighTime>1300)&&(HighTime<1800))//如果高电平时间在1680微秒左右,即计数1680/1.085=1548次

temp=temp|0x80;//(1550-250=1300,1550+250=1800),则该位是1

}

a[i]=temp;//将解码出的字节值储存在a[i]

}

if(a[2]=~a[3])//验证键数据码和其反码是否相等,一般情况下不必验证用户码

return1;//解码正确,返回1

}

/*------------------二进制码转换为压缩型BCD码,并显示---------------*/

voidtwo_2_bcd(unsignedchardate)

{

unsignedchartemp;

temp=date;

date&=0xf0;

date>>=4;//右移四位得到高四位码

date&=0x0f;//与0x0f想与确保高四位为0

if(date<=0x09)

{

WriteData(0x30+date);//lcd显示键值高四位

}

else

{

date=date-0x09;

WriteData(0x40+date);

}

date=temp;

date&=0x0f;

if(date<=0x09)

{

WriteData(0x30+date);//lcd显示低四位值

}

else

{

date=date-0x09;

WriteData(0x40+date);

}

WriteData(0x48);//显示字符'H'

}

/************************************************************

函数功能:1602LCD显示

*************************************************************/

voidDisp(void)

{

WriteAddress(0x40);//设置显示位置为第一行的第1个字

two_2_bcd(a[0]);

WriteData(0x20);

two_2_bcd(a[1]);

WriteData(0x20);

two_2_bcd(a[2]);

WriteData(0x20);

two_2_bcd(a[3]);

}

/************************************************************

函数功能:主函数

*************************************************************/

voidmain()

{

unsignedchari;

LcdInitiate();//调用LCD初始化函数

delay(10);

WriteInstruction(0x01);//清显示:清屏幕指令

WriteAddress(0x00);//设置显示位置为第一行的第1个字

i=0;

while(string[i]!='')//''是数组结束标志

{//显示字符WWW.RICHMCU.COM

WriteData(string[i]);

i++;

}

EA=1;//开启总中断

EX0=1;//开外中断0

ET0=1;//定时器T0中断允许

IT0=1;//外中断的下降沿触发

TMOD=0x01;//使用定时器T0的模式1

TR0=0;//定时器T0关闭

while(1);//等待红外信号产生的中断

}

/************************************************************

函数功能:红外线触发的外中断处理函数

*************************************************************/

voidInt0(void)interrupt0

{

EX0=0;//关闭外中断0,不再接收二次红外信号的中断,只解码当前红外信号

TH0=0;//定时器T0的高8位清0

TL0=0;//定时器T0的低8位清0

TR0=1;//开启定时器T0

while(IR==0);//如果是低电平就等待,给引导码低电平计时

TR0=0;//关闭定时器T0

LowTime=TH0*256+TL0;//保存低电平时间

TH0=0;//定时器T0的高8位清0

TL0=0;//定时器T0的低8位清0

TR0=1;//开启定时器T0

while(IR==1);//如果是高电平就等待,给引导码高电平计时

TR0=0;//关闭定时器T0

HighTime=TH0*256+TL0;//保存引导码的高电平长度

if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<4700))

{

//如果是引导码,就开始解码,否则放弃,引导码的低电平计时

//次数=9000us/1.085=8294,判断区间:8300-500=7800,8300+500=8800.

if(DeCode()==1)//执行遥控解码功能

{

Disp();//调用1602LCD显示函数

beep();//蜂鸣器响一声提示解码成功

}

}

EX0=1;//开启外中断EX0

}

❽ 红外遥控器与51单片机

org 00h ORG 30H MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH START:

JB P3.7,$;等待遥控信号出现 SB: MOV R4,#8 ;8毫秒为高电平错误 SBA: MOV R5,#250 SBB: JB P3.7,SXB1 DJNZ R5,SBB DJNZ R4,SBA MOV R4,#2 JMP SBC SXB1: MOV R5,#5 SXB2: ;去掉20US的尖峰干扰信号 JNB P3.7,SBB DJNZ R5,SXB2 JMP START SBC: MOV R5,#250 SB1: JB P3.7,SB2 ;2MS内不为高电平错误(监测9MS的低电 平引导码) DJNZ R5,SB1 DJNZ R4,SBC JMP START SB2: ;去掉20US的尖峰干扰信号 MOV R5,#5 SB2_A: JNB P3.7,SB1 DJNZ R5,SB2_A MOV R4,#3 SB2_1: MOV R5,#250 SB3: ;监测4.5MS高电平,如3MS内出现低电平错误 JNB P3.7,SXC DJNZ R5,SB3 DJNZ R4,SB2_1 MOV R4,#2 JMP SB3_1 SXC: ;去掉20US的尖峰干扰信号 MOV R5,#5 SXC1: JB P3.7,SB3 DJNZ R5,SXC1 JMP START SB3_1: ;监测4.5MS高电平,如5MS内不为低电平错误 MOV R5,#250 SB3_2: JNB P3.7,SB4 DJNZ R5,SB3_2 DJNZ R4,SB3_1 JMP START SB4: ;去掉20US的尖峰干扰信号 MOV R5,#5 SB4_1: JB P3.7,SB3_2 DJNZ R5,SB4_1 MOV R1,#1AH ;设定1AH为起始RAM区 MOV R2,#4 PP: MOV R3,#8 JJJJ: MOV R5,#250 JJJJ2: ;1MS内不为低电平错误 JB P3.7,JJJJ3 DJNZ R5,JJJJ2 JMP START JJJJ3: LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信 号此时的高低电平状态 MOV C,P3.7 ;将P3.7引脚此时的电平状态0或1存入C中 JNC UUU ;如果为0就跳转到UUU MOV R5,#250 JJJJ4: JNB P3.7,UUU NOP DJNZ R5,JJJJ4 JMP START 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 ;接收完16位地址码和8位数据码和8位数据 反码,存放在1AH/1BH/1CH/1DH的RAM中 ;以下对代码是否正确和定义进行识别 MOV A,1AH;比较高8位地址码 XRL A,#00000000B;判断1AH的值是否等于00000000, 相等的话A为0 JNZ EXIT;如果不相等说明解码失败退出解码程序 MOV A,1BH;比较低8位地址 XRL A,#11111111B;再判断高8位地址是否正确 JNZ EXIT;如果不相等说明解码失败退出解码程序 LCALL YS3 MOV A,1CH;比较数据码和数据反码是否正确? CPL A XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢 弃,核对数据是否准确 JNZ EXIT;如果不相等说明解码失败退出解码程序 LCALL YS3 AJMP BIJIAO ;判断在118毫秒内是否有连发码 AA:MOV R1,#25 XX:ACALL YS2 JNB P3.7,HH;跳转到判断连发代码是否正确的程序段 DJNZ R1,XX EXIT: ;对所有端口清零

AJMP START ;连发码判断程序段-----------HH:MOV R6,#4 S: ACALL YS1;调用882微秒延时子程序 JB P3.7,EXIT;延时882微秒后判断P3.7脚是否出现高电平 如果有就退出解码程序 DJNZ R6, S;重复4次,目的是确认连发码的低电平信号波 形 JNB P3.7, $ ;等待高电? LCALL YS3 AJMP AA

BIJIAO:MOV A,1CH;按键数值判断执 CJNE A,#10h,TT1 clr p0.0 TT1: CJNE A,#03h,T2 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.1 T2: CJNE A,#01h,T3 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.2 T3: CJNE A,#06h,T4 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.3 T4: CJNE A,#09h,T5 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.4 T5: CJNE A,#1dh,T6 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.5 T6:CJNE A,#1fh,T7 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.6 T7: CJNE A,#0dh,T8 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p0.7 T8:CJNE A,#19h,t9 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.0 T9:CJNE A,#1bh,t10 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.1 T10: CJNE A,#11h,t11 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.2 T11: CJNE A,#15h,t12 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.3 T12: CJNE A,#17h,t13 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.4 T13: CJNE A,#12h,t14 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.5 T14: CJNE A,#16h,t15 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.6 T15: CJNE A,#4ch,t16 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p1.7 T16: CJNE A,#40h,t17 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.0 T17: CJNE A,#48h,t18 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.1 T18: CJNE A,#04h,t19 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.2 T19: CJNE A,#00h,t20 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.3 T20: CJNE A,#02h,t21 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.4 T21: CJNE A,#05h,t22 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.5 T22: CJNE A,#54h,t23 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.6 T23: CJNE A,#4dh,t24 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p2.7 T24: CJNE A,#0ah,t25 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p3.0 T25: CJNE A,#1eh,t26 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p3.1 T26: CJNE A,#0eh,t27 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p3.2 T27: CJNE A,#,t28 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p3.3 T28: CJNE A,#1ch,t29 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p3.4 T29: CJNE A,#14h,t31 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

clr p3.5 T31: CJNE A,#0ch,t32 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh

t32:AJMP AA 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

❾ 单片机的红外遥控的原理

1、发送端由单片机和红外发光二极管组成。
单片机控制红外发光二极管发射38KHz左右的红外光,这个红外光就可能起到传递信号的作用。你可以在你的程序中规定发射红外线时表示二进制的一个位‘1’无红外线时表示二进制的‘0’。这样你就可以发出一系列由‘1’和‘0’所级成的信号。
2、接收端是由红外接收二极管和单片机组成。
前面我们让发射端发出信号,现在接收头就开始收信号。

阅读全文

与基于单片机红外遥控系统相关的资料

热点内容
算法可以用图表表示 浏览:946
山西太原php 浏览:271
常用cmd网络命令 浏览:676
hashmap7源码分析 浏览:896
搜索引擎原理技术与系统pdf 浏览:359
运动估计算法python 浏览:858
java正则1 浏览:536
redhatlinux最新 浏览:178
python字典编程词汇 浏览:144
微信和服务器如何通讯 浏览:10
百家号服务器配置有什么用 浏览:598
怎么为电脑加密 浏览:59
服务器出现差错是什么意思 浏览:617
苹果app移到商店里怎么删掉 浏览:254
phpjsphtml 浏览:63
吃鸡手机国际服服务器超时怎么办 浏览:69
努比亚Z5无命令 浏览:642
展示网站云服务器 浏览:872
代码混淆器php 浏览:367
贝恩pdf 浏览:209