021125226k.c

来自「2007全国电子设计大赛小车完整程序」· C语言 代码 · 共 711 行 · 第 1/2 页

C
711
字号
#include <mega16.h>
#include  <delay.h> 
#include <stdlib.h>  
#include <math.h>
#define  uchar unsigned char
#define  uint unsigned int
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
char flag=0,flag2=0,i=0,j=0,angle[10]={0},str2[10]={0},str3[10]={"OK!!"};
float ale=0,ale2=0,ale1=0; 
int ms=0,s=0,mq=0,q=0;
char sec[5]={"0"};
char title[6]="Time:";

void stop()
{   PORTC.3=0;
    PORTC.4=0;
    PORTC.5=0;
    PORTC.6=0;
}
void forward(int a,int speed)
{   OCR2=speed;
    PORTC.3=1;
    PORTC.4=0;
    PORTC.5=1;
    PORTC.6=0;
    delay_ms(a);
    stop();
}
       

void back(int a,int speed)
{   OCR2=speed;
    PORTC.3=0;
    PORTC.4=1;
    PORTC.5=0;
    PORTC.6=1;
    delay_ms(a);
    stop();
}
void left(int a,int speed)
{   OCR2=speed;
    PORTC.3=1;
    PORTC.4=0;
    PORTC.5=0;
    PORTC.6=1;
    delay_ms(a);
    stop();
}
void right(int a,int speed)
{   OCR2=speed;
    PORTC.3=0;
    PORTC.4=1;
    PORTC.5=1;
    PORTC.6=0;
    delay_ms(a);
    stop();
}

void time(void){
	
	lcd_gotoxy(0,1);
	lcd_putsf("         ");
	lcd_gotoxy(0,1); 
        lcd_puts(title);
        
        
        lcd_puts(sec);
        lcd_putchar('s');	
}

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
        
        TCNT0=0x06;     
        ms++;        
        if(ms==1800)      
          {              
                ms=0;
                itoa(s,sec);             
                s++; 
                 time();              
          } 
          mq++;
                  
        if(mq==100000)      
          {              
                mq=0;
                            
                           
                q++; 
                
                             
          } 
        
                      
}


// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {  
     
    
     if( data == '='){
                flag=1;
                i--;
              }
              
              if(flag==1){
                if(flag2==0){
                        if(data == ' '){
                                
                        } 
                        else if(data == '-'){
                                angle[i]=data;
                                i++;        
                        }
                        else if (data == '.'){
                                flag2=1;
                                angle[i]=data;
                                
                        }
                
                        else {
                                angle[i]=data;
                                i++;
                        }
                }
              
                if(flag2==1){
                        
                        if(j==4){
                                angle[i]='\0';
                                j=0;
                                i=0;
                                flag=0;
                                flag2=0;
                              lcd_gotoxy(0,0);  
                              lcd_putsf("      ");
                               lcd_gotoxy(0,0);
                                ale1=atof(angle);
                                ale=ale1-ale2;                  
                                ftoa(ale,2,str2);
                                lcd_puts(str2);        }                              
                        else if(j==2){
                                
                                angle[i]=data;
                                j++;
                                i++;       
                        
                        } 
                        else if(j==3){
                                
                                angle[i]=' ';
                                j++;
                                i++;       
                        
                        }
                        else{
                                angle[i]=data;
                                j++;
                                i++;
                        
                        
                        }
                }
              } 
      
      
      
   };  
}



// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{unsigned char state,state1;   
  char str[]="ANGLE JUST"; 
  int i=0,speed=0xff,tem;
PORTB=0x00;
DDRB=0xFF;  
lcd_init(16);
PORTD=0x83;
DDRD=0xf0;
PORTC=0x00;
DDRC=0xFF; 

PORTA=0x77;
DDRA=0x00;


TCCR0=0x02;
TCNT0=0x06;
OCR0=0x00;     
TIMSK=0x01;

TCCR2=0x62; //set count
TCNT2=0;
OCR2=0x80;   

UCSRA=0x00;
UCSRB=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud rate: 57600
UCSRA=0x00;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x03;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization


// Global enable interrupts
#asm("sei")

lcd_gotoxy(8,0);
lcd_putsf("SELECT!"); 
delay_ms(2000);
lcd_gotoxy(0,0);  
lcd_putsf("               ");
while(1)
{ 
 if(PINA.3==0)  
 {delay_ms(1000);
if(PINA.3==1)   //进入程序一 ,基本要求
{

lcd_gotoxy(6,0);
lcd_puts(str);
ale2=ale1; 
delay_ms(2000); 
lcd_gotoxy(6,0);  
lcd_putsf("          ");
lcd_gotoxy(0,0);

while(PINA.3==1)
{ 

};  


delay_ms(100); 
s=0;       
state=PINA&0X07;        //寻找入口
for(;state==0;) 
{state=PINA&0X07;
PORTC=~(PINA&0x07);
forward(10,0xff);
}

delay_ms(500); 

 
while(1)  
{ 
  
state=PINA&0X07;
PORTC=~(PINA&0x07);
              //直线寻迹至中点 
              
 if(ale<4) 
 {
 switch(state)  
       {case 0x00:back(220,speed);break;
        case 0x01:right(180,speed);break;
        case 0x02:forward(250,speed);break;
        case 0x03:right(180,speed);break;
        case 0x04:left(180,speed);break;
        case 0x05:forward(250,speed);break;
        case 0x06:left(180,speed);break;
        case 0x07:forward(250,speed);break;
       } 
       } 
  else break;
} 
 i=0;
while(1)  
{

state=PINA&0X07;
PORTC=~(PINA&0x07);
              //直线寻迹至中点
if(s>6) speed=0xa4;
if(state==0x07){ i++;if(i==2) break; forward(500,0xff);   }

//if(state==0x07) break;
 switch(state)  
       {case 0x00:back(200,speed);break;
        case 0x01:right(100,speed);break;
        case 0x02:forward(200,speed);break;
        case 0x03:right(100,speed);break;
        case 0x04:left(100,speed);break;
        case 0x05:forward(200,speed);break;
        case 0x06:left(100,speed);break;
        case 0x07:break;
       }      
}   
i=0;
//微调
s=0;
while(1)
{ if(ale>=-1.4&&ale<1.4) {i++;delay_ms(200);if(i>=6) break;}
 if(ale>5) {i=0;forward(75,0x85);delay_ms(3000);}
 if(ale>4&&ale<5) {i=0;forward(65,0x85);delay_ms(3000);}
 if(ale>3&&ale<4) {i=0;forward(50,0x85);delay_ms(3000);}
 if(ale>2&&ale<3) {i=0;forward(35,0x85);delay_ms(3000);}
 if(ale>1.3&&ale<2) {i=0;forward(23,0x85);delay_ms(3000);}
// if(ale>=0&&ale<1) {forward(10,0x90);delay_ms(2000);break;}
 if(ale<-5) {i=0;back(75,0x85);delay_ms(3000);}
 if(ale>-5&&ale<-4) {i=0;back(65,0x85);delay_ms(3000);}
 if(ale>-4&&ale<-3) {i=0;back(50,0x85);delay_ms(3000);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?