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

📄 text2.lst

📁 单片机超声波测距程序源代码,38KHZ,可以4M
💻 LST
字号:
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE TEXT2
OBJECT MODULE PLACED IN .\Text2.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil7.0\C51\BIN\C51.EXE .\Text2.c DEBUG OBJECTEXTEND

stmt level    source

   1          /*-------------------------------------
   2          超声波测距单片C程序
   3          MCU  AT89S52 XAL 12M
   4          2006.8.21   by maozhen
   5          增加EEPROM存储功能,测量过程中键1存,键2读
   6          --------------------------------------*/
   7          #include<AT89X52.h>
   8          #include <intrins.h>
   9          #define uchar unsigned char
  10          #define uint unsigned int
  11          #define ulong unsigned long
  12          #define Sda P1_2 /*串行数据*/
  13          #define Scl P1_1  /*串行时钟*/
  14          #define WriteRom P1_5
  15          #define ReadRom  P1_4
  16          data uchar ramnum=0;
  17          extern void transmit(void);
  18          extern void display(void);
  19          
  20          //sfr WDTRST  = 0xA6;
  21          //sfr AUXR    = 0X8E;
  22          data uchar testok;
  23          data ulong time;
  24          data uchar dispram[3]={1,1,1};
  25          const unsigned char LED7Code[]={
  26          	0x14,		// 0
  27              0x77,		// 1
  28              0x4C,		// 2
  29          	0x45,		// 3
  30          	0x27,		// 4
  31          	0x85,		// 5
  32          	0x84,		// 6
  33          	0x57,		// 7
  34          	0x04,		// 8
  35          	0x05,		// 9
  36              0x8e,       // F
  37              0x8C,		// E
  38              0x12,       // n
  39              0x64,		// D
  40                                           };
  41          const uchar dispbit[]={
  42            0xfe,    //bit1
  43            0xfb,    //bit2
  44            0xef,    //bit3
  45                          };
  46          
  47            extern void delay(uint t)
  48            {
  49   1        uint n,j;
  50   1         for (n=0;n<t;n++)
  51   1         for (j=0; j<10;j++);
  52   1         }
  53          
  54          /*void supplydog(void)
  55           {
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 2   

  56            EA=0;
  57            WDTRST=0x1E;
  58            WDTRST=0xE1;
  59            EA=1;
  60           }
  61          */
  62          extern void mDelay(uint Delay)
  63          { uint i;
  64   1      for(;Delay>0;Delay--)
  65   1      { for(i=0;i<124;i++)
  66   2      {;}
  67   2        //supplydog();
  68   2      }
  69   1      }
  70          
  71          /*发送起始条件*/
  72          void Start(void) /*起始条件*/
  73          {
  74   1      Sda=1;
  75   1      Scl=1;
  76   1      _nop_();
  77   1      _nop_();
  78   1      _nop_();
  79   1      _nop_();
  80   1      Sda=0;
  81   1      _nop_();
  82   1      _nop_();
  83   1      _nop_();
  84   1      _nop_();
  85   1      }
  86          
  87          void Stop(void) /*停止条件*/
  88          {
  89   1      Sda=0;
  90   1      Scl=1;
  91   1      _nop_();
  92   1      _nop_();
  93   1      _nop_();
  94   1      _nop_();
  95   1      Sda=1;
  96   1      _nop_();
  97   1      _nop_();
  98   1      _nop_();
  99   1      _nop_();
 100   1      }
 101          
 102          void Ack(void) /*应答位*/
 103          {
 104   1      Sda=0;
 105   1      _nop_();
 106   1      _nop_();
 107   1      _nop_();
 108   1      _nop_();
 109   1      Scl=1;
 110   1      _nop_();
 111   1      _nop_();
 112   1      _nop_();
 113   1      _nop_();
 114   1      Scl=0;
 115   1      }
 116          
 117          void NoAck(void) /*反向应答位*/
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 3   

 118          {
 119   1      Sda=1;
 120   1      _nop_ ();
 121   1      _nop_ ();
 122   1      _nop_ ();
 123   1      _nop_ ();
 124   1      Scl=1;
 125   1      _nop_ ();
 126   1      _nop_ ();
 127   1      _nop_ ();
 128   1      _nop_ ();
 129   1      Scl=0;
 130   1      }
 131          
 132          void Send(uchar Data) /*发送数据子程序,Data为要求发送的数据*/
 133          {
 134   1      uchar BitCounter=8; /*位数控制*/
 135   1      uchar temp; /*中间变量控制*/
 136   1      //supplydog();
 137   1      do
 138   1      {
 139   2      temp=Data;
 140   2      Scl=0;
 141   2      _nop_ ();
 142   2      _nop_ ();
 143   2      _nop_ ();
 144   2      _nop_ ();
 145   2      if((temp&0x80)==0x80)/* 如果最高位是1*/
 146   2      Sda=1;
 147   2      else
 148   2      Sda=0;
 149   2      Scl=1;
 150   2      temp=Data<<1; /*RLC*/
 151   2      Data=temp;
 152   2      BitCounter--;
 153   2      }while(BitCounter);
 154   1      Scl=0;
 155   1      }
 156          
 157          uchar Read(void) /*读一个字节的数据,并返回该字节值*/
 158          {
 159   1      uchar temp=0;
 160   1      uchar temp1=0;
 161   1      uchar BitCounter=8;
 162   1      Sda=1;
 163   1      //supplydog();
 164   1      do{
 165   2      Scl=0;
 166   2      _nop_();
 167   2      _nop_();
 168   2      _nop_();
 169   2      _nop_();
 170   2      Scl=1;
 171   2      _nop_();
 172   2      _nop_();
 173   2      _nop_();
 174   2      _nop_();
 175   2      if(Sda)
 176   2      temp=temp|0x01; /*temp的最低位置1*/
 177   2      else
 178   2      temp=temp&0xfe; /*否则temp的最低位清0*/
 179   2      if(BitCounter-1)
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 4   

 180   2      { temp1=temp<<1;
 181   3      temp=temp1;
 182   3      }
 183   2      BitCounter--;
 184   2      }while(BitCounter);
 185   1      return(temp);
 186   1      }
 187          
 188          void WrToROM(uchar Data[],uchar Address,uchar Num)
 189          {
 190   1      uchar i;
 191   1      uchar *PData;
 192   1      PData=Data;
 193   1      for(i=0;i<Num;i++)
 194   1      {
 195   2      Start(); /*发送启动信号*/
 196   2      Send(0xa0); /*发送SLA+W*/
 197   2      Ack();
 198   2      Send(Address+i); /*发送地址*/
 199   2      Ack();
 200   2      Send(*(PData+i));
 201   2      Ack();
 202   2      Stop();
 203   2      mDelay(20);
 204   2      }
 205   1      }
 206          
 207          void RdFromROM(uchar Data[],uchar Address,uchar Num)
 208          {
 209   1      uchar i;
 210   1      uchar *PData;
 211   1      PData=Data;
 212   1      for(i=0;i<Num;i++)
 213   1      {
 214   2      Start();
 215   2      Send(0xa0);
 216   2      Ack();
 217   2      Send(Address+i);
 218   2      Ack();
 219   2      Start();
 220   2      Send(0xa1);
 221   2      Ack();
 222   2      *(PData+i)=Read();
 223   2      Scl=0;
 224   2      NoAck();
 225   2      Stop();
 226   2      }
 227   1      }
 228          
 229          void testkey(void)
 230          {
 231   1      uchar j,k,temp1[1],temp[30]; 
 232   1      uint  i1=0,i;
 233   1      //supplydog();
 234   1       if((!WriteRom)|(!ReadRom))
 235   1          {
 236   2           if (WriteRom==0)
 237   2              {mDelay(50);
 238   3               if (WriteRom==0)
 239   3                  {
 240   4      			 WrToROM(dispram,ramnum,3);   //一次写入三个数据
 241   4                   ramnum=ramnum+3;
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 5   

 242   4      			 }
 243   3              }
 244   2            else if (ReadRom==0)
 245   2             {mDelay(50);
 246   3              if (ReadRom==0)
 247   3                  { 
 248   4                   
 249   4      		         for(i=0;i<ramnum;i++)
 250   4                         {
 251   5      				    RdFromROM(temp1,i,1);
 252   5      				    temp[i]=temp1[0];
 253   5                          }
 254   4                    for(k=0;k<ramnum/3;k++)     //逐个显示记录的数据
 255   4                     {
 256   5      			          for(j=0;j<3;j++)
 257   5      			             {dispram[j]=temp[i1++];}
 258   5      			          for(i=0;i<5000;i++)
 259   5      			             {display();}
 260   5      				}
 261   4                   }
 262   3                   dispram[0]=11;              //记录显示结束,“END
 263   3                   dispram[1]=12;
 264   3                   dispram[2]=13;       
 265   3              for(i=0;i<1000;i++)
 266   3                 {display();}
 267   3      	     }
 268   2           }
 269   1      }
 270          
 271          /* main  */
 272          void main(void)
 273           {
 274   1       data uint k;
 275   1       ramnum=0;
 276   1       //supplydog();
 277   1      // AUXR = 0x08;
 278   1       P0 = 0xFF;
 279   1       P1 = 0xFD;
 280   1       P3 = 0xFF;
 281   1       P2 = 0x8e;
 282   1      TMOD=0x21;    //timer1 mode2,timer0 mode1
 283   1      RCAP2H=0xff;    //65536-75
 284   1      RCAP2L=0xb5;
 285   1      TH2   =0xff;
 286   1      TL2   =0xB5;
 287   1      TH0=0x0;
 288   1      TL0=0x0;
 289   1      T2MOD=0x02;    //T2作为CLK输出40k
 290   1      T2CON=0x00;    //no打开TIMER2
 291   1      P1_3 =1;
 292   1      
 293   1      while(1)
 294   1       {
 295   2      //supplydog();
 296   2      EA=0;
 297   2      RCAP2H=0xff;    //65536-75
 298   2      RCAP2L=0xb5;
 299   2      TH2   =0xff;
 300   2      TL2   =0xB5;
 301   2      TH0=0x0;
 302   2      TL0=0x0;
 303   2      T2MOD=0x02;    //T2作为CLK输出40k
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 6   

 304   2      T2CON=0x00;    //no打开TIMER2
 305   2      TMOD=0x21;
 306   2      P1_3 =1;
 307   2      EA=1;
 308   2      transmit();
 309   2      testok=0;
 310   2       while (!testok) display();
 311   2       if(1==testok)
 312   2         {
 313   3         time=TH0;
 314   3         time=(time<<8)|TL0;
 315   3         //supplydog();
 316   3         TH0=0;
 317   3         TL0=0;
 318   3         time*=172;
 319   3         time/=10000;
 320   3         time+=6;
 321   3         dispram[2]=(uchar)(time%10); //个位
 322   3      
 323   3         dispram[1]=(uchar)((time/10)%10);//十位
 324   3      
 325   3         dispram[0]=(uchar)(time/100);  //百位
 326   3         //supplydog();
 327   3         } else
 328   2         {
 329   3         dispram[0]=10;
 330   3         dispram[1]=10;
 331   3         dispram[2]=10;
 332   3         }
 333   2        EA=0;
 334   2         for (k=0;k<150;k++)
 335   2         display();  //500
 336   2         testkey();
 337   2        EA=1;
 338   2        }
 339   1       }
 340          
 341          
 342           /*超声波接蕆eceive*int)*/
 343           void receive(void) interrupt 0
 344           {
 345   1       TR2=0;
 346   1       TR0=0;
 347   1       ET0=0;
 348   1       EX0=0;
 349   1       testok=1;
 350   1       //supplydog();
 351   1       }
 352          
 353           /*超时清除程序(内中断T0 YICHU)*/
 354           void overtime(void) interrupt 1
 355           {
 356   1      
 357   1        testok=0;
 358   1         TR2=0;
 359   1        EX0=0;
 360   1        TR0=0;
 361   1        ET0=0;
 362   1        testok=2;
 363   1        //supplydog();
 364   1        }
 365          
