源程序:
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define Left OCR1A
#define Right OCR1B
#define ADD 1.15; //宏定义,加速系数
uchar i;
uchar flag; //是否减速标志位
uchar TCRT5000_IN;
uint Max_Speed;
uchar Min_Speed;
/*************************************************
函数名称:Init_TCRT5000
函数功能:初始化红外传感器TCRT5000
函数说明:设置PA口为输入,监测传感器信号*********/
void Init_TCRT5000()
{
DDRA = 0X00;
PORTA = 0XFF;
}
/*************************************************
函数名称:Max()
函数功能:判断最大速度
函数说明:判断最大速度,将其值放入Max_Speed中*****/
void Max()
{
if(Left >= Right)
{
Max_Speed = Left * ADD;
}
else
{
Max_Speed = Right * ADD;
}
if(Max_Speed >= 0xf7)
{
Max_Speed = 0xf7;
}
Min_Speed = 0x20 ;
}
/*************************************************
函数名称:Scan_TCRT5000
函数功能:TCRT5000进行扫描,返回跑到信息
函数说明:*********/
void Scan_TCRT5000()
{
TCRT5000_IN = PINA&0x1F;
switch(TCRT5000_IN)
{
/* OOOOO *///全灭
case 0x00:
break;
/* ***** *///全亮
case 0x1f:
OCR1A=0x00;
OCR1B=0x00;
break;
/* O*OOO */
case 0x08:
OCR1A=Min_Speed;
OCR1B=Max_Speed;
break;
/* *OOOO */
case 0x10:
OCR1A=Min_Speed;
OCR1B=Max_Speed;
break;
/* O**OO */
case 0x0c:
OCR1A=Min_Speed;
OCR1B=Max_Speed;
break;
/* **OOO */
case 0x18:
OCR1A=Min_Speed;
OCR1B=Max_Speed;
break;
/* ***00*/
case 0x1c:
OCR1A=Min_Speed;
OCR1B=Max_Speed;
break;
/* OOO*O */
case 0x02:
OCR1A=Max_Speed;
OCR1B=Min_Speed;
break;
/* OOOO* */
case 0x01:
OCR1A=Max_Speed;
OCR1B=Min_Speed;
break;
/* OO**O */
case 0x06:
OCR1A=Max_Speed;
OCR1B=Min_Speed;
break;
/* OOO** */
case 0x03:
OCR1A=Max_Speed;
OCR1B=Min_Speed;
break;
/* OO*** */
case 0x07:
OCR1A=Max_Speed;
OCR1B=Min_Speed;
break;
default:
break;
}
}
/*************************************************
函数名称:Init_Speed
函数功能:定时器1初始化,产生两路PWM信号
函数说明:通过改变全局变Left,Right控制小车速度**/
void Init_Speed()
{
DDRD |= 0X30;
TCCR1A=0xA1;
TCCR1B=0x0A;
OCR1A=0;
OCR1B=0;
}
/**********************************************
函数名称:Stop
函数功能:小车停止
函数说明:Right=0,Left=0*********************/
void Stop()
{
OCR1A=0x00;
OCR1B=0x00;
}
/**********************************************
函数名称:Init_Timer0
函数功能:初始化定时器0
函数说明:初始化定时器0
设1024分频
100ms触发一次中断,速度加1**********/
void Init_Timer0()
{
TCCR0 = 0x05;
TCNT0 = 0x00;
TIMSK |= BIT(2);
SREG |= BIT(7);
}
void main()
{
uchar speed;
TCRT5000_IN = PINA&0x1F;
Init_Speed();
Init_TCRT5000();
Init_Timer0();
while(1)
{
TCRT5000_IN = PINA&0x1F;
while(TCRT5000_IN != 0x04)
{
SREG &= ~BIT(7); //关闭中断
Scan_TCRT5000();
TCRT5000_IN = PINA&0x1F;
flag = 1;
}
while(TCRT5000_IN == 0x04)
{
if(flag == 1)
{
Left = 0xb0;
Right = 0xb0;
flag =0;
SREG |= BIT(7); //打开中断
}
TCRT5000_IN = PINA&0x1F;
}
}
}
/*定时器0中断函数*/
#pragma interrupt_handler Timer0:10
void Timer0()
{
TCNT0 = 0x00;
i++;
if(i == 100)
{
i=0;
Left++;
if(Left >= 0xfe)
{
Left = 0xfe;
}
OCR1B++;
if(OCR1B >= 0xfe)
{
OCR1B = 0xfe;
}
Max();
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』