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

单片机红外遥控代码

发布时间:2023-03-23 17:41:03

① 关于单片机红外遥控代码部分的几个问题: 1.Ircordpro函数中if(cord>7)是干什么用的

判断长短脉宽啊,宽脉冲才是逻辑1。
看程序之前先看红外协议的波形图,光看程序的话当然难以理解的。

② 51单片机红外遥控程序是什么

#includex0dx0a#includex0dx0a#define uchar unsigned charx0dx0a#define uint unsigned intx0dx0asbit lcden = P2^7;x0dx0asbit lcdrs = P2^6;x0dx0asbit lcdwr = P2^5;x0dx0asbit IR = P3^2;x0dx0auchar IRCOM[6];//数组,用于存储红外编码x0dx0auchar code table1[] = "remote control";x0dx0auchar code table2[] = "CODE:";x0dx0avoid delayms(uchar x)// 延时x*0.14msx0dx0a{x0dx0auchar i;x0dx0awhile(x--)x0dx0afor(i=0;i<13;i++){}x0dx0a}x0dx0avoid delay(uchar x)//延时xmsx0dx0a{x0dx0auchar i,j;x0dx0afor(i=x;i>0;i--)x0dx0afor(j=110;j>0;j--);x0dx0a}x0dx0a/****************************LCD部分***********************************************/x0dx0avoid write_com(uchar com)x0dx0a{x0dx0alcden = 0;x0dx0alcdrs = 0;x0dx0alcdwr = 0;x0dx0aP0 = com;x0dx0adelay(5);x0dx0alcden = 1;x0dx0adelay(5);x0dx0alcden = 0;//别忘了lcden拉低x0dx0a}x0dx0avoid write_date(uchar date)x0dx0a{x0dx0alcden = 0;x0dx0alcdrs = 1;x0dx0alcdwr = 0;x0dx0aP0 = date;x0dx0adelay(5);x0dx0alcden = 1;x0dx0adelay(5);x0dx0alcden = 0;x0dx0a}x0dx0avoid lcd_init(void)x0dx0a{x0dx0alcden = 0;x0dx0alcdrs = 0;x0dx0alcdwr = 0;x0dx0adelay(5);x0dx0awrite_com(0x38);x0dx0awrite_com(0x0c);x0dx0awrite_com(0x06);x0dx0awrite_com(0x01);x0dx0a}x0dx0a/*****************main()************************/x0dx0avoid main(void)x0dx0a{x0dx0auchar count=0;x0dx0aIR = 1;x0dx0alcd_init();x0dx0awrite_com(0x80);x0dx0awhile(table1[count]!='\0')x0dx0a{x0dx0awrite_date(table1[count]);x0dx0acount++;x0dx0adelay(5);x0dx0a}x0dx0acount = 0;x0dx0awrite_com(0x80+0x40);x0dx0awhile(table2[count]!='\0')x0dx0a{x0dx0awrite_date(table2[count]);x0dx0acount++;x0dx0adelay(5);x0dx0a}x0dx0ax0dx0aIE = 0x81; //开中断x0dx0aTCON = 0x01;//脉冲负边沿触发x0dx0awhile(1);x0dx0ax0dx0a}x0dx0a/*********************红外中断**************************/x0dx0avoid IR_time() interrupt 0 x0dx0a{x0dx0auchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1x0dx0aEX0 = 0; //关闭中断x0dx0adelayms(5);x0dx0aif(1 == IR)x0dx0a{x0dx0aEX0 = 1;x0dx0areturn;x0dx0a}x0dx0awhile(!IR) //跳过9ms前导低电平x0dx0adelayms(1);x0dx0afor(i=0;i<4;i++)x0dx0a{x0dx0afor(j=0;j<8;j++)x0dx0a{x0dx0awhile(IR) //跳过4.5ms的前导高电平x0dx0adelayms(1);x0dx0awhile(!IR) //跳过0.56ms的低电平x0dx0adelayms(1);x0dx0ax0dx0awhile(IR) x0dx0a{x0dx0aTimeNum++; //计时高电平时间从而判断读取的是0还是1x0dx0adelayms(1);x0dx0a}x0dx0aif(TimeNum>=30)//按键按下时间过长 跳过x0dx0a{x0dx0aEX0 = 1;x0dx0areturn;x0dx0a}x0dx0aIRCOM[i] = IRCOM[i]>>1;x0dx0aif(TimeNum >= 8) //8*0.14ms 这时读取的是1;x0dx0a{x0dx0aIRCOM[i] = IRCOM[i]|0x80;x0dx0a}x0dx0aTimeNum = 0;x0dx0a}x0dx0a}x0dx0aif(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等x0dx0a{x0dx0aEX0 = 1;x0dx0areturn;x0dx0a}x0dx0aIRCOM[4] = IRCOM[2]&0x0f;//取低四位x0dx0aIRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位x0dx0aif(IRCOM[4] > 9) //转换成字符x0dx0a{x0dx0aIRCOM[4] = IRCOM[4] + 0x37;x0dx0a}x0dx0aelsex0dx0aIRCOM[4] = IRCOM[4] + 0x30;x0dx0aif(IRCOM[5] > 9)x0dx0a{x0dx0aIRCOM[5] = IRCOM[5] + 0x37;x0dx0a}x0dx0aelsex0dx0aIRCOM[5] = IRCOM[5] + 0x30;x0dx0adelay(5);x0dx0awrite_com(0x80 + 0x40 + 5);x0dx0awrite_date(IRCOM[5]);x0dx0awrite_date(IRCOM[4]);x0dx0aEX0 = 1; //重新开启外部中断x0dx0a}

