久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5012|回復: 4
打印 上一主題 下一主題
收起左側

單片機藍牙避障小車程序

[復制鏈接]
跳轉到指定樓層
樓主
(1)、手機APP控制,無線藍牙控制
(2)、自動避障,遇到障礙物自動躲避
(3)、帶剎車燈,轉向燈,和倒車蜂鳴器提示
(4)、帶兩個自由度的機械手

制作出來的實物圖如下:


單片機代碼:
#include <reg52.h>

sbit Servo=P0^0;

sbit IN1=P1^2;
sbit IN2=P1^3;
sbit IN3=P1^4;
sbit IN4=P1^5;

sbit LLED=P2^0;
sbit RLED=P2^1;
sbit SLED=P2^4;
sbit BUZZER=P2^5;
sbit PWM1=P2^6;
sbit PWM2=P2^7;

sbit INT_0=P3^2;
sbit INT_1=P3^3;



        #define Left_led       { LLED=0;}          //左轉向燈
        #define Right_led      { RLED=0;}          //右轉向燈
                                #define Stop_led        { SLED=0;}          //剎車燈        

                          #define SLeft_led       { LLED=1;}          //停左轉向燈
        #define SRight_led      { RLED=1;}          //停右轉向燈                                
                                #define SStop_led       { SLED=1;}          //停剎車燈


        #define Left_moto_go      {IN1=0,IN2=1;}        //左邊兩個電機向前走
        #define Left_moto_back    {IN1=1,IN2=0;}        //左邊兩個電機向后轉
        #define Left_moto_Stop    {IN1=0,IN2=0;}        //左邊兩個電機停轉                     
        #define Right_moto_go     {IN3=1,IN4=0;}        //右邊兩個電機向前走
        #define Right_moto_back   {IN3=0,IN4=1;}        //右邊兩個電機向后走
        #define Right_moto_Stop   {IN3=0,IN4=0;}        //右邊兩個電機停轉
        #define SBUZZER            {BUZZER=0;}          //蜂鳴器響
        #define SSBUZZER           {BUZZER=1;}          //蜂鳴器不響


                                #define uchar unsigned char
                                #define unit unsigned int



                bit bdata gbFlag;

  unsigned char  i=0;
        unsigned char  dat;
        unsigned char time1;        
        unsigned char time2;                                       
  char num1=0,dis1=1;
  char num2=0,dis2=1;                                
        void delay(unsigned int z);
  void delay_us(unsigned int aa);



/************************************************************************/        
/*--延時函數--*/
   void delay(unsigned int k)
{   
     unsigned int x,y;
           for(x=0;x<k;x++)
           for(y=0;y<2000;y++);
}

/************************************************************************/
/*--功能定義函數--*/



//剎車
     void  stoprun(void)
{

           Left_moto_Stop ;   //左電機STOP
           Right_moto_Stop ;  //右電機STOP
}
//剎車燈
    void stopled(void)
{

    Stop_led;
          delay(10);
                SStop_led;         
}



//前進
     void  run(void)
{

           Left_moto_go ;   //左電機往前走
           Right_moto_go ;  //右電機往前走               
     delay(20);
     stoprun();

}

//后退
     void  backrun(void)
{

           Left_moto_back ;   //左電機往后退
           Right_moto_back ;  //右電機往后退
           SBUZZER;
           Stop_led;        
           delay(20);
           SSBUZZER;
                 SStop_led;
           stoprun();
}

//左轉
     void  leftrun(void)
{

           Left_moto_back ;   //左電機往后走
           Right_moto_go ;  //右電機往前走
           delay(10);
           stoprun();
}
//左轉向燈
    void leftled(void)
{

          Left_led ; //左轉向燈開
                delay(5);
          SLeft_led;  //左轉向燈關
          delay(5);
}


