📄 linecheck._h
字号:
/*******************************
*程序名称:智能小车设计
*作 者:吴聪
*日 期:2008-5-20
********************************/
#include <iom32v.h>
unsigned int T=1000;
unsigned int i=0;
unsigned int k=1;
unsigned int flag=1;
unsigned int temp;
void port_init(void)
{
PORTA = 0XFF;
DDRA = 0x00;//PA 为输入口
PORTB = 0x00;
DDRB = 0xff;//PB 为输出口
PORTC = 0X00;
DDRC = 0xFF;//PC 为输出口
DDRD=0XF7;
PORTD=0X08;
}
/*中断初始化*/
void INT1_init()
{
SREG=0x80; /*使能全局中断*/
//MCUCR&=~((1<<ISC01)|(1<<ISC00)); /*低电平触发中断*/
MCUCR=0x0C;
GICR=(1<<INT1); /*使能外部中断1请求*/
}
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: Hz
// actual value: Out of range
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x00 /*INVALID SETTING*/; //set count
OCR0 = 0x00 /*INVALID SETTING*/; //set compare
TCCR0 = 0x02; //start timer
}
//TIMER1 initialize - prescale:1
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 25Hz
// actual value: 25.000Hz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x63; //setup
TCNT1L = 0xC0;
OCR1AH = 0x9C;
OCR1AL = 0x40;
OCR1BH = 0x9C;
OCR1BL = 0x40;
ICR1H = 0x9C;
ICR1L = 0x40;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
##pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x63; //reload counter high value
TCNT1L = 0xC0; //reload counter low value
GICR=(1<<INT1);
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
timer1_init();
TIMSK = 0x04; //timer interrupt sources
//all peripherals are now initialized
}
//============================================================================================
//函数: void delay(int hh)
//语法:void delay(int hh)
//描述:延时子程序
//参数:
//返回:无
//============================================================================================
void delay(unsigned int hh )
{
int i;
for(i=0;i<hh;i++)
{
;
}
}
//============================================================================================
//函数: void pwma(int hh)
//语法:void pwma(int hh)
//描述: 用于控制右轮
//参数:占空比
//返回:无
//============================================================================================
/*void pwma( unsigned int hh)
{
unsigned int s=0;
unsigned int T0=10000;
unsigned int H;
s=PORTA;
switch(hh) //占空比
{
case 0: s=s&0xfc; delay(T0);break; //关占空比
case 1: delay(1000);s=s&0xfc; delay(9000);break;
case 2: delay(2000);s=s&0xfc; delay(8000);break;
case 3: delay(3000);s=s&0xfc; delay(7000);break;
case 4: delay(4000);s=s&0xfC; delay(6000);break;
case 5: delay(5000);s=s&0xfc; delay(5000);break;
case 6: delay(6000);s=s&0xfc; delay(4000);break;
case 7: delay(7000);s=s&0xfc; delay(3000);break;
case 8: delay(8000);s=s&0xfc; delay(2000);break;
case 9: delay(9000);s=s&0xfc; delay(1000);break;
case 10: delay(10000);s=s&0xfc;break;
}
}
//============================================================================================
//函数: void pwmb(int hh)
//语法:void pwmb(int hh)
//描述: 用于控制左轮
//参数:占空比
//返回:无
//============================================================================================
void pwmb( unsigned int hh) //设定TA_TIMEOUT/16=(time_cl)/0x1e00)/16=100Hz
{
unsigned int k=0;
int T=10000;
int H;
k=PORTA;
switch(hh) //占空比
{
case 0: k=k&0xf3; break; //关占空比
case 1: delay(1000);k=k&0xf3; delay(9000);break;
case 2: delay(2000);k=k&0xf3; delay(8000);break;
case 3: delay(3000);k=k&0xf3; delay(7000);break;
case 4: delay(4000);k=k&0xf3; delay(6000);break;
case 5: delay(5000);k=k&0xf3; delay(5000);break;
case 6: delay(6000);k=k&0xf3; delay(4000);break;
case 7: delay(7000);k=k&0xf3; delay(3000);break;
case 8: delay(8000);k=k&0xf3; delay(2000);break;
case 9: delay(9000);k=k&0xf3; delay(1000);break;
case 10: delay(10000);k=k&0xf3;break;
}
}*/
/*中断服务程序*/
#pragma interrupt_handler int1:4
void int1()
{
/*unsigned char i;
for(i=0;i<8;i--) //去
{
//PORTB=~(1<<i);
PORTB=0x00;
delay_ms(5);
}*/
if(flag)
{
timer0_init();
temp=TCNT0;
//delay(10000);
MCUCR=0x08;
flag=0;
//delay_ms(80);
}
else
{
TCCR0 = 0x00;
temp=TCNT0-temp;
MCUCR=0x0c;
flag=1;
// delay_ms(80);
// INT1_init();
// SREG=0x00;
GICR=0x00;
}
}
//============================================================================================
//描述:车子方向控制子程序
//参数 无
//返回:无
//============================================================================================
void STOP() //停止
{
PORTB=0X00;
delay(10000);
}
void GO(unsigned int aa) //直线前进
{
PORTB=0X06|0X30;
delay(aa);
// PORTB=0X00;
// delay(T-aa);
}
void BACK(unsigned int bb) // 直线后退
{
PORTB=0X09|0X30;
delay(bb);
PORTB=0X00;
delay(T-bb);
}
void GTOL(unsigned int cc) //前左转
{
PORTB=0X02|0X30;
delay(cc);
PORTB=0X00;
delay(T-cc);
}
void GTOR(unsigned int dd) //前右转
{
PORTB=0X04|0X30;
delay(dd);
PORTB=0X00;
delay(T-dd);
}
void BTOR(unsigned int cc) //后左转
{
PORTB=0X010|0X30;
delay(cc);
PORTB=0X00;
delay(T-cc);
}
void BTOL(unsigned int dd) //后右转
{
PORTB=0X08|0X30;
delay(dd);
PORTB=0X00;
delay(T-dd);
}
//============================================================================================
//函数: void line_check_GO(void)
//语法:void line_check_GO(void)
//描述: 前进黑白寻迹检测
//参数:无
//返回:无
//============================================================================================
void Linecheck_GO(void)
{
unsigned char ss;
PORTA = 0XFF;
DDRA = 0x00;//PA 为输入口
delay(1);
// _NOP();
ss=PINA;
switch(ss)
{
case 0xEF: GTOL(600);i=0; break;
case 0xF7: GTOL(600); i=0;break;
case 0xFB: GO(700); i=0; break;
case 0XFD: GTOR(600);i=0; break;
case 0xFE: GTOR(600); i=0;break;
default : i++;
}
//if( i>=300)
if(0)
{
STOP();
i=300;
}
else GO(1000); // if (i!=0)
}
//============================================================================================
//函数: void line_check_BACK(void)
//语法:void line_check_BACK(void)
//描述: 前进黑白寻迹检测
//参数:无
//返回:无
//============================================================================================
void Linecheck_BACK(void)
{
unsigned char ss;
PORTA = 0XFF;
DDRA = 0x00;//PA 为输入口
delay(1);
// _NOP();
ss=PINA;
switch(ss)
{
case 0xf0: BTOR(600); break;
case 0xe8: BTOR(600); break;
case 0xe4: BACK(700); break;
case 0Xe2: BTOL(600); break;
case 0xe1: BTOL(600); break;
default : BACK(700);
}
}
void blance(void)
{
if(temp<0x9f)
GO(1000);
//Linecheck_GO();
PORTC = temp;
if(temp>0xa0)
BACK(700);
PORTC = temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -