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

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

QQ登錄

只需一步,快速開始

搜索
查看: 3876|回復(fù): 2
收起左側(cè)

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

[復(fù)制鏈接]
ID:494908 發(fā)表于 2019-3-22 19:49 | 顯示全部樓層 |閱讀模式
         void  StartModule()                       //啟動(dòng)測距信號(hào)
   {
          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;
   }
這個(gè)nop_是什么意思??

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

  3.         #define Sevro_moto_pwm     P2_0  //接舵機(jī)信號(hào)端輸入PWM信號(hào)調(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;}    //左邊兩個(gè)電機(jī)向前走
  12.         #define moto_back    {P3_0=0,P3_1=1,P3_2=0,P3_3=1;}         //左邊兩個(gè)電機(jī)向后轉(zhuǎn)
  13.         #define moto_Stop    {P3_0=0,P3_1=0,P3_2=0,P3_3=0;}    //左邊兩個(gè)電機(jī)停轉(zhuǎn)                     
  14.         #define moto_R       {P3_0=1,P3_1=0,P3_2=0,P3_3=1;}        //右邊兩個(gè)電機(jī)向前走
  15.         #define moto_L       {P3_0=0,P3_1=1,P3_2=1,P3_3=0;}        //右邊兩個(gè)電機(jī)向前走




  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;//舵機(jī)歸中,產(chǎn)生約,1.5MS 信號(hào)
  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;                    //時(shí)間變量
  29.         unsigned int  timer=0;                        //延時(shí)基準(zhǔn)變量
  30.         unsigned char timer1=0;                        //掃描時(shí)間變量                                       
  31. /************************************************************************/
  32.                 void delay(unsigned int k)          //延時(shí)函數(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()                       //啟動(dòng)測距信號(hào)
  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)                   //計(jì)算距離
  81.         {
  82.           while(!ECHO);                       //當(dāng)RX為零時(shí)等待
  83.           TR0=1;                               //開啟計(jì)數(shù)
  84.           while(ECHO);                           //當(dāng)RX為1計(jì)數(shù)并等待
  85.           TR0=0;                                   //關(guān)閉計(jì)數(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. //前速前進(jìn)
  108.      void  run(void)
  109. {                                 
  110.          moto_go ;     //左電機(jī)往前走
  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;          //舵機(jī)向左轉(zhuǎn)90度
  145.                   timer=0;
  146.                   while(timer<=4000); //延時(shí)400MS讓舵機(jī)轉(zhuǎn)到其位置
  147.                   StartModule();          //啟動(dòng)超聲波測距
  148.           Conut();                           //計(jì)算距離
  149.                   S2=S;  

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

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

  160.                   StartModule();          //啟動(dòng)超聲波測距
  161.           Conut();                          //計(jì)算距離
  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)制電機(jī)轉(zhuǎn)速                                   */
  209. /************************************************************************/
  210. /*                    左電機(jī)調(diào)速                                        */
  211. /*調(diào)節(jié)push_val_left的值改變電機(jī)轉(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信號(hào)*/
  224.         void time1()interrupt 3            using 2
  225. {      
  226.      TH1=(65536-100)/256;          //0.1MS定時(shí)
  227.          TL1=(65536-100)%256;
  228.          timer++;                                  //定時(shí)器0.1MS為準(zhǔn)。在這個(gè)基礎(chǔ)上延時(shí)
  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信號(hào)*/
  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定時(shí)
  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;          //舵機(jī)歸中


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

  261.          if(timer>=1000)          //100MS檢測啟動(dòng)檢測一次
  262.            {
  263.                timer=0;
  264.                    StartModule(); //啟動(dòng)檢測
  265.            Conut();                  //計(jì)算距離
  266.            if(S<30)                  //距離小于20CM
  267.                    {
  268.                    StartModule(); //啟動(dòng)檢測
  269.            Conut();                  //計(jì)算距離
  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ù)制代碼


回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

ID:164602 發(fā)表于 2019-3-23 14:11 | 顯示全部樓層
HC-HR04超聲波測距模塊的使用手冊(cè)上說: 1.jpg

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: h视频免费观看 | 一二三四av | 久久99精品久久久久久 | 国产色爽 | 国产一区二区毛片 | 久久国产免费看 | 久草院线 | 欧美黑人激情 | 天天天操操操 | 嫩草研究影院 | 国产999精品久久久久久 | 欧美日韩一区二区在线观看 | 91视频一区 | 日韩视频在线一区 | 九九热精品在线 | 国产精品成人国产乱 | 国产韩国精品一区二区三区 | 手机av在线 | 日韩一区二区三区四区五区六区 | 欧美九九 | 欧美三级网站 | 91精品国产91久久久久久 | 日韩av电影院 | 免费的日批视频 | 久久aⅴ乱码一区二区三区 91综合网 | 国产在线激情视频 | 亚洲一区二区三区在线免费观看 | 国产高清精品一区二区三区 | 欧美久久精品一级c片 | 99精品国产一区二区青青牛奶 | 国产九九九九 | 91香蕉| 国产精品一区在线观看 | 成人深夜福利在线观看 | 国内av在线 | 久久精品日产第一区二区三区 | 懂色tv| 在线免费亚洲视频 | 四虎影 | 亚洲在线电影 | 99这里只有精品视频 |