//右轉
     void  rightrun(void)
{

           Left_moto_go ;   //左電機往前走
           Right_moto_back ;  //右電機往后走
           delay(10);
           stoprun();
}
//右轉向燈
    void   rightled(void)
{

          Right_led ;   //右轉向燈開
          delay(5);
          SRight_led;    //右轉向燈關
          delay(5);
}
/*********************************************************************/                 
/*--scan1函數--*/
void scan1()            //如果收到01,則X舵機加   
{        
        if(gbFlag)      //如果為1,則PWM+
        {
                //num1++;
                if(num1>=60)
                        num1=60;
                else
                        num1++;
                dis1=num1;
                leftled();
        }
        else        //否則PWM-
        {
                //num1--;
                if(num1<=0)
                        num1=0;
                else
                        num1--;
                dis1=num1;
                rightled();
        }
}

/*********************************************************************/                 
/*--scan2函數--*/
//void scan2()
//{
//if(gbFlag)         //如果收到07,則Y舵機加
//        {
//                        num2++;
//                if(num2>=60)
//                        num2=60;
//                        dis2=num2;
//        }
//    else               
//        {          num2--;
//                if(num2<=0)
//                        num2=0;
//                        dis2=num2;                                 
//        }
//}
void scan2()            //如果收到03,則Y舵機加   
{        
        if(gbFlag)       //如果為1,則PWM+
        {
                //num1++;
                if(num2>=60)
                        num2=60;
                else
                        num2++;
                dis2=num2;
                leftled();
        }
        else             //否則PWM-
        {
                //num1--;
                if(num2<=0)
                        num2=0;
                else
                        num2--;
                dis2=num2;
                rightled();
        }
}

/*********************************************************************/                 
/*--choose1函數--*/
void choose1(void)
{

                Servo=0;     //舵機關

}
/*********************************************************************/                 
/*--choose2函數--*/
void choose2(void)
{

                Servo=1;     //舵機開

}

/*********************************************************************/                 
/*--主函數--*/
        void main()
{

          PS=1;       //中斷優先級T0,T2低
                PX0=1;
                PX1=1;
    PT0=0;
          PT2=0;

          TMOD=0x21;       //設置定時器1為方式2,定時器0工作方式1        
                TH0=(65536-50)/256; //0xff;        //(65536-1000)/256;   //賦初值定時
                TL0=(65536-50)%256;  //0xf7;        //(65536-1000)%256;   //0.01ms
          TH1=0xfd;                     //11.0592M晶振,9600波特率
    TL1=0xfd;        //裝初值
                RCAP2H=(65536-50)/256;  //0xff;        //(65536-10)/256;//賦初值定時
                RCAP2L=(65536-50)%256;  //0xf7;        //(65536-10)%256;//0.01ms        
          TH2=RCAP2H;         //
          TL2=RCAP2L;        //賦初值定時


    TR1=1;           //啟動定時器
          REN=1;           //使能接收
    SM0=0;  
    SM1=1;           //設置串口為工作方式1        
          EA=1;            //打開總中斷開關
          ES=1;            //打開串口中斷開關
                ET0=1;           //開定時器0中斷
                ET2=1;           //開定時器2中斷               
                TR0=1;           //啟動定時器0
                TR2=1;           //啟動定時器2               



          EX0=1;          //允許INT0中斷
          EX1=1;          //允許INT1中斷
          IT0=1;          //外中斷0邊沿觸發
          IT1=1;          //外中斷1邊沿觸發
          while(1) ;       //等待中斷

}
/*********************************************************************/                 
/*--返回數據函數--*/
//void putchar (unsigned char c)
//{
//  SBUF=c;
//        while(TI==0);    //等待發送完成
//  TI=0;            //清除TI標志準備下一次發送

//}
//   void main()
//         {
//         init();
//         while(1)
//                {
//           if(R_sign)
//                 {
//                         putchar(dat);  //將接受到的字符發回
//                         R_sign=0;
//                 }

//         }
//                 
//         }
//                 

/*********************************************************************/                 
/*--避障函數--*/
void int0(void)        interrupt 0 using 1      //外中斷0服務子函數
{
  backrun();         //后退
        while(INT_0==0)    //還在障礙物范圍內繼續后退
        backrun();


}         
void int1(void)        interrupt 2 using 1         //外中斷1服務子函數
{

  run();              //后退
        while(INT_1==0)     //還在障礙物范圍內繼續后退
  run();


}
/*********************************************************************/                 
/*--PWM1函數--*/
void timer0()interrupt 1 using 2
        {
    TR0=1;  //打開定時器0
    TH0=(65536-50)/256;   //0xff;        //(65536-1000)/256;//賦初值定時
    TL0=(65536-50)%256;   //0xf7;        //(65536-1000)%256;//0.05ms

                TR0=0;   //關閉定時器0
    TR2=1;   //打開定時器2               
                time1++;
                if(time1>=100)time1=0;//5KHZ
                if(time1<=dis1)PWM1=1;//占空比0~60%
                else PWM1=0;

        }
/*********************************************************************/                 
/*--PWM2函數--*/
void timer2()interrupt 5 using 2
        {

    TR2=1;                      //開定時器2
                TF2=0;                     //中斷時軟清
                RCAP2H=(65536-50)/256;  //0xff;        //(65536-50)/256;//賦初值定時
                RCAP2L=(65536-50)%256;  //0xf7;        //(65536-50)%256;//0.05ms        
          TH2=RCAP2H;         //
          TL2=RCAP2L;        //賦初值定時
                TR2=0;                     //關定時器2
                TR0=1;                     //開定時器0

                time2++;
                if(time2>=100)time2=0;       //5KHZ
                if(time2<=dis2)PWM2=1;      //占空比0~60%
                else PWM2=0;

        }
/*********************************************************************/                 
/*--通訊函數--*/

void ser() interrupt 4 using 3
{
          ES=0;   
    RI=0;       //將接受中斷標志位清零
    dat=SBUF;   // 將接受到的數據賦值給dat   



                switch(dat)
             {
                      case 0x02:                                                 // 前進
                                                choose1();
                                                run();
                                                break;

                      case 0x08:                                                // 后退
                                                choose1();
                              backrun();
                              break;

                      case 0x06:                                                // 左轉
                                                choose1();
                              leftrun();
                                    leftled();        
                              break;

                      case 0x04:                                                // 右轉
                                                choose1();
                              rightrun();
                                    rightled();
                              break;

                      case 0x05:                                                // 功能鍵
                                                gbFlag=~gbFlag;     //狀態取反
            stopled();
                              break;

                                        case 0x01:           //X舵機加(減)
                                                choose2();         //舵機開
                                          scan1();                              
                                                break;

                                        case 0x03:           //Y舵機加(減)
            choose2();           
                                          scan2();                                             
                                                break;



                            default : break;

             }

      ES=1;


}




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:462283 發表于 2019-3-1 17:20 | 只看該作者
好東西
回復

使用道具 舉報

板凳
ID:482955 發表于 2019-3-1 20:42 | 只看該作者
請問硬件電路原理圖方便貼出來嗎?
回復

使用道具 舉報

地板
ID:482955 發表于 2019-3-1 20:43 | 只看該作者
請問原理圖方便貼出來嗎?
回復

使用道具 舉報

5#
ID:382454 發表于 2019-3-1 22:37 來自手機 | 只看該作者
這個挺有戲的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 性天堂网 | 国产九九精品视频 | 国产一区二区欧美 | 亚洲精久 | 久精品久久 | 午夜欧美日韩 | 精品1区| 亚洲 欧美 另类 综合 偷拍 | 精品美女视频在免费观看 | 最新中文字幕一区 | 久久久久久久国产精品视频 | 黑人巨大精品欧美一区二区免费 | 国产精品久久久久久妇女6080 | 午夜影院视频在线观看 | 久久99国产精品久久99果冻传媒 | 欧美理论片在线 | 国内自拍视频在线观看 | 国产精品成人一区 | 一区二区在线不卡 | 一区二区中文 | 亚洲高清视频在线观看 | 婷婷综合久久 | 中文字幕一区在线 | 久久久无码精品亚洲日韩按摩 | 伊色综合久久之综合久久 | 久久国产欧美一区二区三区精品 | 成人av电影在线 | 妞干网视频 | 久久久久综合 | 精品成人佐山爱一区二区 | 日韩和的一区二区 | 久久国产精品亚洲 | 在线视频日韩 | 日韩电影中文字幕在线观看 | 国产欧美一区二区三区在线播放 | 日韩在线 | 日本精品一区二区在线观看 | 亚洲一区中文 | 在线观看特色大片免费网站 | 中文字幕不卡在线观看 | 精品国产一区二区三区久久 |