本人新手,接触C语言一星期左右,弄了个小车代码但是发现好多问题。看来看去还是发现不了问题所在心累了。。请大神来看下代码然后告诉我哪里错了,还有就是要是可以的话告诉下怎么改。 小车流程是这样:先探测前方小车是否动,动了就跟着前方小车一起动(速度已知,而且同时要红外探黑线)。随后前方小车停止,我方小车也要停止。当前方小车再动时,我方小车要超车,然后回到原本轨道,跟着黑线走到终点。
我写的代码是这样的:
#include <AT89x51.H> //器件配置文件
#include <intrins.h>
#define RX P1_5
#define TX P1_4
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
unsigned char k=0;
unsigned char mode;
unsigned char i;
sbit IN1=P2^0;
sbit IN2=P2^1;
sbit IN3=P2^2;
sbit IN4=P2^3;
//bit flag =0;
//unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
unsigned char const positon[3]={ 0xdf,0xef,0xf7};
unsigned char disbuff[4] ={ 0,0,0,0,};
#define shuma P0 //定义P0口为数据口
sbit R1=P0^0;
sbit R2=P0^1;
sbit L1=P0^3;
sbit L2=P0^2;
sbit LED_4=P1^0;
sbit LED_5=P1^1;
sbit LED_6=P1^2;
sbit LED_7=P1^3;
void delay(unsigned int x); //声明延时函数
void display2();//unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);
//声明数码管显示函数
/定义段码=====0-9=====A-G=====*/
unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
/********************************************************/
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; //算出来是CM
if(S>=700) //超出范围显示“-”
{
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
/*******************o函数功能:定时器初始化和变量初始化************************/
void init_sys(void) //定时器初始化函数
{
TMOD=0X01;
TH0=0;
TL0=0;
EA=1; //开启中断
ET0=1; //允许T0中断
EX0=1;
IT0=1;
}
/******************************3超声波工作时序********************************/
void StartModule() //启动模块
{
TX=1; //启动一次模块
_nop_(); //延时1个(机器)指令周期
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
void delayx(unsigned long o)
{
while(o--);;;
}
void cejuxianshi()
{
StartModule(); //启动超声波模块
while(!RX); //当RX为0时等待
TR0=1; //开始计数
while(RX); //当RX为1时计数等待
TR0=0; //关闭计数
Conut(); //计算
display2();
}
void main()
{
init_sys();
while(1)
{
cejuxianshi();
while(S<20&&k==0)
{
cejuxianshi();
IN1=IN2=IN3=IN4=0;
}
while(S>=20&&k==0)
{
cejuxianshi();
mode=1;
if(L2)
mode=2;
if(R2)
mode=3;
if(mode==2 && L2==0)
mode=1;
if(mode==3 && R2==0)
mode=1;
delayx(800);
if(S==20)
k=1;
}
while(S<=20&&k==1)
{
cejuxianshi();
IN1=IN2=IN3=IN4=0;
delayx(800);
if(S>20)
k=2;
}
while(k==2)
{ cejuxianshi();
mode=4;
}
while(k==3)
{
cejuxianshi();
IN1=IN3=1;
IN2=IN4=0;
if(L1==1||L2==1)
mode=2;
if(R1==1||R2==1)
mode=3;
}
switch(mode)
{
case 1:
for(i=0;i<255;i++)
{
if(i<=65)
{
IN1=1;IN2=0;IN3=1;IN4=0;
}
else
{
IN1=IN2=IN3=IN4=0;
}
break;
}
case 3:
for(i=0;i<255;i++)
{
if(i<=55)
{
IN1=1;IN2=0;IN3=1;IN4=0;
}
if(i>55&&i<=75)
{
IN3=1;IN1=IN2=IN4=0;
}
else
{
IN1=IN2=IN3=IN4=0;
}
break;
}
case 2:
for(i=0;i<255;i++)
{
if(i<=55)
{
IN1=1;IN2=0;IN3=1;IN4=0;
}
if(i>55&&i<=75)
{
IN1=1;IN3=IN2=IN4=0;
}
}
break;
case 4:
{
IN1=IN2=IN4=0;IN3=1;//原地左转
delayx(11000);
IN3=1;
IN4=0;
IN1=1;
IN2=0; //直走
delayx(8000);
IN1=1;
IN4=0;
IN2=0;
IN3=0; //原地右转
delayx(15000);
IN3=1;
IN2=0;
IN3=1;
IN4=0; //直走(超车)
delayx(20000);
IN1=1;
IN4=0;
IN3=0;
IN2=0; //原地右转
delayx(10000);
k=3;
}
break;
}
}
}
void delay(unsigned int x)
{
unsigned int i;
//x?a?óê±3¤?è,?éò?éè??
for(i=0;i<x;i++);
}
void display2()//unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4)
{
shuma=a[disbuff[0]]; //选中第五位,发送第一位段码
LED_4=0;
delay(100);
LED_4=1;
shuma=a[disbuff[1]]; //选中第六位,发送第二位段码
LED_5=0;
delay(100);
LED_5=1;
shuma=a[disbuff[2]]; //选中第七位,发送第三位段码
LED_6=0;
delay(100);
LED_6=1;
//shuma=a[d4]; //选中第八位,发送第四位段码
//LED_7=0;
//delay(100);
//LED_7=1;
}
此帖出自
小平头技术问答
一周热门 更多>