C51 COMPILER V6.12  TEXT2                                                                  08/25/2006 17:25:49 PAGE 7   

 366           void transmit(void)
 367           {
 368   1       	EX0=0;
 369   1       	IE0=0;
 370   1        //supplydog();
 371   1        testok=0;
 372   1        TH0=0;
 373   1        TL0=0;
 374   1        //P1_3 =0;  ////and输入端,抑制发送?
 375   1        TR2 =1;  //start timer2
 376   1        TR0=1;   //T0开始记述
 377   1        delay(1);
 378   1        TR2=0;
 379   1        
 380   1        testok=0;
 381   1        P1_0=0;  //接电容的发射脚为0,发射器上两边0
 382   1        delay(5);  //delay(1)
 383   1        //P1_3 =1;  //
 384   1        IE0=0;
 385   1        EX0=1;    //开外中断
 386   1        ET0=1;    //T0 INT ON
 387   1        testok=0;
 388   1        //supplydog();
 389   1        }
 390          
 391          
 392          void display(void)
 393          {   int i;
 394   1         for( i=0;i<3;i++)
 395   1        {
 396   2         P2=LED7Code[dispram[i]];
 397   2         P0=dispbit[i];
 398   2         delay(3);
 399   2         //supplydog();
 400   2        };
 401   1       
 402   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1011    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     26      57
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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