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

📄 脉宽测量.lst

📁 J:\HY-SRF05超声波模块(全部资料)
💻 LST
字号:
C51 COMPILER V7.06   脉宽测量                                                              06/14/2011 01:56:38 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE 脉宽测量
OBJECT MODULE PLACED IN 脉宽测量.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE 脉宽测量.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*
   2          SMC1602A(16*2)模拟口线接线方式
   3          连接线图:       
   4                 ---------------------------------------------------
   5                 |LCM-----51   |  LCM-----51   |  LCM------51      |
   6                 --------------------------------------------------|
   7                 |DB0-----P1.0 |  DB4-----P1.4 |  RW-------P3.4    |
   8                 |DB1-----P1.1 |  DB5-----P1.5 |  RS-------P3.3    |
   9                 |DB2-----P1.2 |  DB6-----P1.6 |  E--------P3.5    |
  10                 |DB3-----P1.3 |  DB7-----P1.7 |  VLCD接1K电阻到GND|
  11                 ---------------------------------------------------
  12          接线:模块TRIG接 P3.7  ECH0 接P3.6
  13          
  14          本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。
  15          
  16          [注:stc89c52使用12M或11.0592M晶振,实测使用11.0592M]
  17          =============================================================*/
  18          #include <AT89x51.H>            //器件配置文件
  19          #include <intrins.h>
  20          #define  RX  P3_6
  21          #define  TX  P3_7
  22          
  23          #define LCM_RW  P2_3 //定义LCD引脚
  24          #define LCM_RS  P2_4
  25          #define LCM_E   P2_2
  26          #define LCM_Data  P1
  27          
  28          #define Key_Data P3_3 //定义Keyboard引脚
  29          #define Key_CLK  P3_2
  30          
  31          #define Busy    0x80 //用于检测LCM状态字中的Busy标识
  32          
  33          void LCMInit(void);
  34          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  35          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  36          void Delay5Ms(void);
  37          void Delay400Ms(void);
  38          void Decode(unsigned char ScanCode);
  39          void WriteDataLCM(unsigned char WDLCM);
  40          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  41          
  42          unsigned char ReadDataLCM(void);
  43          unsigned char ReadStatusLCM(void);
  44          unsigned char code mcustudio[] ={"==Range Finder=="};
  45          unsigned char code email[] =    {"heyaodz@163.com "};
  46          unsigned char code Cls[] =      {"                "};
  47          unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
  48          
  49          static unsigned char DisNum = 0; //显示用指针                             
  50                 unsigned int  time=0;
  51                     unsigned long S=0;
  52                     bit      flag =0;
  53                     unsigned char disbuff[4]        ={ 0,0,0,0,};
  54          
  55          
C51 COMPILER V7.06   脉宽测量                                                              06/14/2011 01:56:38 PAGE 2   

  56          //写数据
  57          void WriteDataLCM(unsigned char WDLCM) 
  58          {
  59   1              ReadStatusLCM(); //检测忙
  60   1              LCM_Data = WDLCM;
  61   1              LCM_RS = 1;
  62   1              LCM_RW = 0;
  63   1              LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  64   1              LCM_E = 0; //延时
  65   1              LCM_E = 1;
  66   1      }
  67          
  68          //写指令
  69          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  70          {
  71   1              if (BuysC) ReadStatusLCM(); //根据需要检测忙
  72   1              LCM_Data = WCLCM;
  73   1              LCM_RS = 0;
  74   1              LCM_RW = 0;     
  75   1              LCM_E = 0;
  76   1              LCM_E = 0;
  77   1              LCM_E = 1;      
  78   1      }
  79          
  80          //读数据
  81          unsigned char ReadDataLCM(void)
  82          {
  83   1              LCM_RS = 1; 
  84   1              LCM_RW = 1;
  85   1              LCM_E = 0;
  86   1              LCM_E = 0;
  87   1              LCM_E = 1;
  88   1              return(LCM_Data);
  89   1      }
  90          
  91          //读状态
  92          unsigned char ReadStatusLCM(void)
  93          {
  94   1              LCM_Data = 0xFF; 
  95   1              LCM_RS = 0;
  96   1              LCM_RW = 1;
  97   1              LCM_E = 0;
  98   1              LCM_E = 0;
  99   1              LCM_E = 1;
 100   1              while (LCM_Data & Busy); //检测忙信号
 101   1              return(LCM_Data);
 102   1      }
 103          
 104          void LCMInit(void) //LCM初始化
 105          {
 106   1              LCM_Data = 0;
 107   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 108   1              Delay5Ms(); 
 109   1              WriteCommandLCM(0x38,0);
 110   1              Delay5Ms(); 
 111   1              WriteCommandLCM(0x38,0);
 112   1              Delay5Ms(); 
 113   1      
 114   1              WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 115   1              WriteCommandLCM(0x08,1); //关闭显示
 116   1              WriteCommandLCM(0x01,1); //显示清屏
 117   1              WriteCommandLCM(0x06,1); // 显示光标移动设置
C51 COMPILER V7.06   脉宽测量                                                              06/14/2011 01:56:38 PAGE 3   

 118   1              WriteCommandLCM(0x0F,1); // 显示开及光标设置
 119   1      }
 120          
 121          //按指定位置显示一个字符
 122          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 123          {
 124   1              Y &= 0x1;
 125   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 126   1              if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 127   1              X |= 0x80; //算出指令码
 128   1              WriteCommandLCM(X, 1); //发命令字
 129   1              WriteDataLCM(DData); //发数据
 130   1      }
 131          
 132          //按指定位置显示一串字符
 133          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 134          {
 135   1              unsigned char ListLength;
 136   1      
 137   1        ListLength = 0;
 138   1              Y &= 0x1;
 139   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 140   1              while (DData[ListLength]>0x19) //若到达字串尾则退出
 141   1                      {
 142   2                              if (X <= 0xF) //X坐标应小于0xF
 143   2                                      {
 144   3                                              DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 145   3                                              ListLength++;
 146   3                                              X++;
 147   3                                      }
 148   2                      }
 149   1      }
 150          
 151          //5ms延时
 152          void Delay5Ms(void)
 153          {
 154   1              unsigned int TempCyc = 5552;
 155   1              while(TempCyc--);
 156   1      }
 157          
 158          //400ms延时
 159          void Delay400Ms(void)
 160          {
 161   1              unsigned char TempCycA = 5;
 162   1              unsigned int TempCycB;
 163   1              while(TempCycA--)
 164   1                      {
 165   2                              TempCycB=7269;
 166   2                              while(TempCycB--);
 167   2                      };
 168   1      }
 169          /********************************************************/
 170              void Conut(void)
 171                  {
 172   1               time=TH0*256+TL0;
 173   1               TH0=0;
 174   1               TL0=0;
 175   1              
 176   1               S=(time*1.8)/10;     //算出来是CM
 177   1               if((S>=7000)||flag==1) //超出测量范围显示“-”
 178   1               {       
 179   2                flag=0;
C51 COMPILER V7.06   脉宽测量                                                              06/14/2011 01:56:38 PAGE 4   

 180   2               
 181   2                DisplayOneChar(0, 1, ASCII[11]);
 182   2                DisplayOneChar(1, 1, ASCII[10]);      //显示点
 183   2                DisplayOneChar(2, 1, ASCII[11]);
 184   2                DisplayOneChar(3, 1, ASCII[11]);
 185   2                DisplayOneChar(4, 1, ASCII[11]);
 186   2                DisplayOneChar(5, 1, ASCII[12]);      //显示M
 187   2               }
 188   1               else
 189   1               {
 190   2                disbuff[0]=S/1000;
 191   2                disbuff[1]=S/100%10;
 192   2                disbuff[2]=S/10%10;
 193   2                disbuff[3]=S%10;
 194   2                DisplayOneChar(0, 1, ASCII[disbuff[0]]);
 195   2                DisplayOneChar(1, 1, ASCII[10]);      //显示点
 196   2                DisplayOneChar(2, 1, ASCII[disbuff[1]]);
 197   2                DisplayOneChar(3, 1, ASCII[disbuff[2]]);
 198   2                DisplayOneChar(4, 1, ASCII[disbuff[3]]);
 199   2                DisplayOneChar(5, 1, ASCII[12]);      //显示M
 200   2               }
 201   1              }
 202          /********************************************************/
 203               void zd0() interrupt 1              //T0中断用来计数器溢出,超过测距范围
 204            {
 205   1          flag=1;                                                      //中断溢出标志
 206   1              RX=0;
 207   1        }
 208          /********************************************************/
 209               void  StartModule()                         //启动模块
 210            {
 211   1                TX=1;                                      //启动一次模块
 212   1                _nop_(); 
 213   1                _nop_(); 
 214   1                _nop_(); 
 215   1                _nop_(); 
 216   1                _nop_(); 
 217   1                _nop_(); 
 218   1                _nop_(); 
 219   1                _nop_(); 
 220   1                _nop_(); 
 221   1                _nop_(); 
 222   1                _nop_(); 
 223   1                _nop_(); 
 224   1                _nop_(); 
 225   1                _nop_(); 
 226   1                _nop_(); 
 227   1                _nop_(); 
 228   1                _nop_();
 229   1                _nop_(); 
 230   1                _nop_(); 
 231   1                _nop_(); 
 232   1                _nop_();
 233   1                TX=0;
 234   1        }
 235          void Timer_Count(void)
 236          {
 237   1                       TR0=1;                     //开启计数
 238   1                   while(RX);                 //当RX为1计数并等待
 239   1                   TR0=0;                             //关闭计数
 240   1               Conut();                       //计算
 241   1      
C51 COMPILER V7.06   脉宽测量                                                              06/14/2011 01:56:38 PAGE 5   

 242   1      }
 243          
 244          /********************************************************/ 
 245          void delayms(unsigned int ms)
 246          {
 247   1              unsigned char i=100,j;
 248   1              for(;ms;ms--)
 249   1              {
 250   2                      while(--i)
 251   2                      {
 252   3                              j=10;
 253   3                              while(--j);
 254   3                      }
 255   2              }
 256   1      }
 257          /*********************************************************/
 258          void main(void)
 259          {
 260   1          unsigned int valA;
 261   1              unsigned char TempCyc;
 262   1              Delay400Ms(); //启动等待,等LCM讲入工作状态
 263   1              LCMInit(); //LCM初始化
 264   1              Delay5Ms(); //延时片刻(可不要)
 265   1              DisplayListChar(0, 0, mcustudio);
 266   1              DisplayListChar(0, 1, email);
 267   1              ReadDataLCM();//测试用句无意义
 268   1              for (TempCyc=0; TempCyc<10; TempCyc++)
 269   1              Delay400Ms(); //延时
 270   1              DisplayListChar(0, 1, Cls);     
 271   1               TMOD=0x01;                //设T0为方式1,GATE=1;
 272   1               TH0=0;
 273   1               TL0=0;          
 274   1               ET0=1;             //允许T0中断
 275   1               EA=1;                     //开启总中断                 
 276   1              
 277   1              while(1)
 278   1                {
 279   2                      
 280   2                      delayms(60);
 281   2                      RX=1;
 282   2                  StartModule();
 283   2              for(valA=7510;valA>0;valA--)
 284   2                  {
 285   3                         
 286   3                     if(RX==1)
 287   3                         {
 288   4                 Timer_Count();
 289   4                         }
 290   3               }
 291   2                }
 292   1      }
 293          
 294          
 295          
 296                          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    770    ----
   CONSTANT SIZE    =     66    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.06   脉宽测量                                                              06/14/2011 01:56:38 PAGE 6   

   DATA SIZE        =     11      10
   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 + -