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 + -
显示快捷键?