⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irsensor.c

📁 网上看到的一个避障小车的程序。该程序是avr单片机上应用的。
💻 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 + -