chaosheng.c

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

C
215
字号
#include<reg52.h>
#include<stdio.h>
#include <absacc.h>
#include <string.h>
#include <intrins.h>//这个头文件中有_nop_();
#define uchar unsigned char
#define uint unsigned int
//------------------------------变量定义--------------------------
uint data tme = 0,PWM = 0;    //PWM
uint data speed = 6;  //shift
uint data fang_xiang = 70;//直行时AD值
uint data max = 105; //130
uint data min = 30;  //25
//---------超声波测距变量
uint  data shou_left = 0;
uint  data shou_right = 0;
uint  data far = 0;
//超声波口线
//----------------
sbit fa = P2^5;
sbit shou_1 = P2^7;
sbit shou_2 = P2^6;
int data ad = 0x00;
unsigned char bdata DATAIN;
unsigned char bdata CTRL;
sbit BITIN = DATAIN^0;
sbit CBIT = CTRL^0;
//------------------------------口线----------------
//---------------------方向电机
sbit duo = P2^0;
sbit left = P2^1;
sbit right = P2^2;
//----------------------驱动电机
sbit run = P1^3;
sbit b = P1^4;
sbit a = P1^5;
//---------------------0832
sbit SCS = P1^0;
sbit SCLK = P1^1;
sbit SDOUT = P1^2;
sbit SDIN = P1^2;
//------------------------------子程序声明---------------------------------------
void delay( uint dey );
void start( void );
unsigned char get_ad( void );
//---------------------------------初始化----------------------------------------
void start( void )
{
   EA = 1;
   ET0 = 1;
   TMOD = 0x22;
   TH0 = 0X40;
   TL0 = 0X40;
   PT0 = 1;
   TR0 = 1;
   IT0 = 0;
   EX0 = 1;
}

//---------------------------------0832------------------------------------------
uchar get_ad( )
{
    uchar data  i;
    CTRL = 0x07;         //启动位,SGL 选CH0通道,011三位
    SCS = 1;             //选通允许
    SCS = 0;
    for( i = 0;i < 3;i ++ )
    {
       SDIN = CBIT;
       SCLK = 0;           //发三个时钟
       SCLK = 1;
       CTRL = CTRL >> 1;
    }
    SCLK = 0;
    SCLK = 1;         //第四个时钟
/*------------------------------------------开始读A/D---------------------------*/
    SCLK = 0;
    for( i = 0;i < 8;i ++ )
    {
       DATAIN = DATAIN << 1;                  //移位8次取到采样的值
       BITIN = SDOUT;
       SCLK = 1;
       SCLK = 0;
     }
       SCS = 1;
       return( DATAIN );
}
//--------------------------------delay---------------------------------------
void delay( uint dey )
{
while( dey -- );
}
//---------------------------------方向调整程序-------------------------------
void regu( int dri )
{
   int data k;
   ad = 0;
   for(k = 0;k < 25;k ++)
    {
    ad += get_ad();
    }
    ad /= 25;
    k = ad - dri;
   if( k > 2)
      {
      left = 0;
      right = 1;
      }
      else if( k < -1)
      {
      left = 1;
      right = 0;
      }
    else
     left = right = 0;
}
//--------------------------------探障程序---------------------------------------
void test( void )
{
   ET1 = 1;
   TH1 = 0xe9;
   TL1 = 0xe9;
   far = 0;
   TR1 = 1;
   EX0 = 1;
   delay ( 100 );
   EX0 = 0;
   TR1 = 0;
}
//--------------------------------行驶程序-----------------------------------------
void on_the_way( void )
{
  a = 0; b = 1;  // 小车的前进电平
  if( shou_right )
    {
      fang_xiang += 30;
        if( fang_xiang > max )
           fang_xiang = max;
    }
    if( shou_left )
       {
         fang_xiang -= 30;
         if( fang_xiang < min )
            fang_xiang = min;
       }
   shou_left = 0;
   shou_right = 0;
   TR1 = 0;
}
//-------------------------------直行------------------------------------------
void zhi_xing ( void )
{
         if( fang_xiang > 70 )
               fang_xiang -= 1;
         if( fang_xiang < 70 )
               fang_xiang += 1;
}
//--------------------------------主程序------------------------------------------
void   main ( void )
{
  uint data i;
  start( );
    while(1)
    {
       for( i = 0;i < 5;i ++ )
       {
        test( );
        on_the_way( );
        regu( fang_xiang );
        }
    zhi_xing( );
    }
}
//--------------------------------小车速度中断(定时器  0)-----------------------------------------
void time0( void ) interrupt 1 using 1
{
tme ++;
  if(tme > 5)
    {
      PWM ++;
      tme = 0;
      duo = !duo;
    }
 if ( PWM < speed )
       run =  1;
      else
       run = 0;
 if ( PWM >= 10 )
      {
      PWM = 0 ;
      }
}
//--------------------------------超声波发送中断(定时器 1)-------------------------------------------------
void time1 ( void ) interrupt 3 using 3
{
  fa =! fa;
  far ++;
}
//-------------------------------超声波接收中断 (外中断 0)-------------------------------------------
void int0 ( void ) interrupt 0 using 2
{
      TR1 = 0; 
   if( shou_2 == 0 )
     {
       if( ( far > 40 ) && ( far < 100 ) )
           shou_left = 1;
      }
   if(shou_1 == 0)
     {
       if( ( far > 40 ) && ( far < 100 ) )
          shou_right = 1;
     }
      EX0 = 0;
}

⌨️ 快捷键说明

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