找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3945|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

單片機超聲波智能小車程序里這一大串_nop_();什么意思?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:494908 發(fā)表于 2019-3-22 19:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
         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;
   }
這個nop_是什么意思??

51單片機超聲波智能小車程序:
  1.         #include<AT89x51.H>
  2.         #include <intrins.h>

  3.         #define Sevro_moto_pwm     P2_0  //接舵機信號端輸入PWM信號調(diào)節(jié)速度
  4.         sbit led1    =P2^4;
  5.     sbit led2    =P2^5;
  6.     sbit led3    =P2^6;
  7.     sbit led4    =P2^7;
  8.         #define  ECHO  P1_1                                   //超聲波接口定義
  9.         #define  TRIG  P1_2                           //超聲波接口定義
  10.           bit      flag =0;
  11.         #define moto_go      {P3_0=1,P3_1=0,P3_2=1,P3_3=0;}    //左邊兩個電機向前走
  12.         #define moto_back    {P3_0=0,P3_1=1,P3_2=0,P3_3=1;}         //左邊兩個電機向后轉(zhuǎn)
  13.         #define moto_Stop    {P3_0=0,P3_1=0,P3_2=0,P3_3=0;}    //左邊兩個電機停轉(zhuǎn)                     
  14.         #define moto_R       {P3_0=1,P3_1=0,P3_2=0,P3_3=1;}        //右邊兩個電機向前走
  15.         #define moto_L       {P3_0=0,P3_1=1,P3_2=1,P3_3=0;}        //右邊兩個電機向前走




  16.         unsigned char const discode[] ={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0x03,0x9F,0x25,0x0D

  17.                                     }; //0,1,2,3,4....F,0,1,2,3的段碼

  18.                
  19.     unsigned char LedBuff[4]={        0xFF, 0xFF, 0x03, 0x03        };

  20.     unsigned char posit=0;

  21.            unsigned char pwm_val_left  = 0;//變量定義
  22.         unsigned char push_val_left =14;//舵機歸中,產(chǎn)生約,1.5MS 信號
  23.     unsigned long S=0;
  24.         unsigned long S1=0;
  25.         unsigned long S2=0;
  26.         unsigned long S3=0;
  27.         unsigned long S4=0;
  28.         unsigned int  time=0;                    //時間變量
  29.         unsigned int  timer=0;                        //延時基準(zhǔn)變量
  30.         unsigned char timer1=0;                        //掃描時間變量                                       
  31. /************************************************************************/
  32.                 void delay(unsigned int k)          //延時函數(shù)
  33. {   
  34.      unsigned int x,y;
  35.            for(x=0;x<k;x++)
  36.              for(y=0;y<2000;y++);
  37. }
  38. /************************************************************************/
  39.     void Display(void)                                  //掃描數(shù)碼管
  40.         {
  41.         static unsigned char i = 0;

  42.         P0 = 0xFF;
  43.         switch(i)
  44.         {
  45.                 case 0: led1 = 0; led4 = 1; i++; P0=LedBuff[0];break;
  46.                 case 1: led2 = 0; led1 = 1; i++; P0=LedBuff[1];break;
  47.                 case 2: led3 = 0; led2 = 1; i++; P0=LedBuff[2];break;
  48.                 case 3: led4 = 0; led3 = 1; i = 0; P0=LedBuff[3];break;
  49.                 default:break;
  50.         }
  51.         }
  52. /************************************************************************/
  53.      void  StartModule()                       //啟動測距信號
  54.    {
  55.           TRIG=1;
  56.           _nop_();
  57.           _nop_();
  58.           _nop_();
  59.           _nop_();
  60.           _nop_();
  61.           _nop_();
  62.           _nop_();
  63.           _nop_();
  64.           _nop_();
  65.           _nop_();
  66.           _nop_();
  67.           _nop_();
  68.           _nop_();
  69.           _nop_();
  70.           _nop_();
  71.           _nop_();
  72.           _nop_();
  73.           _nop_();
  74.           _nop_();
  75.           _nop_();
  76.           _nop_();
  77.           TRIG=0;
  78.    }
  79. /***************************************************/
  80.           void Conut(void)                   //計算距離
  81.         {
  82.           while(!ECHO);                       //當(dāng)RX為零時等待
  83.           TR0=1;                               //開啟計數(shù)
  84.           while(ECHO);                           //當(dāng)RX為1計數(shù)并等待
  85.           TR0=0;                                   //關(guān)閉計數(shù)
  86.           time=TH0*256+TL0;                   //讀取脈寬長度
  87.           TH0=0;
  88.           TL0=0;
  89.           S=(time*1.7)/100;     //算出來是CM
  90.         if((S>=700)||flag==1) //超出測量范圍顯示“F”
  91.          {
  92.            flag=0;
  93.            S=0;
  94.            LedBuff[3] = discode[15];
  95.            LedBuff[2] = discode[15];
  96.            LedBuff[1] = discode[15];
  97.          
  98.          }
  99.          else
  100.          {                        
  101.            LedBuff[3] = discode[S%10];
  102.            LedBuff[2] = discode[S/10%10];
  103.            LedBuff[1] = discode[S/100%10];

  104.          }
  105.         }
  106. /************************************************************************/
  107. //前速前進
  108.      void  run(void)
  109. {                                 
  110.          moto_go ;     //左電機往前走
  111.       
  112. }
  113. /************************************************************************/
  114. //前速后退
  115.      void  backrun(void)
  116. {
  117.          moto_back ;   
  118.       
  119. }
  120. /************************************************************************/
  121. //左轉(zhuǎn)
  122.      void  leftrun(void)
  123. {
  124.          moto_L ;   

  125. }
  126. /************************************************************************/
  127. //右轉(zhuǎn)
  128.      void  rightrun(void)
  129. {
  130.          moto_R ;     
  131.       
  132. }
  133. /************************************************************************/
  134. //STOP
  135.      void  stoprun(void)
  136. {
  137.          moto_Stop ;   

  138. }
  139. /************************************************************************/
  140. void  COMM( void )                     
  141.   {
  142.                
  143.                  
  144.                   push_val_left=7;          //舵機向左轉(zhuǎn)90度
  145.                   timer=0;
  146.                   while(timer<=4000); //延時400MS讓舵機轉(zhuǎn)到其位置
  147.                   StartModule();          //啟動超聲波測距
  148.           Conut();                           //計算距離
  149.                   S2=S;  

  150.                   push_val_left=17;          //舵機向右轉(zhuǎn)90度
  151.                   timer=0;
  152.                   while(timer<=4000); //延時400MS讓舵機轉(zhuǎn)到其位置
  153.                   StartModule();          //啟動超聲波測距
  154.           Conut();                          //計算距離
  155.                   S4=S;        
  156.       

  157.                   push_val_left=12;          //舵機歸中
  158.                   timer=0;
  159.                   while(timer<=4000); //延時400MS讓舵機轉(zhuǎn)到其位置

  160.                   StartModule();          //啟動超聲波測距
  161.           Conut();                          //計算距離
  162.                   S1=S;        

  163.            if((S2>25)&&(S4>25)&&(S1>60)) //只要左右各有距離小于,20CM小車后退
  164.                   {
  165.                 goto  AA;                 
  166.                             }
  167.                                                    
  168.                   if((S2<20)||(S4<20)) //只要左右各有距離小于,20CM小車后退
  169.                   {
  170.                   backrun();                   //后退
  171.                   timer=0;
  172.                   while(timer<=2000);
  173.                     stoprun();
  174.                         timer=0;
  175.                   while(timer<=1000);


  176.                           if(S2>S4)                 
  177.                      {
  178.                                 rightrun();          //車的左邊比車的右邊距離小        右轉(zhuǎn)      
  179.                         timer=0;
  180.                         while(timer<=1000);
  181.                      }                                    
  182.                        else
  183.                      {
  184.                        leftrun();                //車的左邊比車的右邊距離大        左轉(zhuǎn)
  185.                        timer=0;
  186.                        while(timer<=1000);
  187.                      }
  188.                   }
  189.                     else
  190.                         {
  191.                   if(S2>S4)                 
  192.                      {
  193.                                 rightrun();          //車的左邊比車的右邊距離小        右轉(zhuǎn)      
  194.                         timer=0;
  195.                         while(timer<=1600);
  196.                      }                                    
  197.                        else
  198.                      {
  199.                        leftrun();                //車的左邊比車的右邊距離大        左轉(zhuǎn)
  200.                        timer=0;
  201.                        while(timer<=1600);
  202.                      }
  203.                                             

  204. }      

  205.    AA:  run();

  206.         }

  207. /************************************************************************/
  208. /*                    PWM調(diào)制電機轉(zhuǎn)速                                   */
  209. /************************************************************************/
  210. /*                    左電機調(diào)速                                        */
  211. /*調(diào)節(jié)push_val_left的值改變電機轉(zhuǎn)速,占空比            */
  212. void pwm_Servomoto(void)
  213. {  
  214.     pwm_val_left++;
  215.     if(pwm_val_left<=push_val_left)
  216.                Sevro_moto_pwm=1;
  217.         else
  218.                Sevro_moto_pwm=0;
  219.         if(pwm_val_left>=200)
  220.         pwm_val_left=0;

  221. }
  222. /***************************************************/
  223. ///*TIMER1中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/
  224.         void time1()interrupt 3            using 2
  225. {      
  226.      TH1=(65536-100)/256;          //0.1MS定時
  227.          TL1=(65536-100)%256;
  228.          timer++;                                  //定時器0.1MS為準(zhǔn)。在這個基礎(chǔ)上延時
  229.          pwm_Servomoto();
  230.          timer1++;                                 //2MS掃一次數(shù)碼管
  231.          if(timer1>=20)
  232.          {
  233.          timer1=0;
  234.          Display();      
  235.          }         
  236.          
  237. }
  238. /***************************************************/
  239. ///*TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM信號*/
  240.         void timer0()interrupt 1             using 0
  241. {      
  242.    flag=1;      
  243.    StartModule();
  244. }

  245. /***************************************************/

  246.         void main(void)
  247. {

  248.         TMOD=0X11;
  249.         TH1=(65536-100)/256;          //100US定時
  250.         TL1=(65536-100)%256;
  251.         TH0=0;
  252.         TL0=0;  
  253.         TR1= 1;
  254.         ET1= 1;
  255.         ET0= 1;
  256.         EA = 1;

  257.         delay(100);
  258.     push_val_left=14;          //舵機歸中


  259.         while(1)                       /*無限循環(huán)*/
  260.         {

  261.          if(timer>=1000)          //100MS檢測啟動檢測一次
  262.            {
  263.                timer=0;
  264.                    StartModule(); //啟動檢測
  265.            Conut();                  //計算距離
  266.            if(S<30)                  //距離小于20CM
  267.                    {
  268.                    StartModule(); //啟動檢測
  269.            Conut();                  //計算距離
  270.            if(S<30)                  //距離小于20CM
  271.                         {
  272.                    stoprun();          //小車停止
  273.                    COMM();                   //方向函數(shù)
  274.                    }
  275.                    }
  276.                    else
  277.                    if(S>40)                  //距離大于,30CM往前走
  278.                    run();
  279.            }

  280.         }
  281. }
  282.    
復(fù)制代碼


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

使用道具 舉報

沙發(fā)
ID:234075 發(fā)表于 2019-3-23 01:11 | 只看該作者
_nop_();是一個空語句子函數(shù),包含在"intrins.h"頭文件中(如果使用這個子函數(shù),則必須在前面使用“#include"intrins.h"對頭文件進行聲明”);
常用于延時,在C51中,如果晶振主頻=12MHZ,運行一次_nop_();相當(dāng)于1us的延時;
回復(fù)

使用道具 舉報

板凳
ID:164602 發(fā)表于 2019-3-23 14:11 | 只看該作者
HC-HR04超聲波測距模塊的使用手冊上說:

所以,發(fā)波時就要讓控制口保持10us以上的高電平,你的程序多了幾個us,也是沒問題的。
這個_nop_()函數(shù),就叫空指令,即什么事兒都不干,相當(dāng)于延時了。
它延時的時間,就是一個同期,對51單片機、12M晶振而,一個_nop_()函數(shù),正好一個us。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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