⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lst

📁 基于单片机的超声波测距程序
💻 LST
字号:
C51 COMPILER V7.06   MAIN                                                                  06/15/2007 16:33:06 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\My Electronic\Tools\Design tools\keil7.06\C51\BIN\C51.EXE main.c

stmt level    source

   1          //#include "STC12C5410AD.h"
   2          #include <REG52.H>
   3          #define uchar unsigned char
   4          #define uint unsigned int
   5          #define ulong unsigned long 
   6          
   7          /*----------------------
   8          分体式超声波发射接收对管
   9           型号:TR40
  10           频率:40K
  11           T是发射
  12           R是接收
  13          ----------------------*/
  14          sbit k1 = P3^4;
  15          sbit bg = P3^3; 
  16          sbit csbout = P3^5;                  //超声波发送
  17          sbit csbint = P3^7;                  //超声波接收
  18          float csbc = 0.034;                                                                      //声音的传播速度  0.034  cm/us(厘米/微秒)
  19          
  20          uchar csbds,digit,buffer[3],xm1,xm2,xm0,key,jpjs;       //显示标识
  21          
  22          uchar convert[10]={ 0x3F,                   //0
  23                                              0x06,                       //1
  24                                                  0x5b,                   //2
  25                                                  0x4f,                   //3
  26                                                  0x66,                   //4
  27                                                  0x6d,                   //5
  28                                                  0x7d,                   //6
  29                                                  0x07,                   //7
  30                                                  0x7f,                   //8
  31                                                  0x6f                    //9
  32                                                  };                              //0~9段码
  33          
  34          uint s,t,i, xx,j,sj1,sj2,sj3,mqs,sx1;
  35          bit cl;      
  36                                       
  37          void csbcj();
  38          void delay(j);    //延时函数,延时的时间由变量J决定
  39          void scanLED();    //显示函数
  40          void timeToBuffer();  //显示转换函数
  41          void keyscan();         //用于识别是设定最近值还是最远值及报警值和各种情况所对应的延时值mqs
  42          void k1cl();                    //用于设定测距的最近值
  43          void k2cl();                    //用于设定测距的报警值,如果到了设定的报警值时,bg位置1
  44          void k3cl();                    //用于设定测距的最远值
  45          void k4cl();                    //用于设定在发送超声信号后,所要的延时值,在不同地最近值时,其延时值也不会相同
  46          void offmsd();          
  47          
  48          
  49          void main()                              //主函数
  50          {
  51   1               EA=1;    //开中断
  52   1               TMOD=0x11;   //设定时器0为计数,设定时器1定时
  53   1               ET1=1;    //定时器1中断允许 
  54   1               TH0=0x00;
  55   1               TL0=0x00;
C51 COMPILER V7.06   MAIN                                                                  06/15/2007 16:33:06 PAGE 2   

  56   1               TH1=0x9E;
  57   1               TL1=0x57;
  58   1               csbds=0;
  59   1               cl=0;
  60   1               TR1=1;      
  61   1               jpjs=0;
  62   1               sj1=30;
  63   1               sj2=80;
  64   1               sj3=200;   
  65   1           P2=0xff;
  66   1               k4cl();
  67   1           P0=0xff;  
  68   1           P3=0xff;              
  69   1               while(1)
  70   1               {
  71   2                       keyscan();
  72   2      
  73   2                       if(jpjs<1) csbcj();
  74   2      
  75   2                       timeToBuffer();   //将值转换成LED段码
  76   2                       offmsd();      
  77   2                       scanLED();      //显示函数
  78   2      
  79   2                       if(s<sj2)             //距离小于报警值,报警,点亮指示灯
  80   2                  bg=0;
  81   2               else
  82   2                          bg=1;  
  83   2               }            
  84   1      }
  85          
  86          void scanLED()      //显示功能模块
  87          {
  88   1              digit=0x80;
  89   1              for( i=0; i<3; i++)     //3位数显示
  90   1              {
  91   2                       P2=~digit;     //依次显示各位数
  92   2                       P0=~buffer[i];     //显示数据送P0口
  93   2                       delay(20);      //延时处理
  94   2               P2=0xff;
  95   2                       P0=0xff;      //P1口置高电平(关闭)
  96   2                       digit>>=1;      //循环右移1位
  97   2              }
  98   1          P2=0xff;
  99   1      }
 100          
 101          void timeToBuffer()     //转换段码功能模块
 102          {
 103   1           xm0=s/100;      
 104   1           xm1=(s-100*xm0)/10;
 105   1           xm2=s-100*xm0-10*xm1;
 106   1           buffer[2]=convert[xm2];      
 107   1           buffer[1]=convert[xm1];
 108   1           buffer[0]=convert[xm0];
 109   1      }
 110          
 111          void delay(i)                              
 112          {
 113   1          while(--i);
 114   1      }
 115          
 116          void timer1int (void)  interrupt 3      //定时器延时一段时间,消除未接受的超声波信号的干扰
 117          {
C51 COMPILER V7.06   MAIN                                                                  06/15/2007 16:33:06 PAGE 3   

 118   1              TH1=0x9E;
 119   1              TL1=0x57;
 120   1              csbds++;
 121   1              if(csbds>=40)
 122   1              {
 123   2                       csbds=0;
 124   2                       cl=1;                          //延时时间结束,置标志信号,可以再次测距
 125   2               TR1=0;
 126   2              }            
 127   1      }
 128          
 129          /*---------测距函数---------------
 130          先发送5个周期的超声波信号,然后开计数器0,
 131          延时一段时间mqs,再识别是否收到超声波信号.
 132          如有则关计数器0,然后读计数器内的值,再经运
 133          算换算成三位的整数,存放在S中.
 134          --------------------------------*/
 135          void csbcj()                    //产生超声波并测距
 136          {
 137   1          csbint=1;
 138   1              if(cl==1)                       //检测是否可以开始测距
 139   1              {
 140   2                       TR1=0;
 141   2                       TH0=0x00;
 142   2                       TL0=0x00;
 143   2                       i=10;
 144   2                       TR0=1;                  
 145   2                       while(i--)
 146   2                       {
 147   3                      csbout=!csbout;
 148   3                       }
 149   2                       i=0;  
 150   2                       while(csbint)
 151   2                       {
 152   3                                if(++i>=4000)       //上限值,最多可循环4000次,以防止定时器T0溢出
 153   3                                      break;                  //达到上限,强制退出循环
 154   3                       }               
 155   2                       TR0=0;                //停止计时
 156   2                       TH1=0x9E;
 157   2                       TL1=0x57;
 158   2               csbds=0;
 159   2                       cl=0;                                          //测试允许标志位清零,关闭测试
 160   2                       TR1=1;                                         //启动定时器1延时,消除尚未接收的超声波信号
 161   2                       t=TH0;
 162   2                       t=t*256+TL0;
 163   2                       s=t*csbc/2.0;                  //测距离
 164   2              }
 165   1      }
 166                                                   
 167          void keyscan()      //健盘处理函数
 168          {
 169   1              xx=0;
 170   1              if(k1!=1)       // 判断开关是否按下
 171   1              {
 172   2                      delay(400);      //延时去抖动
 173   2                      if(k1!=1)      // 判断开关是否按下      
 174   2                      {            
 175   3                              while(!k1)
 176   3                              {
 177   4                                      delay(30);      
 178   4                                      xx++;
 179   4                              }
C51 COMPILER V7.06   MAIN                                                                  06/15/2007 16:33:06 PAGE 4   

 180   3                              if(xx>2000)            //若按下一定时间,则为功能设定,将功能选项下移一位
 181   3                              {
 182   4                                        jpjs++;
 183   4                                        if(jpjs>4)                                            //若已到最后一项选项,则退出设定
 184   4                                              jpjs=0;
 185   4                              }
 186   3                              xx=0;
 187   3                              switch(jpjs)
 188   3                              {
 189   4                                      case 1: k1cl();break;                   //用于设定测距的最近值
 190   4                                      case 2: k2cl();break;                                                   //用于设定测距的报警值,如果到了设定的报警值时,bg位置1
 191   4                                      case 3: k3cl();break;                                                   //用于设定测距的最远值
 192   4                                      case 4: k4cl();break;                                                   //用于设定在发送超声信号后,所要的延时值,在不同地最近值时,其延时值也不会
             -相同
 193   4                              } 
 194   3                      }
 195   2               }
 196   1      } 
 197          
 198          /*---设定测距的最近值---*/
 199          void k1cl()
 200          {
 201   1              sj1=sj1+5;
 202   1              if(sj1>100)
 203   1                      sj1=30;
 204   1              s=sj1;
 205   1      }
 206          
 207          /*---设定测距的报警值,如果到了设定的报警值时,bg位置1---*/
 208          void k2cl()
 209          {
 210   1              sj2=sj2+5;
 211   1              if(sj2>500)
 212   1              sj2=40;
 213   1              s=sj2;
 214   1      }
 215          
 216          /*---用于设定测距的最远值---*/
 217          void k3cl()
 218          {
 219   1              sj3=sj3+10;
 220   1              if(sj3>500)
 221   1              sj3=100;
 222   1              s=sj3;
 223   1      }
 224          
 225          /*---用于设定在发送超声信号后,所要的延时值,在不同地最近值时,其延时值也不会相同---*/
 226          void k4cl()
 227          {
 228   1              sx1=sj1-1;                                      //最小测试距离-1
 229   1              sx1=sx1/csbc;                           //传送时间
 230   1              mqs=sx1/4.5;                            //延时时间
 231   1      }
 232          
 233          void offmsd()                                              
 234          {
 235   1          if (buffer[0] == 0x3f)                            
 236   1          buffer[0] = 0x00;
 237   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V7.06   MAIN                                                                  06/15/2007 16:33:06 PAGE 5   

   CODE SIZE        =    689    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     44    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -