📄 irsensor.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include "DelayTime.h"
#define IR_LEFT_LED 0
#define IR_RIGHT_LED 1
#define IR_FALSE 0
#define IR_TRUE 1
#define IR_38K_Enable { TCCR0 = _BV(CS01);TCNT0 = 256 - 7; }
#define IR_38K_Disable { TCCR0 = 0; TCNT0 = 256 - 7; }
#define IR_600ms_Enable { TCNT1H = 0xff - 0x09; TCNT1L = 0xff - 0x28 + 1;TCCR1B = _BV(CS12);}
#define IR_600ms_Disable { TCNT1H = 0xff - 0x09; TCNT1L = 0xff - 0x28 + 1;TCCR1B = 0;}
//0928 ,024A
#define IR_REC_HAVE_SIGN ( (PIND & _BV(PD2)) == 0 ) //检测到了红外信号
volatile unsigned char ucIr_LR_Flag;//左右标志
volatile unsigned char ucIr_600msOverFlag;//600ms时间到达标志
//38K Hz
SIGNAL(SIG_OVERFLOW0)
{
if(ucIr_LR_Flag == IR_LEFT_LED)
PORTB ^= _BV(PB0);
else
PORTB ^= _BV(PB1);
TCNT0 = 256 - 13;
}
//600ms的时间延时
SIGNAL(SIG_OVERFLOW1)
{
ucIr_600msOverFlag = IR_TRUE;
//TCNT1H = 0xff - 0x09;
//TCNT1L = 0xff - 0x28+1;
}
void Ir_Init(void)
{
//初始化
ucIr_LR_Flag = IR_LEFT_LED;
ucIr_600msOverFlag = IR_FALSE;
//设置端口方向
DDRB = 0xff;
DDRC = 0x7F;
DDRD = 0x00;
//设置TIMER0 计数器
IR_38K_Disable;
//设置TIMER1 计数器
TCCR1A = 0x00;
IR_600ms_Disable;
//使能中断
TIMSK = _BV(TOIE0)|_BV(TOIE1);
sei();
}
int Ir_Check(void)
{
unsigned char ucIsHaveSignFlag;
IR_38K_Enable; //打开38k信号的发送
IR_600ms_Enable;//600ms时间计数开始
ucIr_600msOverFlag = IR_FALSE;
ucIsHaveSignFlag = IR_FALSE;
//等待600ms时间完成
while(ucIr_600msOverFlag == IR_FALSE )
{
if(IR_REC_HAVE_SIGN)
{ //检测到了信号
ucIsHaveSignFlag = IR_TRUE;
break;
}
}
IR_38K_Disable; //关闭38k信号
IR_600ms_Disable;//600ms时间计数关闭
if( ucIr_LR_Flag == IR_LEFT_LED)
PORTB &=~ _BV(PB0);
else
PORTB &=~ _BV(PB1);
if(ucIsHaveSignFlag == IR_FALSE) return IR_FALSE; //没有找到
IR_600ms_Enable;//600ms时间计数开始
ucIsHaveSignFlag = IR_FALSE;
ucIr_600msOverFlag = IR_FALSE;
//等待600ms时间完成
while(ucIr_600msOverFlag == IR_FALSE)
{
if( !IR_REC_HAVE_SIGN )
{ //检测到了信号
ucIsHaveSignFlag = IR_TRUE;
break;
}
}
IR_600ms_Disable;//600ms时间计数关闭
if( ucIr_LR_Flag == IR_LEFT_LED)
PORTB &=~ _BV(PB0);
else
PORTB &=~ _BV(PB1);
if(ucIsHaveSignFlag == IR_FALSE) return IR_FALSE; //如果找到,则信号不正确
//由信号
return IR_TRUE;
}
int main(void)
{
int iRetVal;
Ir_Init();
while(1)
{
iRetVal = Ir_Check();
if(ucIr_LR_Flag == IR_LEFT_LED)
{
if( iRetVal == IR_TRUE)
{
PORTC |= _BV(PC0);
}
else
{
PORTC &=~ _BV(PC0);
}
//DelayMs(200);
ucIr_LR_Flag = IR_RIGHT_LED;
}
else
{
if( iRetVal == IR_TRUE)
{
PORTC |= _BV(PC1);
}
else
{
PORTC &=~ _BV(PC1);
}
//DelayMs(200);
ucIr_LR_Flag = IR_LEFT_LED;
}
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -