📄 trace_road2.c
字号:
//小车沿黑线行驶程序
//创建时间:2005年7月25日10:44
#include"iom16v.h"
#include"macros.h"
char a;
unsigned char iron;
void delay_us(unsigned char time)
{//微秒级延时程序
do
{
time--;
}
while (time>1);
}
void delay_ms(unsigned int time)
{//毫秒级延时程序
while(time!=0)
{
delay_us(1000);
time--;
}
}
void init_trace_road(void)
{
MCUCSR|=0x80;//禁止PC5第二功能,使之为普通I/O口
MCUCSR|=0x80;
DDRC&=0x1F;//PC5 6 7为右中左红外传感器输入
PINC&=0x1F;
TCCR1A=0x81;//COM1A[1:0]=2,WGM1[3:0]=5
TCCR1B=0x0a;//CS1[2:0]=0b101
TCCR2=0x6a;//WGM2[1:0]=3,COM2[1:0]=2,CS2[2:0]=0b111
}
void slow_left(void)//向左慢转
{
OCR1AH=0; //右轮不变
OCR1AL=0xef;
OCR2=0x7f; //左轮减速
}
void slow_right(void)//向右慢转
{
OCR1AH=0; //右轮减速
OCR1AL=0x7f;
OCR2=0xef; //左轮不变
}
void quick_left(void)//向左快转
{
OCR1AH=0; //右轮不变
OCR1AL=0xef;
OCR2=0x3f; //左轮超低速
}
void quick_right(void)//向右快转
{
OCR1AH=0; //右轮超低速
OCR1AL=0x3f;
OCR2=0xef; //左轮不变
}
void forward(void)//前进
{
OCR1AH=0; //左右轮同速
OCR1AL=0xef;
OCR2=0xef;
}
void stop(void)
{
OCR1AH=0; //右轮停转
OCR1AL=0x00;
OCR2=0x00; //左轮停转
}
void turn_halfl(void)//左转半圈
{
unsigned long i;
OCR1AH=0; //右轮慢速
OCR1AL=0x3f;
OCR2=0x00; //左轮停转
for(i=30000;i>0;i--)
if(PINC&0XE0) //若检测到黑线,跳出
break;
else ;
a=0;
}
void turn_right(void)//右转
{unsigned long i;
OCR1AH=0; //右轮停转
OCR1AL=0x00;
OCR2=0x3f; //左轮慢速
for(i=55000;i>0;i--)
if(PINC&0XE0) //若检测到黑线,跳出
break;
else ;
a=1;
}
void trace_road(void)
{
unsigned char pinc;
a=1;
pinc=PINC&0XE0; //PC7~PC5信号送给变量pinc
if((pinc==0x40)||(pinc==0xe0))//只有中间传感器有信号,
forward(); //或三个均有信号,则直走
else if(pinc==0xc0)//若右边无信号
else if(pinc==0x20)//若左边和中间均无信号
quick_right(); //快速右转
else if(a==1) //若三个均无信号
turn_halfl(); //左转半圈
else
turn_right();
}
#pragma interrupt_handler test_iron:2
void test_iron(void)
{
++iron;
PORTA=0x00;
delay_ms(500);
PORTA=0xff;
if(iron==4)
{stop();delay_ms(5000);
forward();delay_ms(1000);}
}
void main(void)
{
iron=0;
DDRA=0xff;
GICR|=0X40;
MCUCR=0X03;
PORTD&=0Xfb;
PORTD|=0x04;
PORTA=0xff;
init_trace_road();
while(1)
{
SEI();
trace_road();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -