0809.c

来自「本篇文章介绍了一种智能小车」· C语言 代码 · 共 209 行

C
209
字号
#include <intrins.h>//这个头文件中有_nop_();
#include <reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
//----------------------------------------------------------------------------------------------------
char bdata gate=0x00;  //三—八译码器
char bdata sensors=0xff;//存放采集来的数的逻辑电平
sbit l1=sensors^0;
sbit l2=sensors^1;
sbit l3=sensors^2;
sbit l4=sensors^3;
//-----------
sbit lun=P1^6;
//----------------------------------------------------------------------------------------------------
sbit left=P1^0; //左电机使能
sbit right=P1^1;//右电机使能
//---------------------------------
sbit you=P3^7;
sbit hou=P3^6;
sbit qian=P3^5;
sbit zuo=P3^4;
//---------------AD模拟通道选择
sbit gat_3=gate^2;///存放 A
sbit c=P2^6; //////////////    A
sbit gat_2=gate^1;// 存放 B
sbit b=P2^5; /////////////     B
sbit gat_1=gate^0;// 存放 C
sbit a=P2^4; /////////////     C

sbit eoc=P2^2;//---转换结束标志
sbit oe=P2^3; //---取值允许
sbit ale=P2^7;//--允许转换
uint data dat[8],i;
uint sum=0;
uint  max=200;
uint  min=134;
int tim=0; //--进中断次数100为一个周期
uint speedleft,speedright;//--左右轮转速控制
//---------------------------------------------------------------------------------------------------
void get_0809(void);//--读0809数据         0809用到的程序
void start(void);//--初始化
void test(void); //--检测
void cotor_car(void);//--控制小车
void hold(void);
void stop(void);
//---------------------------------------------------------------------------------------------------
void Forward(char speed);//前进            293用到的程序
void Reverse(char speed,int dely,bit r);//speed--速度,dely--时间,r--左(右)
void TurnRight(uint dey);//右拐
void TurnLeft(uint dey);//左拐
void delay(unsigned int time);//--延时
void stop(void);//---停止
void delay(uint e);//--延时
//---------------------------延时程序-------------------------------------------------------------
void delay(uint e)
{
   while(e--)
   {
   _nop_();_nop_();_nop_();
   _nop_();_nop_();}
}
//-----------------------前进程序----------------------------------------------------------------
void Forward(char speed)
{
  P1=0x1b;lun=1;
 speedleft=speed;
 speedright=speed+4;
 TR0=1;
 delay(15);
 TR0=0;
 }
//----------------------左转程序-------------------------------------------------------------------
void TurnLeft(uint dey)
{
P1=0x2b;lun=1;
 speedleft=35;
 speedright=25;
 TR0=1;
 delay(dey);
 TR0=0;
}
//----------------------右转程序-------------------------------------------------------------------
void TurnRight(uint dey)
{
P1=0x17; lun=0;
 speedleft=25;
 speedright=35;
 TR0=1;
 delay(dey);
 TR0=0;

}
/*----------------------------------后退程序----------------------------------------------------
void Reverse(char speed,int dely,bit r)
{

}
//-----------------------------------停止程序---------------------------------------
void stop(void)
{
  TR0=0;right=0;left=0;
}   */
//-------------------------控制小车程序------------------------------------------------------------
void cotor_car(void)                           /*  中间的两个对管为 a b */
{                            /*  左边为 c右边为 d */
    switch(sensors)
    {            //--设收到返回光为高电平
  //------------------------------------------------------------------------------------
  case 0x07:TurnLeft(20);break;
  case 0x0e:TurnLeft(20);break;
  case 0x06:Forward(80);break;
  case 0x05:TurnLeft(10);break;
  case 0x0c:TurnRight(20);break;
  case 0x03:TurnLeft(20);break;
  case 0x0a:TurnRight(20);break;
     default:Forward(30);
     }

}
//---------------------检测程序-----------------------------------------------------------------------
void test(void)
{
   float ave=0;
   uint how;
   sensors=0x00;
   dat[0]-=40;dat[1]-=2;dat[2]+=10;dat[3]-=9;
   for(how=0;how<i;how++)
   {
     if((max<dat[how])&&((dat[how]-max<=80)))//-------取最大值
          max=dat[how];
       if((min>dat[how])&&((min-dat[how])<=80))//-----取最小值
             min=dat[how];
        ave=(max+min)/2;
        sensors<<=1;
     if(dat[how]>=(ave-2))
        l1=1;
   }
   zuo=l4;qian=l3;hou=l2;you=l1;
}
/*-----------------------------------------------------------------------
void hold(void)
{
} */
//------------------------------------------初始化程序--------------------------------------------------
void start(void)
{
uint j;
   EA=1; ET0=1;//-----开中断-----------
  TMOD=0x02;   //方式二
    TH0=0xe0;  //
    TL0=0xe0;
     i=4; //四个对管只取四路模拟量
  a=b=c=0;
  for(j=0;j<8;j++) //清空逻辑量存贮区
  {dat[j]=0x00;}
      max=200;
      min=134;

}
//-----------------------------------------------------------------------------------------------------
void get_0809(void)                             /*读AD0809数据程序*/
{
   int s;
   for(gate=0;gate<i;gate++)
   {
    c=gat_3;     b=gat_2;     a=gat_1;
    _nop_();_nop_();_nop_();_nop_();
     ale=1;
     ale=0;
     delay(5);
  while(eoc);
     oe=1;sum=0x00;
       for(s=0;s<10;s++) //读十次AD值取平均值
       {sum=sum+P0;_nop_();}
        dat[gate]=sum/10;
     oe=0;
    }
}
//-----------------------------------------------------------------------------------------------
void main(void)                             /*主程序*/
{
 start();
  while(1)
   {
   start();
   get_0809();
   test();
   cotor_car();
    }

}
//------------------------------------------------------------------------------------------------
void time0(void) interrupt 1 using 2         /*电机定时中断*/
{
   if(tim<=speedright)
         right=1;
     else
         right=0;
   if(tim<=speedleft)
        left=1;
         else
        left=0;
tim++;
if(tim>=100)
   tim=0;
}

⌨️ 快捷键说明

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