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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

帶詳細注釋的單片機步進小車綜合程序與資料

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1.         /****************************************************************************
  2.          簡單尋跡程序:接法
  3.          
  4.      EN1 EN2 PWM輸入端,本程序不輸入PWM,直接使插上跳線帽,使能輸出,這樣就能全速運行

  5.      插入藍牙模塊:
  6.          晶振:11。0592M晶振
  7.          請注意跳線帽切換

  8.      P1_0 P1_1 接IN1  IN2    當 P1_0=1,P1_1=0; 時左上電機正轉        左上電機接驅動板子輸出端(藍色端子OUT1 OUT2)
  9.          P1_0 P1_1 接IN1  IN2    當 P1_0=0,P1_1=1; 時左上電機反轉       

  10.          P1_0 P1_1 接IN1  IN2    當 P1_0=0,P1_1=0; 時左上電機停轉       

  11.          P1_2 P1_3 接IN3  IN4    當 P1_2=1,P1_3=0; 時左下電機正轉        左下電機接驅動板子輸出端(藍色端子OUT3 OUT4)
  12.          P1_2 P1_3 接IN3  IN4    當 P1_2=0,P1_3=1; 時左下電機反轉   

  13.          P1_2 P1_3 接IN3  IN4    當 P1_2=0,P1_3=0; 時左下電機停轉       

  14.          P1_4 P1_5 接IN5  IN6    當 P1_4=1,P1_5=0; 時右上電機正轉        右上電機接驅動板子輸出端(藍色端子OUT5 OUT6)
  15.          P1_4 P1_5 接IN5  IN6    當 P1_4=0,P1_5=1; 時右上電機反轉

  16.          P1_4 P1_5 接IN5  IN6    當 P1_4=0,P1_5=0; 時右上電機停轉

  17.          P1_6 P1_7 接IN7  IN8    當 P1_6=1,P1_7=0; 時右下電機正轉        右下電機接驅動板子輸出端(藍色端子OUT7 OUT8)
  18.          P1_6 P1_7 接IN7  IN8    當 P1_6=0,P1_7=1; 時右下電機反轉

  19.          P1_6 P1_7 接IN7  IN8    當 P1_6=0,P1_7=0; 時右下電機停轉
  20.    

  21.      P3_2接四路尋跡模塊接口第一路輸出信號即中控板上面標記為OUT1
  22.      P3_3接四路尋跡模塊接口第二路輸出信號即中控板上面標記為OUT2       
  23.      P3_4接四路尋跡模塊接口第三路輸出信號即中控板上面標記為OUT3
  24.          P3_5接四路尋跡模塊接口第四路輸出信號即中控板上面標記為OUT4
  25.          四路尋跡傳感器有信號(白線)為0  沒有信號(黑線)為1
  26.          四路尋跡傳感器電源+5V GND 取自于單片機板靠近液晶調節對比度的電源輸出接口

  27.                                                                                                                                                                                          
  28.          關于單片機電源:本店驅動模塊內帶LDO穩壓芯片,當電池輸入6V時時候可以輸出穩定的5V
  29.          分別在針腳標+5 與GND 。這個輸出電源可以作為單片機系統的供電電源。
  30.         ****************************************************************************/
  31.        
  32.        
  33.         #include<AT89x52.H>
  34.     #include <intrins.h>
  35. #define uchar unsigned char
  36. #define uint unsigned int               
  37. uchar step_g[8]={0x88, 0x99, 0x11, 0x33, 0x22, 0x66, 0x44, 0xcc}; //步進電機前進單步脈沖
  38.         uchar step_b[8]={0xcc, 0x44, 0x66, 0x22, 0x33, 0x11, 0x99, 0x88}; //步進電機后退單步脈沖
  39. uchar step_l[8]={0xc8, 0x49, 0x61, 0x23, 0x32, 0x16, 0x94, 0x8c};//步進電機左轉單步脈沖
  40. uchar step_r[8]={0x8c, 0x94, 0x16, 0x32, 0x23, 0x61, 0x49, 0xc8};
  41. //步進電機右轉單步脈沖
  42. uchar step_stop[8]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  43.         #define  ECHO  P2_4                                   //超聲波接口定義
  44.     #define  TRIG  P2_5                                   //超聲波接口定義
  45.         #define Sevro_moto_pwm    P2_7         //接舵機信號端輸入PWM信號調節速度
  46. #define Left_1_led        P3_4         //P3_2接四路尋跡模塊接口第一路輸出信號即中控板上面標記為OUT1
  47.         #define Left_2_led        P3_5         //P3_3接四路尋跡模塊接口第二路輸出信號即中控板上面標記為OUT2       

  48.     #define Right_1_led       P3_6         //P3_4接四路尋跡模塊接口第三路輸出信號即中控板上面標記為OUT3
  49.         #define Right_2_led       P3_7       
  50.         #define left     'C'
  51.     #define right    'D'
  52.         #define up       'A'
  53.     #define down     'B'
  54.         #define stop     'F'
  55.         #define Car      '1'           //手機軟件1號鍵
  56.         #define Car1     '2'           //手機軟件1號鍵



  57.         char code str[] =  "收到指令,向前!\n";
  58.         char code str1[] = "收到指令,向后!\n";
  59.         char code str2[] = "收到指令,向左!\n";
  60.         char code str3[] = "收到指令,向右!\n";
  61.         char code str4[] = "收到指令,停止!\n";



  62.         unsigned char const discode[] ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0xff/*-*/};
  63.         unsigned char const positon[3]={ 0xfe,0xfd,0xfb};
  64.         unsigned char disbuff[4]          ={ 0,0,0,0,};
  65.     unsigned char posit=0;

  66.            unsigned char pwm_val_left  = 0;//變量定義
  67.         unsigned char push_val_left =13;//舵機歸中,產生約,1.5MS 信號
  68.         unsigned int  time=0;                    //時間變量
  69.         unsigned int  timer1=0;                    //時間變量
  70.     unsigned int  timer=0;                        //延時基準變量

  71.         unsigned long S=0;                                //計算出超聲波距離值
  72.     unsigned long S1=0;
  73.         unsigned long S2=0;
  74.         unsigned long S3=0;
  75.         unsigned long S4=0;

  76.         bit  flag_REC=0;                                 //串行接收標去位
  77.         bit  flag    =0;  
  78.         bit  flag_xj =0;
  79.         bit  flag_bj =0;

  80.         unsigned char  i=0;
  81.         unsigned char  dat=0;
  82.     unsigned char  buff[5]=0;       //接收緩沖字節


  83.    
  84. /************************************************************************/       
  85. //延時函數       
  86.    void delay(unsigned int k)
  87. {   
  88.      unsigned int x,y;
  89.          for(x=0;x<k;x++)
  90.            for(y=0;y<2000;y++);
  91. }
  92. /************************************************************************/
  93. //前速前進
  94.      void  run(void)
  95. {
  96.          uchar step_g[8]={0x88, 0x99, 0x11, 0x33, 0x22, 0x66, 0x44, 0xcc};
  97. }

  98. //前速后退
  99.      void  backrun(void)
  100. {
  101.    
  102.          uchar step_b[8]={0xcc, 0x44, 0x66, 0x22, 0x33, 0x11, 0x99, 0x88};
  103. }

  104. //左轉
  105.      void  leftrun(void)
  106. {
  107.    
  108.         uchar step_l[8]={0xc8, 0x49, 0x61, 0x23, 0x32, 0x16, 0x94, 0x8c};
  109. }

  110. //右轉
  111.      void  rightrun(void)
  112. {
  113.   uchar step_r[8]={0x8c, 0x94, 0x16, 0x32, 0x23, 0x61, 0x49, 0xc8};  

  114. }
  115. //STOP
  116.      void  stoprun(void)
  117. {
  118. uchar step_stop[8]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  119. }
  120. /************************************************************************/
  121.      void  StartModule()                       //啟動測距信號
  122.    {
  123.           TRIG=1;                                        
  124.           _nop_();
  125.           _nop_();
  126.           _nop_();
  127.           _nop_();
  128.           _nop_();
  129.           _nop_();
  130.           _nop_();
  131.           _nop_();
  132.           _nop_();
  133.           _nop_();
  134.           _nop_();
  135.           _nop_();
  136.           _nop_();
  137.           _nop_();
  138.           _nop_();
  139.           _nop_();
  140.           _nop_();
  141.           _nop_();
  142.           _nop_();
  143.           _nop_();
  144.           _nop_();
  145.           TRIG=0;
  146.    }
  147. /***************************************************/
  148.           void Conut(void)                   //計算距離
  149.         {
  150.           while(!ECHO);                       //當RX為零時等待
  151.           TR0=1;                               //開啟計數
  152.           while(ECHO);                           //當RX為1計數并等待
  153.           TR0=0;                                   //關閉計數
  154.           time=TH0*256+TL0;                   //讀取脈寬長度
  155.           TH0=0;
  156.           TL0=0;
  157.           S=(time*1.7)/100;        //算出來是CM
  158.           disbuff[0]=S%1000/100;   //更新顯示
  159.           disbuff[1]=S%1000%100/10;
  160.           disbuff[2]=S%1000%10 %10;
  161.         }
  162. /************************************************************************/
  163. //字符串發送函數
  164.           void send_str( )
  165.                    // 傳送字串
  166.     {
  167.             unsigned char i = 0;
  168.             while(str[i] != '\0')
  169.            {
  170.                 SBUF = str[i];
  171.                 while(!TI);                                // 等特數據傳送
  172.                 TI = 0;                                        // 清除數據傳送標志
  173.                 i++;                                        // 下一個字符
  174.            }       
  175.     }
  176.        
  177.                   void send_str1( )
  178.                    // 傳送字串
  179.     {
  180.             unsigned char i = 0;
  181.             while(str1[i] != '\0')
  182.            {
  183.                 SBUF = str1[i];
  184.                 while(!TI);                                // 等特數據傳送
  185.                 TI = 0;                                        // 清除數據傳送標志
  186.                 i++;                                        // 下一個字符
  187.            }       
  188.     }       

  189.                           void send_str2( )
  190.                    // 傳送字串
  191.     {
  192.             unsigned char i = 0;
  193.             while(str2[i] != '\0')
  194.            {
  195.                 SBUF = str2[i];
  196.                 while(!TI);                                // 等特數據傳送
  197.                 TI = 0;                                        // 清除數據傳送標志
  198.                 i++;                                        // 下一個字符
  199.            }       
  200.     }       
  201.                    
  202.                           void send_str3()
  203.                    // 傳送字串
  204.     {
  205.             unsigned char i = 0;
  206.             while(str3[i] != '\0')
  207.            {
  208.                 SBUF = str3[i];
  209.                 while(!TI);                                // 等特數據傳送
  210.                 TI = 0;                                        // 清除數據傳送標志
  211.                 i++;                                        // 下一個字符
  212.            }       
  213.     }       

  214.               void send_str4()
  215.                    // 傳送字串
  216.     {
  217.             unsigned char i = 0;
  218.             while(str4[i] != '\0')
  219.            {
  220.                 SBUF = str4[i];
  221.                 while(!TI);                                // 等特數據傳送
  222.                 TI = 0;                                        // 清除數據傳送標志
  223.                 i++;                                        // 下一個字符
  224.            }       
  225.     }       
  226.                    
  227. /************************************************************************/
  228.     void Display(void)                                  //掃描數碼管
  229.         {
  230.          if(posit==0)
  231.          {P0=(discode[disbuff[posit]])&0x7f;}//產生點
  232.          else
  233.          {P0=discode[disbuff[posit]];}

  234.           if(posit==0)
  235.          { P2_1=0;P2_2=1;P2_3=1;}
  236.           if(posit==1)
  237.           {P2_1=1;P2_2=0;P2_3=1;}
  238.           if(posit==2)
  239.           {P2_1=1;P2_2=1;P2_3=0;}
  240.           if(++posit>=3)
  241.           posit=0;
  242.         }

  243. void  COMM( void )                      
  244.   {
  245.                   push_val_left=5;          //舵機向左轉90度
  246.                   timer=0;
  247.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  248.                   StartModule();          //啟動超聲波測距
  249.           Conut();                           //計算距離
  250.                   S2=S;  
  251.   
  252.                   push_val_left=23;          //舵機向右轉90度
  253.                   timer=0;
  254.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  255.                   StartModule();          //啟動超聲波測距
  256.           Conut();                          //計算距離
  257.                   S4=S;        
  258.        

  259.                   push_val_left=13;          //舵機歸中
  260.                   timer=0;
  261.                   while(timer<=4000); //延時400MS讓舵機轉到其位置
  262.                   StartModule();          //啟動超聲波測距
  263.           Conut();                          //計算距離
  264.                   S1=S;        

  265.           if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
  266.                   {
  267.                   backrun();                   //后退
  268.                   timer=0;
  269.                   while(timer<=4000);
  270.                   }
  271.                   
  272.                   if(S2>S4)                 
  273.                      {
  274.                                 rightrun();          //車的左邊比車的右邊距離小        右轉       
  275.                         timer=0;
  276.                         while(timer<=4000);
  277.                      }                                     
  278.                        else
  279.                      {
  280.                        leftrun();                //車的左邊比車的右邊距離大        左轉
  281.                        timer=0;
  282.                        while(timer<=4000);
  283.                      }
  284.                                             
  285. }
  286. /************************************************************************/
  287. /*                    PWM調制舵機信號                                 */
  288. /************************************************************************/
  289. /*                    左電機調速                                        */
  290. /*調節push_val_left的值改變電機轉速,占空比            */
  291.                 void pwm_Servomoto(void)
  292. {  

  293.     if(pwm_val_left<=push_val_left)
  294.                Sevro_moto_pwm=1;
  295.         else
  296.                Sevro_moto_pwm=0;
  297.         if(pwm_val_left>=200)
  298.         pwm_val_left=0;

  299. }
  300. /***************************************************/
  301. ///*TIMER1中斷服務子函數產生PWM信號*/
  302.         void time1()interrupt 3   using 2
  303. {       
  304.      TH1=(65536-100)/256;          //100US定時
  305.          TL1=(65536-100)%256;
  306.          timer++;                                  //定時器100US為準。在這個基礎上延時
  307.          pwm_val_left++;
  308.          pwm_Servomoto();

  309.          timer1++;                                 //2MS掃一次數碼管
  310.          if(timer1>=20)
  311.          {
  312.          timer1=0;
  313.          Display();       
  314.          }
  315. }

  316. /************************************************************************/
  317. void sint() interrupt 4          //中斷接收3個字節
  318. {

  319.     if(RI)                         //是否接收中斷
  320.     {
  321.        RI=0;
  322.        dat=SBUF;
  323.        if(dat=='O'&&(i==0)) //接收數據第一幀
  324.          {
  325.             buff[i]=dat;
  326.             flag=1;        //開始接收數據
  327.          }
  328.        else
  329.       if(flag==1)
  330.      {
  331.       i++;
  332.       buff[i]=dat;
  333.       if(i>=2)
  334.       {i=0;flag=0;flag_REC=1 ;}  // 停止接收
  335.      }
  336.          }
  337. }
  338. /*********************************************************************/                 
  339. /*--主函數--*/
  340.         void main(void)
  341. {
  342.         TMOD=0x11;  
  343.     TH1=(65536-100)/256;          //100US定時
  344.         TL1=(65536-100)%256;
  345.         TH0=0;
  346.         TL0=0;

  347.     T2CON=0x34;
  348.         T2MOD=0x00;
  349.         RCAP2H=0xFF;
  350.         RCAP2L=0xDC;
  351.     SCON=0x50;  
  352.     PCON=0x00;

  353.     PS=1;



  354.     TR1=1;
  355.         ET1=1;
  356.         ES=1;
  357.     EA=1;  
  358.        
  359.         delay(100);
  360.     push_val_left=13;          //舵機歸中
  361.          
  362.         while(1)                                                        /*無限循環*/
  363.         {
  364.        
  365.          
  366.                          
  367.                   while(flag_xj)                           //循線標志位
  368.                   {
  369.                                if(flag_REC==1)
  370.                                  {
  371.                                   stoprun();
  372.                                   break;
  373.                                  }
  374.                     
  375.                                  if(Left_2_led==0&&Right_1_led==0)
  376.                           run();

  377.                           else
  378.                          {                            
  379.                             if(Right_1_led==1&&Left_2_led==0)                //右邊檢測到黑線
  380.                                   {          
  381.                               uchar step_l[8]={0xc8, 0x49, 0x61, 0x23, 0x32, 0x16, 0x94, 0x8c};                                     //右邊兩個電機反轉
  382.                                   }
  383.                                
  384.                                 if(Left_2_led==1&&Right_1_led==0)            //左邊檢測到黑線
  385.                                   {
  386.                                     uchar step_r[8]={0x8c, 0x94, 0x16, 0x32, 0x23, 0x61, 0x49, 0xc8};        ;               
  387.                              }
  388.                           }

  389.                   }


  390.                          while(flag_bj)                       /*無限循環*/
  391.            {
  392.        
  393.                if(timer>=1000)          //100MS檢測啟動檢測一次
  394.              {
  395.                timer=0;
  396.                    StartModule(); //啟動檢測
  397.            Conut();                  //計算距離
  398.            if(S<20)                  //距離小于20CM
  399.                    {
  400.                    stoprun();          //小車停止
  401.                    COMM();                   //方向函數
  402.                    }
  403.                    else
  404.                    if(S>30)                  //距離大于,30CM往前走
  405.                    run();
  406.              }

  407.                          if(flag_REC==1)
  408.                         {
  409.                           push_val_left=13;          //舵機歸中
  410.                           stoprun();
  411.                           break;
  412.                         }
  413.           }

  414.                



  415.           if(flag_REC==1)                                    //
  416.            {
  417.                 flag_REC=0;
  418.                 if(buff[0]=='O'&&buff[1]=='N')        //第一個字節為O,第二個字節為N,第三個字節為控制碼
  419.                 switch(buff[2])
  420.              {
  421.                       case up :                                                    // 前進
  422.                           send_str( );
  423.                           flag_xj=0;
  424.                           flag_bj=0;
  425.                           run();
  426.                           break;

  427.                       case down:                                                // 后退
  428.                           send_str1( );
  429.                           flag_xj=0;
  430.                           flag_bj=0;
  431.                           backrun();
  432.                           break;

  433.                       case left:                                                // 左轉
  434.                           send_str2( );
  435.                           flag_xj=0;
  436.                           flag_bj=0;
  437.                           leftrun();
  438.                           break;

  439.                       case right:                                                // 右轉
  440.                           send_str3( );
  441.                           flag_xj=0;
  442.                           flag_bj=0;
  443.                           rightrun();
  444.                           break;

  445.                       case stop:                                                // 停止
  446.                           send_str4( );
  447.                           flag_xj=0;
  448.                           flag_bj=0;
  449.                           stoprun();
  450.                           break;

  451.                           case Car :                                                //                
  452.                           flag_xj=1;
  453.                           break;

  454.                           case Car1 :                                                //                
  455.                           flag_bj=1;
  456.                           break;
  457.              }
  458.       
  459.                                          
  460.          }
  461.         }
  462. }                                  
  463.        
復制代碼

所有資料51hei提供下載:
APP整合綜合程序,步進小車.zip (90.38 KB, 下載次數: 11)
單獨功能的步進小車接線圖.pdf (52.59 KB, 下載次數: 10)



評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲1区| 亚洲成人精品在线观看 | 欧美成人一区二区 | 日韩欧美在线播放 | 亚洲男女视频在线观看 | 国产91在线观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 日韩www| 激情 亚洲 | 日韩一区二区在线视频 | 国产精品一区二区三区在线 | 丝袜美腿一区二区三区 | 视频在线一区二区 | 亚洲激情视频在线 | 日本欧美视频 | 一级片网址| h在线免费观看 | 日韩一级免费电影 | 91高清在线观看 | 午夜专区| 国产欧美日韩综合精品一区二区 | 免费在线看黄 | 成人精品国产一区二区4080 | 日韩精品一区二区三区在线 | 欧美视频成人 | 午夜视频一区二区 | 欧美一区二区免费视频 | 国产一区中文 | 九九亚洲 | 美女露尿口视频 | 精品欧美激情在线观看 | 一区二区在线免费观看 | 国外成人在线视频网站 | 成人亚洲 | 高清国产午夜精品久久久久久 | 97超碰成人 | 欧美精品一二三 | 欧美一级欧美一级在线播放 | 久久99精品久久久久久 | 91观看| 亚洲视频三区 |