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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機智能小車紅外遙控選擇功能源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:113539 發表于 2016-4-11 19:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
包含以下功能:1、人工操作(前進、后退、左轉、右轉)
2、超聲波避障(包含距離的顯示)
3、紅外避障
源碼:
/*******************************XB-4WD 智能小車參考程序****************************************
*  平臺:XB-4WD + Keil4 + STC89C52
*  名稱:小車超聲波避障     
*  日期:2014-5-18
*   QQ : 61924336
**********************************************************************************************/

/**********************************************************************************************
**                                 智能小車接線說明
**********************************************************************************************/

/**********************************************************************************************
             電池盒                                        XB-L293D驅動板上的電池輸入端子(藍色)         
***********************************************************************************************
                紅線(+)    -------------------------------    藍色輸入端子(+)
                 黑線(-)    -------------------------------    藍色輸入端子(-)
***********************************************************************************************        

/**********************************************************************************************
  XB-L293D驅動板上的5V電源輸出排針                     XB-1A主板上的+5V電源輸入排針         
***********************************************************************************************
                VCC          -------------------------------       +5V
                 GND          -------------------------------       GND
***********************************************************************************************        

/**********************************************************************************************
    XB-1A主板             XB-L293D驅動板(輸入)           *      XB-L293D驅動板(輸出)           電機
***********************************************************************************************
          P1.0    ---------    IN1                                   *                     OUT1      ---------    左上電機(+)
           P1.1    ---------    IN2                 *             OUT2      ---------    左上電機(-)
***********************************************************************************************                                                                                           *
          P1.2    ---------    IN3                                   *                     OUT3      ---------    左下電機(+)
           P1.3    ---------    IN4                 *             OUT4      ---------    左下電機(-)
***********************************************************************************************
          P1.4    ---------    IN5                                   *                     OUT5      ---------    右上電機(+)
           P1.5    ---------    IN6                 *             OUT6      ---------    右上電機(-)
***********************************************************************************************
          P1.6    ---------    IN7                                   *                     OUT7      ---------    右下電機(+)
           P1.7    ---------    IN8                 *             OUT8      ---------    右下電機(-)
***********************************************************************************************/

/***********************************************************************************************
            舵機模塊                                             XB-1A主板         
************************************************************************************************
                紅色線(電源正)    --------------------------    JPW(+5V)
                 棕色線(電源負)    --------------------------    JPW(GND)
                        橙色線(信號線)    --------------------------    P2.7
************************************************************************************************

/***********************************************************************************************
            超聲波模塊                                             XB-1A主板         
************************************************************************************************
                VCC     --------------------------------------    JPW(+5V)
                 TRIG    --------------------------------------    P2.1
                        ECHO    --------------------------------------    P2.0
                        GND     --------------------------------------    JPW(GND)
************************************************************************************************

        
/***********************************************************************************************
**                                    頭文件
***********************************************************************************************/        
#include<AT89x51.H>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
/**********************************************************************************************
**                                    舵機信號線(橙色)
**********************************************************************************************/
#define Sevro_moto_pwm     P2_7           
/**********************************************************************************************
**                                    超聲波控制線
**********************************************************************************************/
#define  ECHO  P2_5                                                            //超聲波接口定義                P2.1
#define  TRIG  P2_6                                                            //超聲波接口定義                P2.0
#define Left_moto_pwm1          P2_0                     //PWM信號端
#define Left_moto_pwm2          P2_1                     //PWM信號端
#define Right_moto_pwm1          P2_2                     //PWM信號端
#define Right_moto_pwm2          P2_3                     //PWM信號端
#define Left_1_led        P3_4                     //左傳感器      
#define Right_1_led       P3_5                     //右傳感器
/**********************************************************************************************
**                                    蜂鳴器接口定義
**********************************************************************************************/
sbit FM = P3^6;                            //蜂鳴器接口
sbit Speed=P3^7;                                           //控制外部中斷
/******************************************************************
**                       接線定義
******************************************************************/
#define Left_moto_go      {P1_0=1,P1_1=0,P1_2=1,P1_3=0;}    //左邊兩個電機向前走
#define Left_moto_back    {P1_0=0,P1_1=1,P1_2=0,P1_3=1;}         //左邊兩個電機向后轉
#define Left_moto_Stop    {P1_0=0,P1_1=0,P1_2=0,P1_3=0;}    //左邊兩個電機停轉                     
#define Right_moto_go     {P1_4=1,P1_5=0,P1_6=1,P1_7=0;}        //右邊兩個電機向前走
#define Right_moto_back   {P1_4=0,P1_5=1,P1_6=0,P1_7=1;}        //右邊兩個電機向前走
#define Right_moto_Stop   {P1_4=0,P1_5=0,P1_6=0,P1_7=0;}        //右邊兩個電機停轉
/******************************************************************
**                       紅外遙控器的相關定義
******************************************************************/
#define Imax 14000            //此處為晶振為11.0592時的取值,
#define Imin 8000            //如用其它頻率的晶振時,
#define Inum1 1450            //要改變相應的取值。
#define Inum2 700
#define Inum3 3000


/**********************************************************************************************
**                                   變量定義
**********************************************************************************************/   
uchar disbuff[4]          ={ 0,0,0,0,};
uchar posit=0;

uchar pwm_val_steering  = 0;                                //變量定義
uchar push_val_steering =14;                                //舵機歸中,產生約,1.5MS 信號
uchar pwm_val_left  =0;                                    //變量定義
uchar push_val_left =0;                                    //左電機占空比N/20
uchar pwm_val_right =0;
uchar push_val_right=0;                             //右電機占空比N/20
bit Right_moto_stop=1;
bit Left_moto_stop =1;
ulong S=0;
ulong S1=0;
ulong S2=0;
ulong S3=0;
ulong S4=0;
uint  time=0;                                            //時間變量
uint  timer=0;                                                //延時基準變量
uchar timer1=0;                                                //掃描時間變量        
uint num = 3;                                

uchar f=0;
uchar Im[4]={0x00,0x00,0x00,0x00};
uchar show[2]={0,0};
ulong m,Tc;
uchar IrOK;

bit flag;

uint shu[9]={1,2,3,4,5,6, 7,8,9};
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};         //0~9         共陽極數碼管
uchar code chose[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};         //共陰極數碼管


void ultrasonic( void );                        //超聲波避障
void artificial( void );                        //人工操作小車
void control_menu(void );                        //主控菜單


/**********************************************************************************************
**                                    延時函數
**********************************************************************************************/
void delay(unsigned int k)          //延時函數
{   
     unsigned int x,y;
           for(x=0;x<k;x++)
             for(y=0;y<2000;y++);
}
void delayms(uint z)
{
uint x,y;
  for(x=z;x>0;x--)
  for(y=99;y>0;y--);
}
/**********************************************************************************************
**                                    啟動測距信號
**********************************************************************************************/
void  StartModule()                       
{
  TRIG=1;                                       
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  TRIG=0;
}

/******************************************************************
**                       小車前進
******************************************************************/
void  run(void)
{
         push_val_left=8;
         push_val_right=8;
         Left_moto_go ;                        //左電機往前走
         Right_moto_go ;                //右電機往前走
}
/******************************************************************
**                       小車后退
******************************************************************/
void  backrun(void)
{
         push_val_left=8;
         push_val_right=8;
         Left_moto_back ;                //左電機后退
         Right_moto_back ;                //右電機后退   
}
/******************************************************************
**                       小車左轉
******************************************************************/
void  leftrun(void)
{
         push_val_left=8;
         push_val_right=8;
         Right_moto_back ;                //右電機后退
         Left_moto_go ;                  //左電機前進
}
/******************************************************************
**                       小車右轉
******************************************************************/
void  rightrun(void)
{
         push_val_left=8;
         push_val_right=8;
         Right_moto_go;                        //右電機前進
         Left_moto_back ;                //左電機停止
}
/******************************************************************
**                       小車停走
******************************************************************/
void  stoprun(void)
{
         push_val_left=8;
         push_val_right=8;
         Left_moto_Stop
         Right_moto_Stop;   
}
/**********************************************************************************************
**                                    數碼管顯示
**********************************************************************************************/

