找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3894|回復(fù): 0
收起左側(cè)

51單片機(jī)控智能小車源程序

[復(fù)制鏈接]
ID:618842 發(fā)表于 2019-10-2 19:16 | 顯示全部樓層 |閱讀模式
#include <reg52.h>      //包含52系統(tǒng)頭文件
#define uint unsigned int
#define uchar unsigned char   
#define Leftmotogo      {IN1=0,IN2=1;}   //左電機(jī)向前zou
#define LeftmotoStop    {EN1=0;IN1=0,IN2=0;}         //左邊電機(jī)停轉(zhuǎn)                     
#define Rightmotogo     {IN3=1,IN4=0;}   //右邊電機(jī)向前走
#define RightmotoStop   {EN2=0;IN3=0,IN4=0;}        //右邊電機(jī)停轉(zhuǎn)  
sbit IN1=P1^2; //
sbit IN2=P1^3; //
sbit IN3=P1^6; //
sbit IN4=P1^7; //
sbit EN1=P1^4; //使能
sbit EN2=P1^5; //使能
sbit key4=P3^7;
sbit beep=P2^3;
sbit Leftled=P3^3;  //左循跡紅外傳感器      
sbit Rightled=P3^2;  //右循跡紅外傳感器
sbit Left_2_led=P3^4;  //左避障紅外傳感器  
sbit Right_2_led=P3^5;  
uchar pwmleft  =0;//變量定義
uchar pwmright =0;
uchar pushleft =6;// 左電機(jī)占空比N/20 //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
uchar pushright=6;// 右電機(jī)占空比N/20
          // 大家可以根據(jù)循跡效果修改以上兩個(gè)數(shù)值
bit RightPWMON=1;            //右電機(jī)PWM開關(guān)
bit LeftPWMON =1;      //左電機(jī)PWM開關(guān)

void delayms(uint xms)   
{
    uint i,j;
for(i=xms;i>0;i--)
     for(j=110;j>0;j--);
}
void run()
{
    pushleft=6;  //速度調(diào)節(jié)變量 0-20。。。0最小,20最大
pushright=6;
Leftmotogo ;   //左電機(jī)往前走
Rightmotogo ;  //右電機(jī)往前走
}
void leftrun()
{  
     pushleft=5;
  pushright=5;
  Rightmotogo ;  //右電機(jī)往前走
     LeftmotoStop ;  //左電機(jī)停止
}
void  rightrun()
{
  pushleft=5;
  pushright=5;
     Leftmotogo;   //左電機(jī)往前走
  RightmotoStop;  //右電機(jī)往前走
}
void  stop()
{
  LeftmotoStop;
  RightmotoStop;
}
//       PWM調(diào)制電機(jī)轉(zhuǎn)速            左電機(jī)調(diào)速                                                           
/*調(diào)節(jié)push_val_left的值改變電機(jī)轉(zhuǎn)速,占空比*/
void pwmoutleftmoto()
{  
     if(LeftPWMON)
     {
          if(pwmleft<=pushleft)
       {
            EN1=1;
       }
       else        EN1=0;
          if(pwmleft>=20)
       pwmleft=0;
     }
     else       EN1=0;   //若未開啟PWM則EN1=0 左電機(jī) 停止
}
/*                    右電機(jī)調(diào)速                                  */  
void pwmoutrightmoto()
{
    if(RightPWMON)
    {
        if(pwmright<=pushright) //20ms內(nèi)電平信號(hào) 111 111 0000 0000 0000 00
     {
         EN2=1;        //占空比6:20
        }
     else     EN2=0;
     if(pwmright>=20)
     pwmright=0;
    }
    else          EN2=0;   //若未開啟PWM則EN2=0 右電機(jī) 停止
}   
void timer0() interrupt 1     //TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號(hào)
{
     TH0=0XFC;   //1Ms定時(shí)
  TL0=0X66;
  pwmleft++;
  pwmright++;
  pwmoutleftmoto();
  pwmoutrightmoto();
}
void keyscan()              //按鍵掃描函數(shù)
{
    A:    if(key4==0)   //判斷是否有按下信號(hào)
  {
      delayms(10);    //延時(shí)10ms
   if(key4==0)   //再次判斷是否按下
    {
       beep=0;               //蜂鳴器響   
       while(!key4); //判斷是否松開按鍵
       beep=1;               //蜂鳴器停止  
     }
      else  goto A;        //跳轉(zhuǎn)到A重新檢測(cè)
  }
  else  goto A;             //跳轉(zhuǎn)到A重新檢測(cè)
}
void main()
{
    P1=0X00;    //關(guān)電機(jī)
    keyscan(); //按鍵啟動(dòng)檢測(cè)
delayms(1000);//1s后啟動(dòng)
TMOD=0X01;
    TH0= 0XFC;  //1ms定時(shí)
    TL0= 0X66;
    TR0= 1;
    ET0= 1;
EA = 1;     
while(1) //無限循環(huán)
{
     if(Left_2_led==0||Right_2_led==0) {stop();}
        if(Leftled==0&&Rightled==0)    run();   //調(diào)用前進(jìn)函數(shù)
        else if(Leftled==1&&Rightled==0)/*左邊檢測(cè)到黑線*/  leftrun(); //調(diào)用小車左轉(zhuǎn)函數(shù)   
  else if(Rightled==1&&Leftled==0)/*右邊檢測(cè)到黑線*/rightrun();//調(diào)用小車右轉(zhuǎn)函數(shù)  
  else  stop();
  
  }
}
  
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表