?? linecheck._h
字號:
/*******************************
*程序名稱:智能小車設(shè)計(jì)
*作 者:吳聰
*日 期: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)); /*低電平觸發(fā)中斷*/
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
}
//============================================================================================
//函數(shù): void delay(int hh)
//語法:void delay(int hh)
//描述:延時子程序
//參數(shù):
//返回:無
//============================================================================================
void delay(unsigned int hh )
{
int i;
for(i=0;i<hh;i++)
{
;
}
}
//============================================================================================
//函數(shù): void pwma(int hh)
//語法:void pwma(int hh)
//描述: 用于控制右輪
//參數(shù):占空比
//返回:無
//============================================================================================
/*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; //關(guān)占空比
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;
}
}
//============================================================================================
//函數(shù): void pwmb(int hh)
//語法:void pwmb(int hh)
//描述: 用于控制左輪
//參數(shù):占空比
//返回:無
//============================================================================================
void pwmb( unsigned int hh) //設(shè)定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; //關(guān)占空比
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;
}
}*/
/*中斷服務(wù)程序*/
#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;
}
}
//============================================================================================
//描述:車子方向控制子程序
//參數(shù) 無
//返回:無
//============================================================================================
void STOP() //停止
{
PORTB=0X00;
delay(10000);
}
void GO(unsigned int aa) //直線前進(jìn)
{
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) //前左轉(zhuǎn)
{
PORTB=0X02|0X30;
delay(cc);
PORTB=0X00;
delay(T-cc);
}
void GTOR(unsigned int dd) //前右轉(zhuǎn)
{
PORTB=0X04|0X30;
delay(dd);
PORTB=0X00;
delay(T-dd);
}
void BTOR(unsigned int cc) //后左轉(zhuǎn)
{
PORTB=0X010|0X30;
delay(cc);
PORTB=0X00;
delay(T-cc);
}
void BTOL(unsigned int dd) //后右轉(zhuǎn)
{
PORTB=0X08|0X30;
delay(dd);
PORTB=0X00;
delay(T-dd);
}
//============================================================================================
//函數(shù): void line_check_GO(void)
//語法:void line_check_GO(void)
//描述: 前進(jìn)黑白尋跡檢測
//參數(shù):無
//返回:無
//============================================================================================
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)
}
//============================================================================================
//函數(shù): void line_check_BACK(void)
//語法:void line_check_BACK(void)
//描述: 前進(jìn)黑白尋跡檢測
//參數(shù):無
//返回:無
//============================================================================================
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -