导航:首页 > 操作系统 > 单片机学习遥控器

单片机学习遥控器

发布时间:2022-08-24 03:39:05

‘壹’ 单片机,学习型遥控器,只要求学习(某一款)空调的开关即可,做好了,小弟100分答谢

学习型的遥控器必须要有一个学习的过程,就是首先你得知道你的空调的遥控信号是什么,然后给这个信号给遥控器,告诉他这个信号是干什么的,所以当它记忆住了这个信号,以后知道发射这个信号即可。
一般遥控器为红外信号,所以你只要单片机加上一对红外对管即可,程序发挥下,能做出很多不同效果。

‘贰’ 单片机开发板自带的遥控器是个什么意思,它里面和一般键盘一样吗怎么用呢

单片机开发板自带的遥控器通常是NEC编码的红外遥控器,是为用户学习红外遥控解码而配备的,用户需要自己构建遥控器信号的解码程序,并自己定义遥控器上按键的功能。
有些开发板还带有连接键盘的PS/2插口,这是为了让用户学习PS/2接口协议而配备的,用户同样需要自己构建相关的程序,并定义按键功能。

‘叁’ 学习型红外遥控器的原理是怎样的

学习型红外遥控器的原理:
基本原理是发送端将基带二进制信号调制为一系列的脉冲串信号,通过红外发射管发射的红外信号,常用的有通过脉冲宽度来实现信号调制的脉宽调制(PWM)和通过脉冲串之间的时间间隔来实现信号调制的脉时调制(PPM)两种方法。
学习型遥控常用的载波频率为38kHz,这是由发射端编码芯片所使用的455kHz晶振来决定的,其他的遥控系统采用36kHz、40kHz、56kHz等。现在采用一体化接收头做为信号的接收,把解调出来的信号送入单片机进行学习(记录各个高低电平的时间长度),然后存入EEPROM内,学习完成后再将EEPROM的高低电平的时间数据读取并与38kHz载波进行调制,然后红外发光管发送出去。

‘肆’ 基于单片机的家电智能遥控器设计

这个确实比较复杂,现在我只完成了第一步,学习型遥控器的设计费了好大劲儿,第二歩是无线通信,模块用nfr24L01,便宜,但通信试验总不成功,急死了!

‘伍’ 关于单片机 发射红外线遥控电视机疑问

解码用单片机接收NEC遥控器32编码和电视遥控器42位编码,程序里面自动识别32和42位的编码用数码管进行显示对应的数值。

‘陆’ 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; //重新开启外部中断
}

‘柒’ 想自学单片机编程做遥控飞机, 要学哪些东西

学习单片机,它涉及到Linux和ARM?不要吓唬楼上的人啊。支持一楼,手臂事情变得更加困难的基础上的单芯片被嵌入。可以用单片机C语言或汇编编程,如果你想使用的新概念郭天祥51单片机,充分C的。如果你想知道该芯片的内部结构,建议学校集会。看似ZLG好。但是,你可以学习C,但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_();
}
}
}

‘玖’ 用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

}

阅读全文

与单片机学习遥控器相关的资料

热点内容
海南压缩机在哪里 浏览:491
电脑文件夹清晰的文件结构 浏览:839
如何把苹果手机的app转到安卓 浏览:305
java同步并发 浏览:249
fw压缩图片 浏览:258
淘宝申请源码靠谱吗 浏览:874
androidupdater 浏览:635
c2d游戏源码大全可复制版 浏览:771
电脑怎样重置网关命令 浏览:411
winftplinux 浏览:335
推特app界面如何设置成中文 浏览:452
太空工程师转子编程属性 浏览:32
windowscmd关机命令 浏览:342
云桌面只要服务器装一套软件 浏览:247
电脑右键按到什么导致文件夹全屏 浏览:454
我的世界如何制造服务器主城 浏览:365
linuxssh连不上 浏览:297
永宏plc用什么编程电缆 浏览:371
win激活命令行 浏览:886
新手学电脑编程语言 浏览:893