③ 求51单片机红外遥控程序

sbitIR_OUT=P3^2;
unsignedcharSigInfo[4];//存储红外按键编码,SigInfo[2]为按键值

voidCmd_Require(void);

voidINT_Ext0()interrupt1//外部中断0
{
u8i,j;
u16time=8000;

EA=0;

for(i=0;i<10;i++){
delay0_7ms();
if(IR_OUT){
EA=1;
return;
}
}

while(!IR_OUT);

delay2_5ms();
if(!IR_OUT){
EA=1;
return;
}

while(IR_OUT&&time){
time--;
}
time=8000;

for(i=0;i<4;i++){
for(j=0;j<8;j++){
SigInfo[i]>>=1;
while(!IR_OUT);

delay0_7ms();

if(IR_OUT){
SigInfo[i]|=0x80;
while(IR_OUT&&time){
time--;
}
time=8000;
}
}
}

Cmd_Require();
EA=1;
}

voidCmd_Require(void)
{
switch(SigInfo[2]){
case0x0c:
//此处代码随意
break;
case0x18:
//...
break;
//...
default:
break;
}
}

延时没写,因单片机而异的,要精确点才能解码。

④ 单片机红外遥控程序中m/8是什么意思

单片机红外遥控程序中m/8是指:起始位后面的4个字节代码在数组变量中的索引号,其帆肢值是0~3共4个数。
m的有效值是0~31,表示接收到32bit的信号,每8bit为一个字节,所以m/8的结果是0~3的数。当m等于0~7的态闷世时候,m/8的结果是0;依此类推,罩蚂当m等于8~15的时候,m/8的结果是1;当m等于32时清零,完成4个字节的代码接收。

⑤ 单片机红外编码

C51程序代码:
#include <AT89X51.h>
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)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}

void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117
flag=0;
count=0;
do{}while(count<endcount);
//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{
//先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
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
{
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;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{
int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}

⑥ 基于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_();
}
}
}

⑦ 我用单片机编程,怎样知道一个红外遥控器的每个按键的代码,或者怎样操作

单片机UART接个红外接收。另外还要做个遥控器,也用单片机UART接个红外发射。用遥控器的单片机做按键编码,发射不同的数据到串口,例如0x01是开,0xfe是关。

然后接收的单片机做UART数据解码,接收到0X01就做开操作,0XFE做关操作。

⑧ 这是一段51单片机的红外遥控代码,主要就是用了遥控器上的三个键。看不懂呀,求大神帮助注释或解释下

这就是一个红外解码程序,按标准来做就行了。普及一下红外解码知识:
采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制
的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1,;上述"0"和
"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,;达到降低电源功耗的
目的。然后再通过红外发射二极管产生红外线向空间发射,;遥控编码是连续的32位二进制码
组,其中前16位为用户识别码,能区别不同的电器设备,;防止不同机种遥控码互相干扰。该
芯片的用户识别码固定为十六进制01H;后16位为8位操作码(功能码)及其反码。
当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码
由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码
(9ms~18ms),8位数据码(9ms~18ms)和这8位数据的反码(9ms~18ms)组成。如果键按下超
过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)
组成。
解码的关键是如何识别"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms
的高+0.56ms的低。所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,
0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须
比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此
取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。

⑨ 单片机编程(红外线遥控器)

这段程序的意思是将键值换算成ASCII码字符表示;
0x30 表示ASCII码的‘0’,ASCII码表里面字符0的编号就是0x30;
0x37 的意思是当键值大于9时,键值用十六进制字符表示,0x37 实际上是‘A’-10,‘A’=0x41,‘A’- 10 =0x37;比如键值是10,那么输出就是ASCII字符‘A’;

⑩ 谁有51单片机红外遥控亮灭LED代码就只要一个键控制点亮,另一个键控制灭就行

答:编程思路兄穗 红外遥控羡如卜解橡逗码。

上面是 "0" / "1" 的表示方法

用中断 测出 低脉冲的持续就可以知道 0 1 了, 最后通过键数据码 来定义 单片机要干什么事

阅读全文

与单片机红外遥控代码相关的资料

热点内容
苹果笔记本t2加密芯片怎么打开 浏览:796
安卓如何把手机投屏至电视 浏览:737
方舟编译器现在可提速哪些软件 浏览:58
微信加密为什么是黑屏 浏览:473
android去电状态 浏览:602
苹果13如何加密视频 浏览:813
linuxweblogic缓存 浏览:67
云服务器不同地域 浏览:946
python闹钟怎么打 浏览:686
虚拟主机服务器有什么区别 浏览:833
算法与程序的奥秘章节检测 浏览:377
找pdf 浏览:529
与服务器连接断开如何处理 浏览:833
服务器维修预计十分钟什么意思 浏览:170
黑马程序员主打教学是什么 浏览:41
python九乘法表怎么编写 浏览:974
思维方式pdf 浏览:656
tcc社区app怎么注册 浏览:941
央视网下载加密 浏览:454
命令行访问服务器 浏览:36