基于AVR单片机的红外接收程序设计

发布者:科技创客最新更新时间:2020-04-04 来源: elecfans关键字:AVR  单片机  红外接收程序 手机看文章 扫描二维码
随时随地手机看文章

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


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只用计数接收到的低电平长度就行了。

基于AVR单片机的红外接收程序设计

具体的程序如下:

//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  单片机  红外接收程序 引用地址:基于AVR单片机的红外接收程序设计

上一篇:AVR单片机的主要特性及应用解析
下一篇:AVR单片机的复位操作方法解析

推荐阅读最新更新时间:2024-11-06 14:51

一种基于单片机的正弦波输出逆变电源的设计
摘 要:介绍了一种正弦波输出的逆变电源的设计。设计中采用了DC/DC和DC/AC两级变换,高频变压器隔离,单片机控制。实验结果表明性能可靠。 关键词:逆变电源;单片机;正弦脉宽调制 O 引言 低压小功率逆变电源已经被广泛应用于工业和民用领域。特别是新能源的开发利用,例如太阳能电池的普遍使用,需要一个逆变系统将太阳能电池输出的直流电压变换为220V、50Hz交流电压,以便于使用。本文给出了一种用单片机控制的正弦波输出逆变电源的设计,它以12V直流电源作为输入,输出220V、50Hz、0"150W的正弦波交流电,以满足大部分常规小电器的供电需求。该电源采用推挽升压和全桥逆变两级变换,前后级之间完全隔离。在控制电路上,前级推挽升压电
[应用]
MSP430单片机的热敏电阻温度测量
摘要 传统的数字式测量电阻的方法是先将电阻值转换为电信号(如电压),再用A/D转换器将其转换为数字信号,因此电路复杂,费用高。本文介绍一种类R—F转换频率测量温度的方法。直接把热敏电阻Rt接到由RC构成的多谐振荡器电路中,用MSP430单片机的捕获功能来获得多谐振荡器输出信号高低电平的脉宽并同时计数,则热敏电阻Rt与捕获高低电平时的计数值的差值成正比关系,查表可得温度值。 关键词 热敏电阻 温度测量 MSP430单片机捕获中断 测量温度一般采用热敏电阻做传感器,测量的方法有R—V转换电压测量法和R—F转换频率测量法。这两种方法的电路复杂且成本高,电路中很多元器件直接影响测量精度。本文论述一种类R—F转换频率的测量法,用NE5
[工业控制]
MSP430<font color='red'>单片机</font>的热敏电阻温度测量
单片机做加减乘除小算术(试看编程序
单片机做加减乘除小算术(试看编程序)
[单片机]
<font color='red'>单片机</font>做加减乘除小算术(试看编<font color='red'>程序</font>)
单片机的模块化编程
现在生产的许多单片机对8051的内核进行了扩展,比如,内部看门狗,ADC转换、EEPROM、PWM等功能。在编程控制程序时,如需要利用这些扩展模块,一般程序体积会变大,文本的长度较长。在调试程序时就显得不太方便了,较好的方法是根据程序段的功能进行模块化编程。 当然在利用一般的单片机编程时,将实现同一目的的程序段进行封装,进行模块化编程,对于程序的维护和调试也是很有帮助的。 1、在运用C语言进行编程时,要养成良好的编程书写习惯。 在程序的开始一般的格式: /********************** File name: 文件名称 Author: 作者 Version: 版本号 Description: 功能描
[单片机]
单片机内部模拟比较器的应用
一般来说,内部带A/D转换器的单片机价格都比较昂贵,而且一般只有8到10位的分辨率,这在高分辨率要求的场合显然不适用;而普通的单片机则根本没有A/D转换器。随着现代电子技术的发展,出现了一些体积小、内含模拟比较器的单片机,如ATMAL的AT89C2051、ZILOG的Z86E04、MICROCHIP的PIC16C620等,这些单片机在使用时连接比较器的端口一般只作普通I/O使用,而对其内置的模拟比较器的应用却很少。下面以AT89C2051为例,谈谈利用单片机内置模拟比较器来构成A/D转换器的新方法。 1 硬件转换电路 AT89C2051是MCS51单片机系列中的一种,它虽然只有20个引脚,却集成了51系列单片机的标准内核,
[模拟电子]
基于AVR高性能单片机的以太网接口设计
   0 引 言    随着互联网的迅速发展,各种家电设备、仪器仪表也在逐步走向网络化,以便共享网络信息资源、远程监控等,这也是嵌入式系统发展的趋势。而以太网作为目前应用最为广泛的局域网,在工业自动化和过程控制领域得到了越来越多的应用,因此,对于大量存在的8位微控制器而言,实现以太网通信具有重要的实际意义。现在应用较多的是基于51内核单片机的上网方案,由于处理能力的限制,要实现较复杂的网络传输和控制有点困难。本系统采用ATMEL公司的高性能单片机Mega64和10 Mb/s以太网控制芯片RTL8019AS实现了以太网接口,详细介绍了硬件电路的连接以及嵌入 式TCP/IP的实现,使单片机具有了互联网络的接入功能。    1
[单片机]
基于51单片机,蜂鸣器和led每秒1滴1亮的程序
#include reg52.h #define uchar unsigned char #define uint unsigned int int seccnt,m=0; char tzsta,msta; sbit led=P2^0; sbit beep=P1^5; void ini()//定时器0 { seccnt=0; msta=tzsta=0; TMOD=0x01; TH0=0x0FF; TL0=0x9C; TR0=1; } void on()//蜂鸣器和灯的功能 { if(m =500) { beep=~beep; } if(m =100
[单片机]
单片机的LED轮廓显示控制器设计原理
根据LED轮廓显示控制的结构特点,设计了基于STC单片机的显示控制器。该系统控制采用STC11/12系列单片机为控制处理器,加以外围电路,利用485接口实现主从远距离控制。设计了色带数据与效果数据格式,充分利用单片有限的存储空间完成更多显示效果。利用分控制器完成对现有市场上的6803、2803和1809系列LED专用驱动芯片的兼容。本案开发的LED护栏管显示屏控制器已产品化,控制效果良好。 LED护栏管又名丽得管,是一种先进的LED装饰照明灯饰产品。以红、绿、蓝3种颜色的LED作为光源,使用了微电子和数码技术,能进行色彩追逐,色彩过渡渐变,灰度变化和七色变化,能产生十分丰富的色彩变幻效果。该产品外形采用一次成型,灯管和底座浑为一
[单片机]
<font color='red'>单片机</font>的LED轮廓显示控制器设计原理
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved