① 关于单片机红外遥控代码部分的几个问题: 1.Ircordpro函数中if(cord>7)是干什么用的
判断长短脉宽啊,宽脉冲才是逻辑1。
看程序之前先看红外协议的波形图,光看程序的话当然难以理解的。
② 51单片机红外遥控程序是什么
#include
③ 求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 了, 最后通过键数据码 来定义 单片机要干什么事