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

📄 18b20shu.lst

📁 用18B20数字温度传感器芯片 实现温度采集 并在数码管(用7290)显示
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   18B20SHU                                                              05/13/2009 13:23:37 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE 18B20SHU
OBJECT MODULE PLACED IN 18B20SHU.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18B20SHU.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "reg51.H"
   2          #include "intrins.h"
   3          #define  DELAY5US _nop_();
   4          
   5          sbit    SDA=P1^0;
   6          sbit    SCL=P1^1;
   7          sbit    P1_7=P1^7;
   8          #define WSLA1 0x70
   9          #define RSLA1 0x71
  10          
  11          
  12          
  13          sbit DQ=P3^3;  
  14          //***************   函数声明   *********************
  15          void STA(void);
  16          void STOP(void);
  17          void CACK(void);
  18          void WRBYT(unsigned char  *p);
  19          void WRNBYT(unsigned char  *R3,unsigned char  *R2,unsigned char  *R0,unsigned char  n);
  20          unsigned b[20]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe4,0xfe,0xf6,0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0xfa,0x1e,
             -0x12,0x00};
  21          
  22          unsigned char GET_TEMPER();
  23          unsigned char temp[2],temp_num;
  24          void INIT_1820();                     //初始化函数
  25          void TEMP_COV();                      //温度转换函数
  26          void WRITE_1820(unsigned char datax); //写DS18B20函数
  27          void READ_1820();                     //读DS18B20函数
  28          void DELAY60US(); 
  29          void DELAY80US();
  30          void DELAY300US();
  31          void DELAY();
  32          unsigned char FLAG1;
  33          //***************   主函数   *********************
  34          main()
  35          {
  36   1      //unsigned char datay;
  37   1      
  38   1      unsigned char a[8]={0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc};
  39   1      unsigned char shu,n,*c,*y,*x,wai=0x10,WSLA=WSLA1,f4,ffh,ffl,xiaoh,xiaol;//f4是小数的二进制数
  40   1      unsigned long int h=0,f,ff;
  41   1      //P1=0xff; 
  42   1      while(1)
  43   1              {  
  44   2                      GET_TEMPER();   //采集温度函数(数据在temp[0]、temp[1]中)
  45   2                      TEMP_COV();         //将12位精度的数值转换成8位温度值在temp_num中
  46   2                      h=(unsigned long int)temp_num;
  47   2                      f4=temp[0]&0x0f;
  48   2                      f=(unsigned long int)f4;
  49   2                      ff=f*10000/16;
  50   2                      xiaoh=ff/100;
  51   2                      xiaol=ff%100;
  52   2      
  53   2                      shu=(unsigned char)h;
  54   2                      a[4]=shu%10;//a[0]为个位
C51 COMPILER V8.02   18B20SHU                                                              05/13/2009 13:23:37 PAGE 2   

  55   2                      a[4]=b[a[4]]+1;//将a【0】变为字符码
  56   2                      a[5]=shu%100;
  57   2                      a[5]=a[5]/10;
  58   2                      a[5]=b[a[5]];
  59   2                      a[6]=shu/100;
  60   2                      a[6]=b[a[6]];
  61   2      
  62   2                      ffh=(unsigned char)xiaoh;
  63   2                      a[2]=ffh%10;
  64   2                      a[2]=b[a[2]];
  65   2                      a[3]=ffh/10;
  66   2                      a[3]=b[a[3]];
  67   2      
  68   2                      ffl=(unsigned char)xiaol;
  69   2                      a[0]=ffl%10;
  70   2                      a[0]=b[a[0]];
  71   2                      a[1]=ffl/10;
  72   2                      a[1]=b[a[1]];
  73   2      
  74   2                      x=&WSLA;
  75   2                      c=&wai;
  76   2                      y=a;
  77   2                      n=8;
  78   2                      WRNBYT(x,c,y,n);
  79   2                      DELAY();
  80   2      
  81   2                      //datay=temp_num;  //缓冲
  82   2                      //P1=~datay;        //数据取反后送P1口输出
  83   2              } 
  84   1      }
  85          
  86          
  87          
  88          unsigned char GET_TEMPER()
  89          {   unsigned char i;
  90   1              DQ=1;
  91   1      BCD:INIT_1820();        //对DS18B20初始化
  92   1              if(FLAG1!=1)
  93   1                goto BCD;         //如果18B20不存在返回继续
  94   1              DELAY80US();    //存在时延时
  95   1              i=0xcc;             //写ROM命令(跳过序列号)
  96   1              WRITE_1820(i);
  97   1              i=0x44;             //发送温度转换命令
  98   1              WRITE_1820(i);
  99   1              DELAY();                //延时等待转换
 100   1      CBA:INIT_1820();        //对DS18B20初始化
 101   1              if(FLAG1!=1)
 102   1                 goto CBA;    //如果18B20不存在返回继续
 103   1              DELAY80US();    //存在时延时
 104   1              i=0xcc;             //写ROM命令(跳过序列号)
 105   1              WRITE_1820(i);   
 106   1              i=0xbe;             //发出读温度命令
 107   1              WRITE_1820(i);   
 108   1              READ_1820();    //READ_1820 
 109   1      
 110   1      } 
*** WARNING C173 IN LINE 110 OF 18B20SHU.C: missing return-expression
 111          
 112          void INIT_1820() 
 113          {   DQ=1;
 114   1              _nop_();
 115   1              DQ=0;
C51 COMPILER V8.02   18B20SHU                                                              05/13/2009 13:23:37 PAGE 3   

 116   1              DELAY300US();   
 117   1              DQ=1;
 118   1              DELAY80US(); 
 119   1              if(DQ!=0x01) FLAG1=0x01;        //建立标志
 120   1                else FLAG1=0x00;
 121   1              DELAY300US();
 122   1              DQ=1;                                           //释放总线
 123   1      }
 124          
 125          void WRITE_1820(unsigned char datax)
 126          {   unsigned char i;
 127   1              for(i=0;i<8;i++)
 128   1              {               //DQ=0后15US之内就应当把数据发送到DQ上
 129   2              DQ=0;                   
 130   2              _nop_();                
 131   2              _nop_();                
 132   2              _nop_();
 133   2              _nop_();
 134   2              _nop_();
 135   2              _nop_();
 136   2              _nop_();        
 137   2              if(datax & 0x01)DQ=1;  //根据datax 组装发送位DQ
 138   2              else  DQ=0;        //或者使用 DQ=datax&0x01;
 139   2              datax=datax>>1;
 140   2              DELAY60US();               //DS18B20在DQ=0的15-60us内采样DQ                             
 141   2              DQ=1;
 142   2              _nop_();
 143   2               }      
 144   1      }
 145            
 146          void READ_1820()                //从DS18B20中连续读出两个字节温度值
 147          {  unsigned char i,j;   //数据送temp[2]中,其中temp[0]为低8位,temp[1]为高四位
 148   1         for(i=0;i<2;i++)
 149   1                { temp[i]=0xff;
 150   2                  for(j=0;j<8;j++)
 151   2                      {
 152   3                        DQ=1;
 153   3                        _nop_();
 154   3                        DQ=0;         //拉低DQ
 155   3                        _nop_();      //维持1US       
 156   3                        DQ=1;         //释放  
 157   3                        _nop_();   //DQ=0后15US内主控器必须完成采样DQ
 158   3                        temp[i]=temp[i]>>1;
 159   3                        if(DQ==1) temp[i]=temp[i]|0x80;
 160   3                              else temp[i]=temp[i]&0x7f;
 161   3                        DELAY60US();                  //>60US 后释放DQ                  
 162   3                       }        
 163   2                }
 164   1      }
 165          
 166          void TEMP_COV()                 //将temp[0]、temp[1]中的12位数职去掉低4位(小数)
 167          {unsigned char i,j;     //合并到 temp_num中
 168   1       i=temp[0]&0xf0;
 169   1       i=i>>4;
 170   1       j=temp[1]<<4;
 171   1       temp_num=i|j;
 172   1       }
 173          

⌨️ 快捷键说明

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