当前位置:首页 > 单片机 > 单片机
[导读]使用一体化的红外接收头,直接就解码出来了,平时红外接收头输出的是高电平,当有红外数据的时候,就会根据发送的红外数据有相应的电平转换。大家可以随便找个遥控板,测一下红外接收波形,看看高低电平的表示,便于

使用一体化的红外接收头,直接就解码出来了,平时红外接收头输出的是高电平,当有红外数据的时候,就会根据发送的红外数据有相应的电平转换。大家可以随便找个遥控板,测一下红外接收波形,看看高低电平的表示,便于计数及接收步骤。这次用的遥控板的红外协议是这样的:

0.6ms高电平+0.48ms低电平表示0,接收解码出来是0.6ms低电平+0.48ms高电平。

0.6ms高电平+1.66ms低电平表示1,接收解码出来是0.6ms低电平+1.66ms高电平。

调制38kHz,占空比1/3.

遥控发送数据先是9ms高电平,4.5ms低电平,然后是两个字节的识别码,接着是一个字节的数据和一个字节的数据反码。

单片机解码0和1只用计数接收到的低电平长度就行了。

具体的程序如下:

//interrp.c

#include
#include "interrp.h"


void Interrp_int0_init(void)
{
SREG=0X80;
GICR|=(1<MCUCR=0X00;//0X00低电平中断;0x01:电平变化中断;
//0x02:下降沿;0x03:上升沿;
}

void Interrp_int1_init(void)
{
SREG=0X80;
GICR|=(1<MCUCR=0X08;//0X00低电平中断;0x04:电平变化中断;
//0x08:下降沿;0x0c:上升沿;
}

void Interrp_int0_stop(void)
{
GICR&=~(1<}

void Interrp_int1_stop(void)
{
GICR&=~(1<}

//main.c

#include
#include "mytype.h"
#include "uart.h"
#include "interrp.h"
#include "timer.h"

#define IR 2
#define PIN4 PIND
#define DDR4 DDRD
#define in_IR (PIN4&(1<


uint8 code_0,code_1,data_0,data_1;
uint8 table[16]={"0123456789abcdef"};
#pragma interrupt_handler IR_init:2

void IR_init(void)
{uint8 i;
Interrp_int0_stop();//关中断。
i=Data_dec();//红外数据检测。
if(i==0)
{
Send_abyte(table[TCNT1/4096]);
Send_abyte(table[TCNT1%4096/256]);
Send_abyte(table[TCNT1%256/16]);
Send_abyte(table[TCNT1%16]);
Prints("Error",1);
}
code_0=0;
code_1=0;
data_0=0;
data_1=0;
DelayXms(100);
Interrp_int0_init();
}


uint8 Data_dec(void)
{
uint8 i;
while(in_IR==0);//等待红外输入变高。
Timer1_init();//定时器计数开始。
while(in_IR);//等待红外输入变低。
Timer1_stop();//定时计数停止。
if((TCNT1<26980)|(TCNT1>34980))
return 0; //4.5ms红外起始接受检测,不对返回0.

for(i=0;i<8;i++)
{
while(in_IR==0);//等待红外输入高。
Timer1_init();//定时计数开始。
while(in_IR);//等待红外输入变低。
Timer1_stop();//定时计数停止。
/*Send_abyte(table[TCNT1/4096]);
Send_abyte(table[TCNT1%4096/256]);
Send_abyte(table[TCNT1%256/16]);
Send_abyte(table[TCNT1%16]);
Send_abyte(' ');*/
if((TCNT1<4400)&&(TCNT1>3400))
;
else
code_0=(code_0+(1<} //地址码接受;
for(i=0;i<8;i++)
{
while(in_IR==0);
Timer1_init();
while(in_IR);
Timer1_stop();
if((TCNT1<4400)&&(TCNT1>3400))
;
else
code_1=(code_1+(1<} //地址码接受;
for(i=0;i<8;i++)
{
while(in_IR==0);
Timer1_init();
while(in_IR);
Timer1_stop();
if((TCNT1<4400)&&(TCNT1>3400))
;
else
data_0=(data_0+(1<} //数据码接受;
for(i=0;i<8;i++)
{
while(in_IR==0);
Timer1_init();
while(in_IR);
Timer1_stop();
if((TCNT1<4400)&&(TCNT1>3400))
;
else
data_1=(data_1+(1<} //数据反码接受;
Data_process();
}

void Data_process(void)//发送接受数据到串口。
{
Send_abyte(table[code_0/16]);
Send_abyte(table[code_0%16]);
Send_abyte(' ');
Send_abyte(table[code_1/16]);
Send_abyte(table[code_1%16]);
Send_abyte(' ');
Send_abyte(table[data_0/16]);
Send_abyte(table[data_0%16]);
Send_abyte(' ');
Send_abyte(table[data_1/16]);
Send_abyte(table[data_1%16]);
Send_abyte(10);
Send_abyte(13);
}

void main(void)
{
DDR4&=~(1<Uart_init();
Prints("System init...",1);
Interrp_int0_init();
while(1);
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算机外部设备、工业实时控制...

关键字: AVR 单片机 计算机

AVR单片机是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set CPU) 精简指令集高速8位单片机。可以广泛应用于计算机外部设备、工业实时控制、仪器仪表、通...

关键字: AVR 单片机 计算机

AVR与传统类型的单片机相比,除了必须能实现原来的一些基本的功能,其在结构体系、功能部件、性能和可靠性等多方面有很大的提高和改善。 但使用更好的器件只是为设计实现一个好的系统创造了一个好的基础和可能性,如果还采用和沿袭以...

关键字: AVR 单片机 硬件

在这篇文章中,小编将为大家带来AVR单片机的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: AVR 单片机

在下述的内容中,小编将会对AVR单片机的相关消息予以报道,如果AVR单片机是您想要了解的焦点之一,不妨和小编共同阅读这篇文章哦。

关键字: AVR 单片机

杰成医疗(健适医疗成员企业)的"经血管介入生物主动脉瓣膜"在国内首次得到成功应用,两名心脏瓣膜病患者通过经导管主动脉瓣置换术(TAVR)各被植入一枚"杰成经血管介入瓣膜"。杰成医疗已计划对该产品在全球范围内开展多个前瞻性...

关键字: AVR

新加坡2022年2月5日 /美通社/ -- 近日,新兴医疗科技公司“健适医疗”宣布,公司已完成对“苏州杰成医疗科技有限公司”的收购,后者是国内TAVR(Transcatheter Aortic Valve Replace...

关键字: AVR

心电图aVR导联在额面六轴系统中的地位与作用

关键字: AVR 导联理论

在六轴系统中,avR 导联位于额面右上方,其负极位于左下 30°,在Ⅰ和Ⅱ导联之间。由于胸导联的出现和对Ⅰ和Ⅱ导联的重视,avR 导联常被忽视。近年来有学指出,avR 导联有着重要的应用价值。

关键字: AVR 六轴

通常来讲,AVR单片机指的是1997年由ATMEL公司研发出的增强型内置Flash的RISC(Reduced Instruction Set Computer) 精简指令集高速8位单片机。AVR的单片机可以广泛应用于计算...

关键字: AVR 哈佛
关闭
关闭