/**********************************************************************************************
**                                    顯示數據的轉換
**********************************************************************************************/
void display()
{  
        P0=table[disbuff[1]];
        P2_0 = 0;
        delayms(5);
        P2_0 = 1;
        P0=table[disbuff[0]];
        P2_1 = 0;
        delayms(5);
        P2_1 = 1;
        P0=table[disbuff[1]];
        P2_2 = 0;
        delayms(5);
        P2_2 = 1;
        P0=table[disbuff[2]];
        P2_3 = 0;
        delayms(5);
        P2_3 = 1;
}
/**********************************************************************************************
**                                    計算距離
**********************************************************************************************/
void Conut(void)                  
{
        while(!ECHO);                                //當RX為零時等待
        TR0=1;                                                //開啟計數
        while(ECHO);                                //當RX為1計數并等待
        TR0=0;                                                //關閉計數
        time=TH0*256+TL0;                        //讀取脈寬長度
        TH0=0;
        TL0=0;
        S=(time*1.7)/100;                        //算出來是CM
        disbuff[0]=S%1000/100;                //更新顯示        百位
        disbuff[1]=S%1000%100/10;        //更新顯示        十位
        disbuff[2]=S%1000%10 %10;        //更新顯示        個位
}
/**********************************************************************************************
**                                    計算速度
**********************************************************************************************/
void speed(void)                  
{
        TR1=1;
        TH1=0;
        TL1=0;
        flag=0;
        while(flag==0);
        S=TH1*256+TL1;        
        disbuff[0]=S%1000/100;                //更新顯示        百位
        disbuff[1]=S%1000%100/10;        //更新顯示        十位
        disbuff[2]=S%1000%10 %10;        //更新顯示        個位
}
/**********************************************************************************************
**                                    判斷小車該往哪邊走
**********************************************************************************************/
void judge(void)
{        
        if((S2<40)||(S4<40)){         //只要左右各有距離小于,30CM小車后退
                backrun();                           //后退
                timer=0;
                while(timer<=1000);
        }
        if(S2>S4){
                rightrun();                  //車的左邊比車的右邊距離小        右轉        
                timer=0;
                while(timer<=800);
        }else{
                leftrun();                        //車的左邊比車的右邊距離大        左轉
                timer=0;
                while(timer<=800);
        }
}
void judge1(void)
{        
        if((S2>S4)&&(S2 > 40)){
                rightrun();                  //車的左邊比車的右邊距離小        右轉        
                timer=0;
                while(timer<=800);
        }else if((S2<=S4)&&(S4 > 40)){
                leftrun();                        //車的左邊比車的右邊距離大        左轉
                timer=0;
                while(timer<=800);
        }
}


/**********************************************************************************************
**                                    左右超聲波檢測距離
**********************************************************************************************/
void  COMM( void )                       
{
        push_val_steering=5;                  //舵機向右轉90度
        timer=0;
        while(timer<=3500);                         //延時400MS讓舵機轉到其位置                 4000
        StartModule();                                  //啟動超聲波測距
    Conut();                                           //計算距離
        display();                                        //顯示距離
        S2=S;  

        push_val_steering=25;                  //舵機再向左轉180度
        timer=0;
        while(timer<=3500);                         //延時400MS讓舵機轉到其位置
        StartModule();                                  //啟動超聲波測距
    Conut();                                          //計算距離
        display();                                        //顯示距離
        S4=S;         

        push_val_steering=14;                  //舵機歸中
        timer=0;
        while(timer<=3500);                         //延時400MS讓舵機轉到其位置
        StartModule();                                  //啟動超聲波測距
    Conut();                                          //計算距離
        display();                                        //顯示距離
        S1=S;
        judge();
}
/*********************************************************************************************/
/*                    PWM調制電機轉速                                                        */
/*********************************************************************************************/
/*                    舵機電機調速                                                           */
/* 調節steering_engine_left的值改變舵機轉速,占空比                                           */

void pwm_Servomoto(void)
{   
    if(pwm_val_steering<=push_val_steering)
                   Sevro_moto_pwm=1;
        else
            Sevro_moto_pwm=0;
        if(pwm_val_steering>=100)
                pwm_val_steering=0;
}
/******************************************************************
**                       左電機調速
******************************************************************/
void pwm_out_left_moto(void)
{  
        if(Left_moto_stop){
            if(pwm_val_left<=push_val_left){
                        Left_moto_pwm1=1;
                        Left_moto_pwm2=1;
                }else {
                        Left_moto_pwm1=0;
                        Left_moto_pwm2=0;
                }
                if(pwm_val_left>=20)
                    pwm_val_left=0;
        }else{
                Left_moto_pwm1=0;
                Left_moto_pwm2=0;
        }
}
/******************************************************************
**                       右電機調速
******************************************************************/
void pwm_out_right_moto(void)
{
        if(Right_moto_stop){
            if(pwm_val_right<=push_val_right){
                    Right_moto_pwm1=1;
                        Right_moto_pwm2=1;
                }else {
                        Right_moto_pwm1=0;
                        Right_moto_pwm2=0;
                }
                if(pwm_val_right>=20)
                    pwm_val_right=0;
   }else {
       Right_moto_pwm1=0;
           Right_moto_pwm2=0;
   }
}
/**********************************************************************************************
**                              TIMER1中斷服務子函數產生PWM信號                                                                 **
**********************************************************************************************/
/******************************************************************
**                       定時器0初始化
******************************************************************/
void timer0_Init(void)
{
        TMOD=0X01;
        TH0= 0XFc;                  //1ms定時
        TL0= 0X18;
        TR0= 1;
        ET0= 1;
        EA = 1;                           //開總中斷        
}         
/******************************************************************
**                   定時器0中斷服務子程序
******************************************************************/
void timer0()interrupt 1   using 2
{
     TH0=0XFc;         
         TL0=0X18;
         time++;
         pwm_val_left++;
         pwm_val_right++;
         pwm_out_left_moto();
         pwm_out_right_moto();
}
/******************************************************************
**                   定時器1中斷服務子程序
******************************************************************/
void time1()interrupt 3   using 2
{        
     TH1=(65536-100)/256;          //100US定時
         TL1=(65536-100)%256;
         timer++;                                  //定時器100US為準。在這個基礎上延時
         pwm_val_steering++;
         pwm_Servomoto();
         timer1++;                                 //2MS掃一次數碼管
         if(timer1>=20){
                 timer1=0;
         }
}
/******************************************************************
**                       外部中斷解碼程序
******************************************************************/
void intersvr0(void) interrupt 0 using 1
{
        Tc=TH0*256+TL0;     //提取中斷時間間隔時長
    TH0=0;
    TL0=0;              //定時中斷重新置零
         if((Tc>Imin)&&(Tc<Imax)){
        m=0;
        f=1;
        return;
        }       //找到啟始碼
        if(f==1){
                if(Tc>Inum1&&Tc<Inum3) {
                        Im[m/8]=Im[m/8]>>1|0x80; m++;
                }
                if(Tc>Inum2&&Tc<Inum1) {
                        Im[m/8]=Im[m/8]>>1; m++; //取碼
                }
                  if(m==32) {
                        m=0;  
                        f=0;
                        if(Im[2]==~Im[3]) {
                                IrOK=1;
                        }
                else IrOK=0;   //取碼完成后判斷讀碼是否正確
             }                  
   }        //準備讀下一碼
}
/******************************************************************
**                       紅外線避障
******************************************************************/
void Infrared(void)
{
        timer0_Init();     
        while(1){
                if(IrOK==1) {
                                stoprun();
                                switch(Im[2]) {
                                        case 0x16:               
                                                                control_menu();         //返回主控菜單
                                                            break;
                                        default:
                                                                break;
                                }
                                IrOK=0;
                }
                if(Left_1_led==1&&Right_1_led==1)                              //左右邊都檢測不到紅外,燈都是滅的
                          run();                                                //調用前進函數
                else{                          
                        if(Left_1_led==1&&Right_1_led==0){                  //右邊邊檢測到紅外,右邊燈亮
                                leftrun();                                                       //調用小車左轉函數
                        }  
                        if(Right_1_led==1&&Left_1_led==0){                  //左邊檢測到紅外,左邊燈亮         
                                rightrun();                                                           //調用小車右轉函數
                        }
                        if(Right_1_led == 0 && Left_1_led == 0){        //左右檢測到紅外,左右燈亮
                                backrun();                                                                //小車后退
                        }
                }         
        }
}
/**********************************************************************************************
**                              超聲波的避障代碼
**********************************************************************************************/
void ultrasonic( void )
{  IrOK=0;
        TMOD=0X11;
        TH1=(65536-100)/256;          //100US定時
        TL1=(65536-100)%256;
        TR1= 1;ET1= 1;
        ET0= 1;TR0=1;
        m=0;f=0;
    IT0=1;EX0=1;   
    TH0=0;TL0=0;TR0=1;
        EA=1;
        delay(100);
        push_val_steering=14;                  //舵機歸中
        while (1){
                        if(IrOK==1) {
                                stoprun();
                                switch(Im[2]) {
                                        case 0x16:               
                                                                control_menu();                                 //返回主控菜單
                                                            break;
                                        default:
                                                                break;
                                }
                                IrOK=0;
                        }
                if(timer>=200){                  //80MS檢測啟動檢測一次         800
                        timer=0;
                        StartModule();                 //啟動檢測
                        Conut();                        //計算距離
                        display();
                        if(S<=40) {                        //距離小于40CM
                                stoprun();                //小車停止
                                COMM();                 //方向函數
                        } else
                                if(S>40){                //距離大于,40CM往前走
                                        run();
                                }
                }         
        }
}
/**********************************************************************************************
**                              人工操控小車代碼
**********************************************************************************************/
void artificial( void )
{
        m=0;f=0;
    IT0=1;EX0=1;
    TMOD=0x11;  
    TH0=0;TL0=0;
    TR0=1;
        EA=1;        
        delay(100);        
        speed();
        display();
        while(1) {                       /*無限循環*/
                if(IrOK==1) {
                     switch(Im[2]) {
                                case 0x18:         run();                                 //前進
                                                     break;
                                case 0x52:         backrun();                  //后退        
                                                        break;
                                case 0x08:        leftrun();                         //左轉
                                                        break;
                                case 0x5A:        rightrun();                 //右轉
                                                        break;
                                case 0x1C:         stoprun();                        //停止
                                                        break;
                                case 0x16:         stoprun();
                                                        control_menu();                //返回主控菜單
                                                        break;
                                default:
                                                        break;
                        }
                        IrOK=0;
             }
        }   
}
/**********************************************************************************************
**                             小車主控菜單代碼
**********************************************************************************************/
void control_menu(void )
{
        m=0;f=0;
    IT0=1;EX0=1;
    TMOD=0x11;  
    TH0=0;TL0=0;
    TR0=1;
        EA=1;        
        delay(100);         
        while(1){
                if(IrOK==1) {
                     switch(Im[2]) {
                                case 0x18:         push_val_steering=14;                  //舵機歸中
                                                        artificial();                         //人工控制小車
                                                     break;
                                case 0x0C:
                                                        ultrasonic();                        //超聲波避障
                                                        break;
                                case 0x5E:         
                                                        Infrared();                                //紅外線避障
                                                        break;
                                case 0x08:         num = 4;
                                                        ultrasonic();                        //超聲波紅外線避障
                                                        break;
                                default:
                                                        break;
                        }
                        IrOK=0;
                }
        }
}
/**********************************************************************************************
**                                       主函數
**********************************************************************************************/
void main(void)
{
        while(1) {                       /*無限循環*/
                control_menu();                 //調用主控菜單
        }   

}

/**********************************************************************************************
**                                        END FILE
**********************************************************************************************/
        

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:207886 發表于 2017-9-29 17:29 | 只看該作者
有電路圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产露脸国语对白在线 | 国产成人高清 | 美国一级片在线观看 | 成人高清在线 | 黄色在线观看网址 | 午夜免费在线电影 | 狠狠躁天天躁夜夜躁婷婷老牛影视 | 精品在线一区 | 先锋资源网站 | 国产久 | 国产精品久久久久久久免费观看 | 欧美久久久电影 | 亚洲精品久久久久avwww潮水 | 日韩高清中文字幕 | 欧美自拍视频 | 亚洲第一中文字幕 | 狠狠干av | 日韩中文字幕一区二区三区 | 国产综合久久久 | 欧美精品一区免费 | 日韩免费高清视频 | 美女视频黄色的 | 亚洲色欧美另类 | 黑人精品欧美一区二区蜜桃 | 国产精品久久久久久久久久久免费看 | 国产小视频在线 | 成年免费大片黄在线观看一级 | 国产免费一区 | 免费成人av | 一级毛片在线播放 | 一区二区三区中文字幕 | 亚洲一区二区三区在线播放 | 日本一区二区影视 | 亚洲欧洲一区 | 成人三级网址 | 国产成人网 | 精品久久香蕉国产线看观看亚洲 | av二区三区| 免费精品| 免费黄网站在线观看 | 999国产视频 |