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

📄 chaosheng.lst

📁 此程序是8051超声波液位仪的源代码 有一定的参考价值
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   CHAOSHENG                                                             05/25/2007 11:20:26 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE CHAOSHENG
OBJECT MODULE PLACED IN C:\DOCUME~1\ADMINI~1\桌面\超声波5.13\CHAOSHENG.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\DOCUME~1\ADMINI~1\桌面\超声波5.13\CHAOSHENG.C DB SB OE

line level    source

   1          #include"reg51.h"
   2          #include"intrins.h"
   3          
   4          #define uint unsigned int
   5          #define uchar unsigned char
   6          
   7          sbit DS=P1^4;
   8          sbit START=P1^5;
   9          
  10          sbit SCK=P1^0;
  11          sbit SI=P1^1;
  12          sbit SO=P1^2;
  13          sbit cs_feed=P1^3;//喂狗信号
  14          
  15          uchar code *init="超声波液位仪";
  16          uchar code *work_temp="工作温度      ℃";
  17          uchar code *test=  "测量距离      mm";
  18          uchar code *fail=": 失败mm";
  19          uchar code *num_data="0123456789";
  20          uchar code *chao_v="超声波速     m/s";
  21          
  22          uchar  data temp_data[2];//={0x00,0x00}; //读出温度暂存单元 {0x91,0x01} 25度;   高位存高位 低位存低位
  23          uint data plus_data;//存放中断时的计数
  24          uint data  average=0;
  25          
  26          //RT12864写指令
  27           void cmd (uchar intr)
  28          {
  29   1              P2=0x04;
  30   1              P0=intr;
  31   1              P2=0x00;
  32   1              P2=0x03;// 写指令周期结束
  33   1      }
  34          //RT12864写数据
  35          void dat (uchar  *p,uchar data j)
  36          {
  37   1              uchar data i,k;
  38   1              for(i=0;i<j;i++)
  39   1              {
  40   2                      for(k=0;k<10;k++);  //延时大约100us
  41   2                      P2=0x05;
  42   2                      P0=*(p+i);
  43   2                      P2=0x01;
  44   2                      P2=0x02;// 写数据周期结束
  45   2              }
  46   1      }
  47           //
  48          void delay(uint t)
  49          {
  50   1              for(;t>0;t--);//循环一次延时11us
  51   1      }
  52          
  53          //18b20复位程序
  54          
  55          void reset()
C51 COMPILER V8.02   CHAOSHENG                                                             05/25/2007 11:20:26 PAGE 2   

  56          {
  57   1              bit bdata flag=1;
  58   1              while(flag)
  59   1              {
  60   2                      while(flag)
  61   2                      {
  62   3                              DS=1;
  63   3                              _nop_(); _nop_();  _nop_();
  64   3                              DS=0;//以上程序段制造一个下降延
  65   3                              delay(50);//延时550us  最短延时480us
  66   3                              DS=1;//18b20在上升延后等待15~60us发出存在脉冲,低电平持续60~240us 复位成功
  67   3                              delay(3);
  68   3                              flag=DS;
  69   3                      }
  70   2      
  71   2                      delay(50);//延时550us 看电平能不能升高  如果能升高证明是 低电平脉冲
  72   2                      DS=1;
  73   2                      flag=~DS;
  74   2      
  75   2                 }
  76   1      
  77   1      }
  78          //18b20写命令函数
  79          
  80          void write(uchar rule)
  81           {
  82   1              uchar i,temp;
  83   1              for(i=0;i<8;i++)
  84   1              {
  85   2                              temp=rule&0x01;
  86   2                              DS=1;
  87   2                              _nop_(); _nop_();  _nop_();
  88   2                              DS=0;//以上程序段制造一个下降延
  89   2                              _nop_(); _nop_();  _nop_();
  90   2                              DS=temp;//从低位起 按位取出 送给18B20
  91   2                              rule=rule>>1;
  92   2                              delay(6);//延时66us
  93   2              }
  94   1              DS=1;
  95   1              delay(1);
  96   1       }
  97          
  98          //读一温度字节
  99          uchar read()
 100          {
 101   1              uchar data i;
 102   1              uchar data temp=0x00;
 103   1              uchar data value=0;
 104   1              for(i=0;i<8;i++)
 105   1              {
 106   2                              DS=1;
 107   2                              _nop_(); _nop_();  _nop_();
 108   2                              DS=0;//以上程序段制造一个下降延
 109   2                              _nop_(); _nop_();  _nop_();
 110   2                              DS=1;
 111   2                              _nop_(); _nop_();  _nop_();
 112   2                              value>>=1;
 113   2                              DS=0;
 114   2                              _nop_(); _nop_();  _nop_(); _nop_();
 115   2                              DS=1;
 116   2                              _nop_(); _nop_();  _nop_(); _nop_();
 117   2                              if(DS) value|=0x80;
C51 COMPILER V8.02   CHAOSHENG                                                             05/25/2007 11:20:26 PAGE 3   

 118   2                              delay(6);
 119   2              }
 120   1              DS=1;
 121   1              return(value);
 122   1      }
 123          //读出温度函数
 124          void read_temp()
 125          {
 126   1              reset();
 127   1              write(0xcc);//发skiprom命令
 128   1              write(0x44);//发送转换命令
 129   1              reset();
 130   1              write(0xcc);//发skiprom命令
 131   1              write(0xbe);   //读命令
 132   1              temp_data[0]=read();
 133   1              temp_data[1]=read();
 134   1              reset();
 135   1      
 136   1      
 137   1      }
 138          
 139          //数据处理显示函数
 140          
 141          uchar deal_dis()
 142          {
 143   1              uchar data k;
 144   1              uchar data tmp[2];
 145   1              uchar  data  dis_data[6];
 146   1              dis_data[0]=':';
 147   1              if(temp_data[1]>127)  //判断小于零
 148   1              {
 149   2                      temp_data[1]=~temp_data[1]+1;
 150   2                      temp_data[0]=~temp_data[0]+1;
 151   2                      dis_data[1]='-';
 152   2              }
 153   1              else
 154   1                      dis_data[1]=0x20;   //清空单元
 155   1              tmp[0]=temp_data[1]<<4;
 156   1              tmp[1]=temp_data[0]>>4;
 157   1              tmp[1]=tmp[1]&0x0f;
 158   1              tmp[0]=tmp[0]|tmp[1];//整数部分
 159   1              tmp[1]=temp_data[0]&0x0f;  //小数部分
 160   1              dis_data[2]=*(num_data+tmp[0]%100/10);
 161   1              dis_data[3]=*(num_data+tmp[0]%10);      //dis_data[0--3]内容是"-" 高位到低位
 162   1              dis_data[4]='.';
 163   1              if(tmp[1]==0x00)
 164   1                    dis_data[5]='0';
 165   1              else if(tmp[1]==0x0f)
 166   1                   dis_data[5]='9';
 167   1              else
 168   1                   dis_data[5]= *(num_data+tmp[1]/2+1);
 169   1              for(k=0;k<10;k++);  //延时大约100us
 170   1              cmd(0x94); //位置 //
 171   1              for(k=0;k<10;k++);  //延时大约100us
 172   1              dat(dis_data ,6);     //  温度
 173   1              return(tmp[0]); //返回温度整数部分用来超声波计算超声波速度
 174   1      
 175   1      }
 176           //开始发送超声波
 177          void send_wave()
 178          {
 179   1              uchar w;
C51 COMPILER V8.02   CHAOSHENG                                                             05/25/2007 11:20:26 PAGE 4   

 180   1              START=0;//开始发送超声波
 181   1              TR0=1;
 182   1              for(w=0;w<15;w++);//延时大约100us
 183   1              START=1;  //停止发送
 184   1              for(w=0;w<5;w++);//延时等待超声波换能器余震 过去
 185   1              EX0=1;//外部中断0允许
 186   1      }
 187          
 188          // 测试失败
 189          void failed()
 190          {
 191   1               uchar k;
 192   1               for(k=0;k<10;k++);  //延时大约100us
 193   1               cmd(0x9c); //位置
 194   1               for(k=0;k<10;k++);  //延时大约100us
 195   1               dat(fail,8);    //距离
 196   1      }
 197          //计算速度和距离并显示
 198          void  math(uchar t)
 199          {
 200   1              uint data s;
 201   1              float  v;
 202   1              uchar data i;
 203   1              float data temp1,temp2;
 204   1              uchar data distan_data[6];
 205   1              uint data div;//记录有多少个100个脉冲 用来解决直接计算的越界问题
 206   1              v=331.5+0.6*t;
 207   1              s=v;                  //s是整形量 用来存储v的整数部分
 208   1              distan_data[0]=':';
 209   1              distan_data[1]=' ';
 210   1              distan_data[2]=*(num_data+s/100);
 211   1              distan_data[3]=*(num_data+s%100/10);
 212   1              distan_data[4]=*(num_data+s%10);
 213   1              for(i=0;i<10;i++);  //延时大约100us
 214   1              cmd(0x8c); //位置
 215   1              for(i=0;i<10;i++);  //延时大约100us
 216   1              dat(distan_data,5);    //距离
 217   1             // plus_data=50001 ;
 218   1              if(plus_data>50000||TF0==1)
 219   1               {
 220   2                      failed();
 221   2                      for(i=0;i<100;i++);  //延时大约100us
 222   2                      return ;
 223   2               }
 224   1               plus_data/=2;
 225   1              div=plus_data/100;
 226   1              plus_data=plus_data%100;
 227   1              temp1=100*v/1000;

⌨️ 快捷键说明

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