找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3265|回复: 2
收起左侧

单片机超声波智能小车程序里这一大串_nop_();什么意思?

[复制链接]
ID:494908 发表于 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信号调节速度
  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;}         //左边两个电机向后转
  13.         #define moto_Stop    {P3_0=0,P3_1=0,P3_2=0,P3_3=0;}    //左边两个电机停转                     
  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;//舵机归中,产生约,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;                        //延时基准变量
  30.         unsigned char timer1=0;                        //扫描时间变量                                       
  31. /************************************************************************/
  32.                 void delay(unsigned int k)          //延时函数
  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)                                  //扫描数码管
  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);                       //当RX为零时等待
  83.           TR0=1;                               //开启计数
  84.           while(ECHO);                           //当RX为1计数并等待
  85.           TR0=0;                                   //关闭计数
  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. //左转
  122.      void  leftrun(void)
  123. {
  124.          moto_L ;   

  125. }
  126. /************************************************************************/
  127. //右转
  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;          //舵机向左转90度
  145.                   timer=0;
  146.                   while(timer<=4000); //延时400MS让舵机转到其位置
  147.                   StartModule();          //启动超声波测距
  148.           Conut();                           //计算距离
  149.                   S2=S;  

  150.                   push_val_left=17;          //舵机向右转90度
  151.                   timer=0;
  152.                   while(timer<=4000); //延时400MS让舵机转到其位置
  153.                   StartModule();          //启动超声波测距
  154.           Conut();                          //计算距离
  155.                   S4=S;        
  156.       

  157.                   push_val_left=12;          //舵机归中
  158.                   timer=0;
  159.                   while(timer<=4000); //延时400MS让舵机转到其位置

  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();          //车的左边比车的右边距离小        右转      
  179.                         timer=0;
  180.                         while(timer<=1000);
  181.                      }                                    
  182.                        else
  183.                      {
  184.                        leftrun();                //车的左边比车的右边距离大        左转
  185.                        timer=0;
  186.                        while(timer<=1000);
  187.                      }
  188.                   }
  189.                     else
  190.                         {
  191.                   if(S2>S4)                 
  192.                      {
  193.                                 rightrun();          //车的左边比车的右边距离小        右转      
  194.                         timer=0;
  195.                         while(timer<=1600);
  196.                      }                                    
  197.                        else
  198.                      {
  199.                        leftrun();                //车的左边比车的右边距离大        左转
  200.                        timer=0;
  201.                        while(timer<=1600);
  202.                      }
  203.                                             

  204. }      

  205.    AA:  run();

  206.         }

  207. /************************************************************************/
  208. /*                    PWM调制电机转速                                   */
  209. /************************************************************************/
  210. /*                    左电机调速                                        */
  211. /*调节push_val_left的值改变电机转速,占空比            */
  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中断服务子函数产生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为准。在这个基础上延时
  229.          pwm_Servomoto();
  230.          timer1++;                                 //2MS扫一次数码管
  231.          if(timer1>=20)
  232.          {
  233.          timer1=0;
  234.          Display();      
  235.          }         
  236.          
  237. }
  238. /***************************************************/
  239. ///*TIMER0中断服务子函数产生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)                       /*无限循环*/
  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();                   //方向函数
  274.                    }
  275.                    }
  276.                    else
  277.                    if(S>40)                  //距离大于,30CM往前走
  278.                    run();
  279.            }

  280.         }
  281. }
  282.    
复制代码


回复

使用道具 举报

ID:234075 发表于 2019-3-23 01:11 | 显示全部楼层
_nop_();是一个空语句子函数,包含在"intrins.h"头文件中(如果使用这个子函数,则必须在前面使用“#include"intrins.h"对头文件进行声明”);
常用于延时,在C51中,如果晶振主频=12MHZ,运行一次_nop_();相当于1us的延时;
回复

使用道具 举报

ID:164602 发表于 2019-3-23 14:11 | 显示全部楼层
HC-HR04超声波测距模块的使用手册上说: 1.jpg

所以,发波时就要让控制口保持10us以上的高电平,你的程序多了几个us,也是没问题的。
这个_nop_()函数,就叫空指令,即什么事儿都不干,相当于延时了。
它延时的时间,就是一个同期,对51单片机、12M晶振而,一个_nop_()函数,正好一个us。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表