
这个程序太简单了,我之前写过红外发射程序的,接收程序也很简单,你这个项目我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,急、急、急......等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)