⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gai__0809.c

📁 本篇文章介绍了一种智能小车
💻 C
字号:
#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;//存放采集来的数的逻辑电平
char temp[4];
int idata max[4]={90,90,90,90};
int idata min[4]={245,245,245,245};
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;//--允许转换
int idata dat[4];
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:TurnRight(20);break;
  case 0x0a:TurnLeft(20);break;
     default:Forward(30);
     }

}
//---------------------检测程序-----------------------------------------------------------------------
void test(void)
{
uint s,yu=0xf7,huo=0x08;
uint ave[4];
//----------------------------------
  for(s=0;s<4;s++)
  {
    if(max[s]==255)
      max[s]=90;
    if(min[s]<40)
      min==254;
//----------------------------------
   if(dat[s]>max[s])
     max[s]=dat[s];
      if(dat[s]<min[s])
        min[s]=dat[s];
//-----------------------------------
  ave[s]=((max[s]/2)+(min[s])/2);
//-----------------------------------
      if(dat[s]>ave[s])
           sensors|=huo;
         else
            sensors&=yu;
//-----------------------------------
             yu>>=s;
             huo>>=s;
  }
  zuo=l4;qian=l3;hou=l2;you=l1;
}
/*-----------------------------------------------------------------------
void hold(void)
{
} */
//------------------------------------------初始化程序--------------------------------------------------
void start(void)
{
   EA=1; ET0=1;//-----开中断-----------
  TMOD=0x02;   //方式二
    TH0=0xe0;  //
    TL0=0xe0;
}
//-----------------------------------------------------------------------------------------------------
void get_0809(void)                             /*读AD0809数据程序*/
{
  uint i=4; 
   for(gate=0;gate<i;gate++)
   {
    c=gat_3;     b=gat_2;     a=gat_1;
    _nop_();_nop_();_nop_();_nop_();
     ale=1;
     ale=0;
     while(!eoc);
     oe=1;
     _nop_();
      dat[gate]=P0;
     oe=0;
    }
}
//----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
void main(void)                             /*主程序*/
{
 start();
  while(1)
   {
   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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -