?? irsensor2
字號:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.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 - 13; }
#define IR_38K_Disable { TCCR0 = 0; TCNT0 = 256 - 13; }
#define IR_600ms_Enable { TCNT1H = 0xff - 0x02; TCNT1L = 0xff - 0x4a + 1;TCCR1B = _BV(CS12);}
#define IR_600ms_Disable { TCNT1H = 0xff - 0x02; TCNT1L = 0xff - 0x4a + 1;TCCR1B = 0;}
//0928 ,
#define IR_REC_HAVE_SIGN ( (PIND & _BV(PD2)) == 0 ) //檢測到了紅外信號
volatile unsigned char ucIr_LR_Flag;//左右標(biāo)志
volatile unsigned char ucIr_600msOverFlag;//600ms時間到達(dá)標(biāo)志
//38K Hz
SIGNAL(SIG_OVERFLOW0)
{
PORTB ^= _BV(PB0);
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;
//設(shè)置端口方向
DDRB = 0xff;
DDRC = 0x7F;
DDRD = 0x00;
//設(shè)置TIMER0 計數(shù)器
TCNT0 = 256 - 13;
TCCR0 = _BV(CS01);
//設(shè)置TIMER1 計數(shù)器
TCCR1A = 0x00;
IR_600ms_Disable;
//使能中斷
TIMSK = _BV(TOIE0);
sei();
}
int Ir_Check(void)
{
unsigned char ucIsHaveSignFlag;
IR_38K_Enable; //打開38k信號的發(fā)送
IR_600ms_Enable;//600ms時間計數(shù)開始
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; //關(guān)閉38k信號
IR_600ms_Disable;//600ms時間計數(shù)關(guān)閉
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時間計數(shù)開始
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時間計數(shù)關(guān)閉
if(ucIsHaveSignFlag == IR_TRUE) 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);
}
ucIr_LR_Flag = IR_RIGHT_LED;
}
else
{
if( iRetVal == IR_TRUE)
{
PORTC |= _BV(PC1);
}
else
{
PORTC &=~ _BV(PC1);
}
ucIr_LR_Flag = IR_LEFT_LED;
}
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -