一体化红外接收头
红外信号收发系统的典型电路,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。
串口通信程序
//向pc串口发送数据
//pc端使用 超级终端 建立连接
//9600 8位数据 1位停止[/font][/align]
#include <iom16v.h>
#include <macros.h>
#include "uart0.h"
#define uint unsigned int
#define uchar unsigned char
uchar irr_b=0,s_s=0;
uchar wb=0,a=0,ds=0;
long da=0;
uchar d1,d2,d3,d4;
uchar ten_1,ten_2,ten_3,ten_4,i;
void ms(uint aa)
{
for(;aa>0;aa--);
}
[align=left][font=宋体]void write_cn(uchar *cn,uchar cn_nub)
{
uchar i;
for(i=0;i<(cn_nub);i++)
{
uart_tx(cn[i]); //[/font]
发送数据i
PORTA=i;
ms(60000);
}
}[/align]
//定时器T1初始化
void t1_init()
{
TCCR1B=0x00; //关闭定时器
TCNT1H=0x00; //定时器初值
TCNT1L=0x00;
TCCR1A=0x00; //普通模式
TCCR1B=0x05; //1024分频
}
#pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数
//中断接收
void ext_int0_isr(void)
{
if(irr_b==0) //第一个中断
{
irr_b=1; //状态为:开始接收
TCNT1L=0x00; //定时器清零
}
else if(irr_b==1) //第二个以后的中断
{
a=TCNT1L; //读取定时器的值
//判断是引导,还是数据
if((170<a)&&(a<235)) //引导
{
wb=0; //数据计数清零
da=0; //数据清零
TCNT1L=0x00; //定时器清零
}
else if((8<a)&&(a<25)) //数据0
{
wb++;
da=(da<<1);
TCNT1L=0x00;
}
else if((25<a)&&(a<45)) //数据1
{
wb++;
da=(da<<1)+1;
TCNT1L=0x00;
}
}
if(wb==32) //数据长度够32位
{
irr_b=0; //状态为停止接收
wb=0; //数据计数清零
s_s=1; //打开显示许可
}
}
//与计算机通信的程序
//计算机端使用超级终端,建立一个连接,9600,8位,1个停止位
void main()
{
uchar i=0,rx_temp;
init_devices(); //串行口初始化
DDRA=0xff;
PORTA=0x00;
DDRB=0xff;
DDRD=0x00; //中断输入
PORTD=0xff; //内部上拉
t1_init(); //定时器t1初始化
MCUCR = 0x02; //下降沿中断
GICR = 0x40; //开外部中断int_0
TIMSK = 0x00;
SREG=0x80; //开全局中断
s_s=1; //开机进行一次显
ms(3000);
write_cn("开始红外实验\r\n",14);
while(1){
ds=TCNT1L;
if(ds>250) //定时器超时,接收复位
{
TCNT1L=0;
irr_b=0;
da=0;
wb=0;
s_s=0;
}
if(s_s==1) //显示开关打开,开始显示
{
SREG=0x00; //关闭全局中断
//显示设备码
d1=da>>24;
write_cn(&d1,1);
d1=da>>16;
write_cn(&d1,1);
d1=da>>8;
write_cn(&d1,1);
d1=da;
write_cn(&d1,1);
DDRD=0x00; //中断输入
PORTD=0xff; //内部上拉
s_s=0; //关闭显示开关
SREG=0x80; //开全局中断
}
}
}
[/i][/td][/tr][/table]