c51单片机红外NEC编码解码!

c51单片机红外NEC编码解码!,第1张

 这个程序太简单了,我之前写过红外发射程序的,接收程序也很简单,你这个项目我2个小时都能帮你解决,但是89C52单片机发射38K不准需要把晶振加大,提高单片机的运行速度。

你的项目只要主机A发射红外协议后面加一个地址,单片机B接收的时候全部进入接收状态,判接收的地址是否符合对于单片机B的地址,如果地址符合,那就先回应一个数据例如:55FF55,主机接收到55FF55后后面开始接收数据,把接收到的数据直接写入单片机内EEPRM里面!

这个我不太熟悉,我只能就程序本身来说

void interrupt_ISR() interrupt 0

{

EX0=0; //D is able INT 0

TR0=0; //D is able Timer0

IRint=1;

//为什么要把IRint置1(IRint接MCU单片机 P3^2)

这个问题你不应该问我,应该看说明的

interval=TH0;

TH0=0xb0; //怎么算得TH0的值?

0x起头的数字是16进制数,THO=b16=176(十进制)

TL0=0;

TR0=1; //Enable Timer0

EX0=1; //Enable INT0

}

bit IRdecode()

{

static Idata BYTE INTcount=0;

//这里可以用uchar INTcount;INTcount=0;代替吗?

其实这个你最好自己调试一下就知道行不行了,后面的 *** 作主要是

比较大小,uchar比较的时候一般是会自动进行数字比较的,但是在单片机

上就不清楚了,可能支持不是那么好,这个最好按规范的写法来。

static ulong idata IRdata=0;

BYTE IRdata1,IRdata2,IRdata3,IRdata4;

if(IRint)

{

if((interval>0xde)&&(interval<0xe1)) //0xdfe2=135ms

{

IRdata=0;

INTcount=0;

}

else if((interval>0xb6)&&(interval<0xb9)) //0xb7fb=225ms(data=1)

{

IRdata=(IRdata<<1)+1;

INTcount++;

}

else if((interval>0xb2)&&(interval<0xb5)) //0xb3fd=1125ms(data=0)

{

IRdata=IRdata<<1;

INTcount++;

}

else if((interval>0xd6)&&(interval<0xd9)) //0xd7e7=1125ms

{

IRint=0;

IRdata=0;

IRcommanddata=0xff;

//repeat重复 code flag有什么意义吗? 没明白你的意思

return 1; 返回1值到哪去? 返回值见下面

}

else

{

INTcount=33;

IRdata=0;

}

IRint=0;

if(INTcount==32)

{

IRdata1=(BYTE)(IRdata>>24);

//这部分是什么意思,有什么作用?

前面(BYTE)是强行转换(IRdata>>24)的结果为BYTE型,>>是右移运算,按二进制计算的,例如1111000》1=0111100 左边补0

IRdata2=(BYTE)(IRdata>>16);

IRdata3=(BYTE)(IRdata>>8);

IRdata4=(BYTE)(IRdata);

IRdata=0;

if(IRdata4==~IRdata3)

{

IRcommanddata=IRdata3; //还原命令成功

return 1;

}

else

return 0;

}

else

return 0;

}

return 0; 返回值0给谁??

return当然是返回个调用者,调用函数之前并不存在实际的返回者,

例如bit a=IRdecode()

无论返回1还是0都是返回给a在这行代码里a就是调用者

}

#include<reg52h>

void main()

{

TH0=0XB0;

EA=0;

ET0=1; //Enable Timer0 interrupt

TMOD=0x21;//定时器0,工作模式1;定时器1,工作模式2(8位自动重装) 为什么要启用两个定时器??

这个你更应该看看说明书,每个开发板的用法都不同

TCON=0x50; //TR0=TR1=1,start timers

EA=1;

while(1)

{

}

貌似你MAIN函数里没有调用过上面的函数

}

//这是IRh提供给外部调用的函数

#ifndef _IR_H_

#define _IR_H_

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

void ir_init(void);

void ir_run(void);

#endif

下面使用说明:

void ir_init(void);//红外初始化

void ir_run(void);//红外运行

extern uchar ir_code[2];//键盘码

例子:

void main()

{

ir_init();

while(1)

{

ir_run();

write_smg(0,ir_code[2]/16);//写数码管0显示

write_smg(1,ir_code[2]%16);//写数码管1显示

}

}

可到百度文库下载源码IRc(搜索关键字:IR红外解码模块)

感兴趣的还有:WDT看门狗模块

很好用!!!

51单片机,把晶振12mhz单片机上的红外解码程序,直接复制到晶振为11mhz的单片机上,程序一般还能正常运行。因为编程人员知道,即便是晶振频率很准确,也还是有误差和温漂,而红外遥控发码端谐振元件更是使用的陶瓷振荡器,所以在解码程序中,不会对时序卡的死死地,都会留有富裕系数。这样,把晶振12mhz单片机上的红外解码程序,直接复制到晶振为11mhz的单片机上,程序一般还能正常运行。

以上就是关于c51单片机红外NEC编码解码!全部的内容,包括:c51单片机红外NEC编码解码!、关于单片机的问题(红外遥控解码程序问题)、51单片机DX们请帮忙看下红外解码的程序问题出在哪里按键无反应,发射芯片是HS5104,急、急、急......等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9349434.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存