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

📄 ds18b20温度测量系统.lst

📁 DS18B20的51驱动。 用STC89C52成功测试。
💻 LST
字号:
C51 COMPILER V8.02   DS18B20温度测量系统                                                   11/23/2008 16:01:47 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DS18B20温度测量系统
OBJECT MODULE PLACED IN DS18B20温度测量系统.OBJ
COMPILER INVOKED BY: C:\软件\Keil\C51\BIN\C51.EXE DS18B20温度测量系统.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /**************************
   2          *这个死程序分明是对我有偏见
   3          ***************************/
   4          
   5          
   6          
   7          //声明部分-------------------------------------------------
   8          #include<AT89X52.h>
   9          unsigned char code seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //显示段码
  10          sbit TMDAT =P3^7; //DS18B20的数据输入/输出脚DQ,根据情况设定 - 39 -
  11          unsigned int sdata;//测量到的温度的整数部分
  12          unsigned char xiaoshu1;//小数第一位
  13          unsigned char xiaoshu2;//小数第二位
  14          unsigned char xiaoshu;//两位小数
  15          bit fg=1; //温度正负标志
  16          
  17          //显示延时程序--------------------------------1--------------
  18          void Delay(unsigned int tc){ 
  19   1              while( tc != 0 ){
  20   2                      unsigned char i;
  21   2                      for(i=0; i<100; i++);
  22   2                      tc--;
  23   2              }
  24   1      }
  25          
  26          //延时部分-------------------------------------2-------------
  27          void dmsec (unsigned int count){
  28   1              unsigned char i;
  29   1              while(count--){
  30   2                      for(i=0;i<115;i++);
  31   2              }
  32   1      }
  33          
  34          //发送复----------------------------------------3------------
  35          void tmreset (void){ 
  36   1              unsigned char i;
  37   1              TMDAT=0; for(i=0;i<103;i++);
  38   1              TMDAT = 1; for(i=0;i<4;i++);
  39   1      }
  40          
  41          //读一位//---------------------------------------4-----------                     
  42          bit tmrbit (void){      
  43   1              unsigned int i;
  44   1              bit dat;
  45   1              TMDAT = 0;      i++;
  46   1              TMDAT = 1; i++; i++; //微量延时 //      
  47   1              dat = TMDAT;
  48   1              for(i=0;i<8;i++);
  49   1              return (dat);
  50   1      }
  51          
  52          //读一个字节 -------------------------------------5----------
  53          unsigned char tmrbyte (){
  54   1              unsigned char i,j,dat;
  55   1              dat = 0;
C51 COMPILER V8.02   DS18B20温度测量系统                                                   11/23/2008 16:01:47 PAGE 2   

  56   1              for (i=1;i<=8;i++){
  57   2                      j = tmrbit(); 
  58   2                      dat = (j << 7) | (dat >> 1);
  59   2              }
  60   1              return (dat);
  61   1      }
  62          
  63          //写一个字节 --------------------------------------6---------
  64          void tmwbyte (unsigned char dat){ 
  65   1              unsigned char j,i;
  66   1              bit testb;
  67   1              for (j=1;j<=8;j++){
  68   2                      testb = dat & 0x01;
  69   2                      dat = dat >> 1;
  70   2      
  71   2                      if (testb){
  72   3                              TMDAT = 0; //写1
  73   3                              i++; i++;
  74   3                              TMDAT = 1;
  75   3                              for(i=0;i<8;i++);
  76   3                      }
  77   2                      else{
  78   3                              TMDAT = 0; //写0
  79   3                              for(i=0;i<8;i++);
  80   3                              TMDAT = 1;
  81   3                              i++; i++;
  82   3                      }
  83   2              }
  84   1      }
  85          
  86          //发送ds1820 开始转换------------------------------7-----------
  87          void tmstart (void){
  88   1               tmreset(); //复位
  89   1              dmsec(1); //延时
  90   1              tmwbyte(0xcc); //跳过序列号命令
  91   1              tmwbyte(0x44); //发转换命令 44H,
  92   1      }
  93          
  94          //读取温度-------------------------------------------8-------最关键的一步
  95          void tmrtemp (void){ 
  96   1              unsigned int a,b;
  97   1              tmreset (); //复位
  98   1              dmsec (1); //延时
  99   1              tmwbyte (0xcc); //跳过序列号命令
 100   1              tmwbyte (0xbe); //发送读取命令
 101   1              a = tmrbyte (); //读取低位温度
 102   1              b = tmrbyte (); //读取高位温度
 103   1              if(b>0x7f){ //最高位为1时温度是负
 104   2                      a=~a; b=~b+1; //补码转换,取反加一
 105   2                      fg=0; //读取温度为负时fg=0
 106   2              }
 107   1              sdata = a/16+b*16; //整数部分
 108   1              xiaoshu1 = (a&0x0f)*10/16; //小数第一位
 109   1              xiaoshu2 = (a&0x0f)*100/16%10;//小数第二位
 110   1              xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
 111   1      }
 112          
 113          //开始读取温度----------------------------------------9------
 114          void DS18B20PRO(void){
 115   1              tmstart();
 116   1      //      dmsec(5); //如果是不断地读取的话可以不延时 //
 117   1              tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //
C51 COMPILER V8.02   DS18B20温度测量系统                                                   11/23/2008 16:01:47 PAGE 3   

 118   1      }
 119          
 120          //显示温度---------------------------------------------10-----
 121          void Led(){
 122   1              if(fg==1){                                                       //温度为正时显示的数据
 123   2                      P1=0xfe;
 124   2                      P0=seg7code[sdata/10];                   //输出十位数
 125   2                      Delay(8); P1=0xfd;
 126   2                      P0=seg7code[sdata%10]|0x80;              //输出个位和小数点
 127   2                      Delay(8); P1=0xfb;
 128   2                      P0=seg7code[xiaoshu1];                   //输出小数点后第一位
 129   2                      Delay(8); P1=0xf7;
 130   2                      P0=seg7code[xiaoshu2];                   //输出小数点后第二位
 131   2                      Delay(4); P1=0xff;
 132   2              } 
 133   1              if(fg==0){                                                       //温度为负时显示的数据
 134   2                      P1=0xfe;
 135   2                      P0=seg7code[10];                                 //负号
 136   2                      Delay(8); P1=0xfd;
 137   2                      P0=seg7code[sdata/10]|0x80;              //输出十位数
 138   2                      Delay(8); P1=0xfb;
 139   2                      P0=seg7code[sdata%10];                   //输出个位和小数点
 140   2                      Delay(8); P1=0xf7;
 141   2                      P0=seg7code[xiaoshu1];                   //输出小数点后第一位
 142   2                      Delay(4); P1=0xff;
 143   2              }
 144   1      }
 145          
 146          //主函数-------------------------------------------------11---
 147          main(){
 148   1      //      sdata=26;
 149   1      //      xiaoshu1=8;
 150   1      //      xiaoshu2=3;
 151   1              while(1){
 152   2              //      fg=1;    
 153   2                      DS18B20PRO(); //调用读取温度函数
 154   2              Led();            //调用显示温度函数
 155   2              }
 156   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    543    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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