先接9毫秒的高电平,4.5毫秒的低电平!在接收时,如果不为9毫秒和4.5毫秒姿祥即可退出!(当然,它们可以有范围的高电平可以放宽到8到10毫秒左右,因为有能量损失!)解码数据时!先解码
高电平(0.56毫秒)在解码没有信号(1.125)为0,没有信号(2.25)为1,将数据存入寄存器就OK!32位数据接收完成后!判断是否为别的遥控器晌森!判断用户码是否为一直的!在读出数迹谨搏据,散装到要执行的 *** 作!
void wen() interrupt 4{
RI=0
a=SBUF
j=SBUF
flag=1
}
你自己不是已昌袭镇经写了,再加耐粗个判断就是禅咐了。
#include<reg52.h>unsigned char distemp
unsigned char irtime//红外用全局变量
bit irpro_ok,irok
static unsigned char i
sbit zhongduan=P3^3
unsigned char IRcord[4]
unsigned char irdata[33]
void main(void)
{
IT1 = 1 // 配好虚置为下降沿中断1 / INT0(p3 3)
EX1 = 1 // 使EX0中断
EA = 1
TMOD=0x02//定时器0工作方蚂基式2,TH0是重装值,TL0是初值
TH0=(65536-65536)/256//重载值
TL0=(65536-65536)%256//初始值
ET0=1//开中断
TR0=1
zhongduan=1
while(1) /友物燃/主循环
{
if(irok)
{
unsigned char i, j, k=1 //红外码值处理函数,K=1,33位中第一位为头码,所以为1是跳过读取头码
unsigned char cord,value
for(i=0i<4i++) //处理4个字节
{
for(j=1j<=8j++) //处理1个字节8位
{
cord=irdata[k]
value=value>>1
if(cord>7) value=value|0x80//大于某值为1
k++
}
IRcord[i]=value
value=0
}
irpro_ok=1//处理完毕标志位置1
irok=0
}
}
}
void ex0_isr (void) interrupt 2 //外部中断0服务函数
{
if(zhongduan==0)
{
if(irtime<55&&irtime>=35)//引导码 TC9012的头码
{i=0}
irdata[i]=irtime
irtime=0
i++
if(i==33)
{
irok=1
i=0
}
}
else
{
irtime=0
zhongduan=1 //P33口保持高电平
}
}
void tim0_isr (void) interrupt 1 //定时器0中断服务函数
{
irtime++
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)