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

📄 脉宽测量.lst

📁 避障模块
💻 LST
字号:
C51 COMPILER V8.02   耞宽测量                                                              10/23/2009 20:59:40 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 耞宽测量
OBJECT MODULE PLACED IN 脉宽测量.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 脉宽测量.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          /*============================================================
   3          //DYP-ME007 超声波测距模块 DEMO 程序
   4          //程序编写:廖文丹        QQ:  80184985
   5          //网站:智能微控工作室 http://www.mcustudio.com.cn
   6          //taobao店铺:http://shop37091187.taobao.com/
   7                     http://www.mcustudio.com.cn  
   8          ==============================================================
   9          SMC1602A(16*2)模拟口线接线方式
  10          连接线图:       
  11                 ---------------------------------------------------
  12                 |LCM-----51   |  LCM-----51   |  LCM------51      |
  13                 --------------------------------------------------|
  14                 |DB0-----P1.0 |  DB4-----P1.4 |  RW-------P3.4    |
  15                 |DB1-----P1.1 |  DB5-----P1.5 |  RS-------P3.3    |
  16                 |DB2-----P1.2 |  DB6-----P1.6 |  E--------P3.5    |
  17                 |DB3-----P1.3 |  DB7-----P1.7 |  VLCD接1K电阻到GND|
  18                 ---------------------------------------------------
  19          接线:模块TRIG接 P2.6  ECH0 接P2.7
  20          
  21          本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。
  22          
  23          [注:AT89x51使用12M或11.0592M晶振,实测使用11.0592M]
  24          =============================================================*/
  25          #include <AT89x51.H>            //器件配置文件
  26          #include <intrins.h>
  27          #define  RX  P2_7
  28          #define  TX  P2_6
  29          
  30          #define LCM_RW  P3_4 //定义LCD引脚
  31          #define LCM_RS  P3_3
  32          #define LCM_E   P3_5
  33          #define LCM_Data  P1
  34          
  35          #define Key_Data P2_0 //定义Keyboard引脚
  36          #define Key_CLK  P3_2
  37          
  38          #define Busy    0x80 //用于检测LCM状态字中的Busy标识
  39          
  40          void LCMInit(void);
  41          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
  42          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
  43          void Delay5Ms(void);
  44          void Delay400Ms(void);
  45          void Decode(unsigned char ScanCode);
  46          void WriteDataLCM(unsigned char WDLCM);
  47          void WriteCommandLCM(unsigned char WCLCM,BuysC);
  48          
  49          unsigned char ReadDataLCM(void);
  50          unsigned char ReadStatusLCM(void);
  51          unsigned char code mcustudio[] ={"mcustudio.com.cn"};
  52          unsigned char code email[] =    {"fhwxaoo@163.com "};
  53          unsigned char code Cls[] =      {"                "};
  54          unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
  55          
C51 COMPILER V8.02   耞宽测量                                                              10/23/2009 20:59:40 PAGE 2   

  56          static unsigned char DisNum = 0; //显示用指针                             
  57                 unsigned int  time=0;
  58                     unsigned long S=0;
  59                     bit      flag =0;
  60                     unsigned char disbuff[4]        ={ 0,0,0,0,};
  61          
  62          
  63          //写数据
  64          void WriteDataLCM(unsigned char WDLCM) 
  65          {
  66   1              ReadStatusLCM(); //检测忙
  67   1              LCM_Data = WDLCM;
  68   1              LCM_RS = 1;
  69   1              LCM_RW = 0;
  70   1              LCM_E = 0; //若晶振速度太高可以在这后加小的延时
  71   1              LCM_E = 0; //延时
  72   1              LCM_E = 1;
  73   1      }
  74          
  75          //写指令
  76          void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
  77          {
  78   1              if (BuysC) ReadStatusLCM(); //根据需要检测忙
  79   1              LCM_Data = WCLCM;
  80   1              LCM_RS = 0;
  81   1              LCM_RW = 0;     
  82   1              LCM_E = 0;
  83   1              LCM_E = 0;
  84   1              LCM_E = 1;      
  85   1      }
  86          
  87          //读数据
  88          unsigned char ReadDataLCM(void)
  89          {
  90   1              LCM_RS = 1; 
  91   1              LCM_RW = 1;
  92   1              LCM_E = 0;
  93   1              LCM_E = 0;
  94   1              LCM_E = 1;
  95   1              return(LCM_Data);
  96   1      }
  97          
  98          //读状态
  99          unsigned char ReadStatusLCM(void)
 100          {
 101   1              LCM_Data = 0xFF; 
 102   1              LCM_RS = 0;
 103   1              LCM_RW = 1;
 104   1              LCM_E = 0;
 105   1              LCM_E = 0;
 106   1              LCM_E = 1;
 107   1              while (LCM_Data & Busy); //检测忙信号
 108   1              return(LCM_Data);
 109   1      }
 110          
 111          void LCMInit(void) //LCM初始化
 112          {
 113   1              LCM_Data = 0;
 114   1              WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
 115   1              Delay5Ms(); 
 116   1              WriteCommandLCM(0x38,0);
 117   1              Delay5Ms(); 
C51 COMPILER V8.02   耞宽测量                                                              10/23/2009 20:59:40 PAGE 3   

 118   1              WriteCommandLCM(0x38,0);
 119   1              Delay5Ms(); 
 120   1      
 121   1              WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
 122   1              WriteCommandLCM(0x08,1); //关闭显示
 123   1              WriteCommandLCM(0x01,1); //显示清屏
 124   1              WriteCommandLCM(0x06,1); // 显示光标移动设置
 125   1              WriteCommandLCM(0x0F,1); // 显示开及光标设置
 126   1      }
 127          
 128          //按指定位置显示一个字符
 129          void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
 130          {
 131   1              Y &= 0x1;
 132   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 133   1              if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
 134   1              X |= 0x80; //算出指令码
 135   1              WriteCommandLCM(X, 1); //发命令字
 136   1              WriteDataLCM(DData); //发数据
 137   1      }
 138          
 139          //按指定位置显示一串字符
 140          void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
 141          {
 142   1              unsigned char ListLength;
 143   1      
 144   1        ListLength = 0;
 145   1              Y &= 0x1;
 146   1              X &= 0xF; //限制X不能大于15,Y不能大于1
 147   1              while (DData[ListLength]>0x19) //若到达字串尾则退出
 148   1                      {
 149   2                              if (X <= 0xF) //X坐标应小于0xF
 150   2                                      {
 151   3                                              DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
 152   3                                              ListLength++;
 153   3                                              X++;
 154   3                                      }
 155   2                      }
 156   1      }
 157          
 158          //5ms延时
 159          void Delay5Ms(void)
 160          {
 161   1              unsigned int TempCyc = 5552;
 162   1              while(TempCyc--);
 163   1      }
 164          
 165          //400ms延时
 166          void Delay400Ms(void)
 167          {
 168   1              unsigned char TempCycA = 5;
 169   1              unsigned int TempCycB;
 170   1              while(TempCycA--)
 171   1                      {
 172   2                              TempCycB=7269;
 173   2                              while(TempCycB--);
 174   2                      };
 175   1      }
 176          /********************************************************/
 177              void Conut(void)
 178                  {
 179   1               time=TH0*256+TL0;
C51 COMPILER V8.02   耞宽测量                                                              10/23/2009 20:59:40 PAGE 4   

 180   1               TH0=0;
 181   1               TL0=0;
 182   1              
 183   1               S=(time*1.7)/100;     //算出来是CM
 184   1               if((S>=700)||flag==1) //超出测量范围显示“-”
 185   1               {       
 186   2                flag=0;
 187   2               
 188   2                DisplayOneChar(0, 1, ASCII[11]);
 189   2                DisplayOneChar(1, 1, ASCII[10]);      //显示点
 190   2                DisplayOneChar(2, 1, ASCII[11]);
 191   2                DisplayOneChar(3, 1, ASCII[11]);
 192   2                DisplayOneChar(4, 1, ASCII[12]);      //显示M
 193   2               }
 194   1               else
 195   1               {
 196   2                disbuff[0]=S%1000/100;
 197   2                disbuff[1]=S%1000%100/10;
 198   2                disbuff[2]=S%1000%10 %10;
 199   2                DisplayOneChar(0, 1, ASCII[disbuff[0]]);
 200   2                DisplayOneChar(1, 1, ASCII[10]);      //显示点
 201   2                DisplayOneChar(2, 1, ASCII[disbuff[1]]);
 202   2                DisplayOneChar(3, 1, ASCII[disbuff[2]]);
 203   2                DisplayOneChar(4, 1, ASCII[12]);      //显示M
 204   2               }
 205   1              }
 206          /********************************************************/
 207               void zd0() interrupt 1              //T0中断用来计数器溢出,超过测距范围
 208            {
 209   1          flag=1;                                                      //中断溢出标志
 210   1        }
 211          /********************************************************/
 212               void  StartModule()                         //启动模块
 213            {
 214   1                TX=1;                                      //启动一次模块
 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                _nop_(); 
 234   1                _nop_(); 
 235   1                _nop_();
 236   1                TX=0;
 237   1        }
 238          /********************************************************/ 
 239          void delayms(unsigned int ms)
 240          {
 241   1              unsigned char i=100,j;
C51 COMPILER V8.02   耞宽测量                                                              10/23/2009 20:59:40 PAGE 5   

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    757    ----
   CONSTANT SIZE    =     66    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11       8
   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 + -