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

📄 ds18b20.lst

📁 51单片机示例程序
💻 LST
字号:
C51 COMPILER V7.20   DS18B20                                                               03/15/2007 21:24:33 PAGE 1   


C51 COMPILER V7.20, 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                         DS18B20温度测量实验
   4                    网址:http://www.kaifaban.com
   5          
   6                 功能:在数码管上显示当前DS18B20测到的温度
   7                      小数部分为4位,温度为负时,最高位显示"-"
   8                                  测量范围:-55℃ ~ +125℃
   9          
  10          *******************************************************/
  11          #include <reg52.h>
  12          #include <intrins.h>
  13          #define  uint unsigned int
  14          #define  uchar unsigned char
  15          uchar Code[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; //共阳数码管编码表
  16          uchar Bit[8]={11,0,0,0,0,0,0,0}; //数码管各位显示的数字
  17          sbit DQ=P1^4; //定义连接DS18B20的IO口
  18          sbit DsySelect=P3^6; //控制数码管的74HC244所在IO口
  19          uchar BitCode=0x80; //数码管位码初值
  20          uchar MSB; //温度高字节
  21          uchar LSB; //温度低字节
  22          int t1=0; //温度整数部分数值
  23          uint t2=0; //温度小数部分数值
  24          uchar flag; //负温度标志
  25          //延时函数
  26          void delay(uchar count){
  27   1      uchar i;
  28   1      for(i=0;i<count;i++);
  29   1      }
  30          //初始化DS18B20
  31          void DS18B20Init(){
  32   1      DQ=0;          //下拉500us
  33   1      delay(60);
  34   1      DQ=1;          //释放总线
  35   1      delay(6);
  36   1      while(DQ);     //等待应答信号
  37   1      while(~DQ);    //等待释放总线
  38   1      }
  39          //读一个字节
  40          uchar ReadByte(){
  41   1      uchar i;
  42   1      uchar ReadData=0;
  43   1      for(i=0;i<8;i++){
  44   2      DQ=0;
  45   2      ReadData>>=1;
  46   2      DQ=1;
  47   2      if(DQ) ReadData|=0x80;
  48   2      delay(4);
  49   2      }
  50   1      return ReadData;
  51   1      }
  52          //写一个字节
  53          WriteByte(uchar WriteData){
  54   1      uchar i;
  55   1      uchar tmpData;
C51 COMPILER V7.20   DS18B20                                                               03/15/2007 21:24:33 PAGE 2   

  56   1      for(i=0;i<8;i++){
  57   2      tmpData=WriteData&0x01;
  58   2      WriteData>>=1;
  59   2      if(tmpData){
  60   3      DQ=0;
  61   3      DQ=1;
  62   3      delay(4);
  63   3      }else{
  64   3      DQ=0;
  65   3      delay(4);
  66   3      DQ=1;
  67   3      }
  68   2      }
  69   1      }
  70          //数码管扫描显示程序
  71          void Display(){
  72   1      uchar i;
  73   1      for(i=0;i<8;i++){
  74   2      P2=BitCode; //输出位码
  75   2      if(i==3){ //输出段码,如果第三位显示小数点
  76   3      P0=Code[Bit[i]]&0x7F;
  77   3      }else{
  78   3      P0=Code[Bit[i]];
  79   3      }
  80   2      BitCode=_cror_(BitCode,1); //位码循环右移一位
  81   2      delay(125); //延时1ms
  82   2      P0=0xFF;
  83   2      }
  84   1      }
  85          //温度计算程序
  86          void GetT(){
  87   1      if((MSB&0xF0)>0){ //判断是否为负温度
  88   2      flag=1;
  89   2      }else{
  90   2      flag=0;
  91   2      }
  92   1      if(flag){ //如果为负温度取反加1
  93   2      MSB=~MSB;
  94   2      LSB=~LSB+1;
  95   2      }
  96   1      t1=MSB<<4; //得到温度整数部分
  97   1      t1|=(LSB>>4);
  98   1      t2=(LSB&0x0F)*0.0625*10000; //得到温度小数部分并扩大10000倍
  99   1      //计算各位数码管要显示的数值
 100   1      if(flag){
 101   2      Bit[1]=10; //如果为负温度则显示"-"
 102   2      }else{
 103   2      Bit[1]=t1/100;
 104   2      }
 105   1      Bit[2]=t1%100/10;
 106   1      Bit[3]=t1%10;
 107   1      Bit[4]=t2/1000;
 108   1      Bit[5]=t2%1000/100;
 109   1      Bit[6]=t2%100/10;
 110   1      Bit[7]=t2%10;
 111   1      }
 112          //主程序
 113          main(){
 114   1      DsySelect=0; //打开数码管
 115   1      P0=0xFF; //复位P0口
 116   1      P2=0xFF; //复位P2口
 117   1      while(1){
C51 COMPILER V7.20   DS18B20                                                               03/15/2007 21:24:33 PAGE 3   

 118   2      DS18B20Init(); //复位DS18B20
 119   2      WriteByte(0xCC); //跳过ROM配置
 120   2      WriteByte(0x44); //启动温度转换
 121   2      DS18B20Init();
 122   2      WriteByte(0xCC);
 123   2      WriteByte(0xBE); //读温度寄存器
 124   2      LSB=ReadByte(); //读温度数据低字节
 125   2      MSB=ReadByte(); //读温度数据高字节
 126   2      GetT(); //计算温度
 127   2      Display(); //温度显示程序
 128   2      }
 129   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    428    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     28    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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