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

📄 lj.lst

📁 一则关于DS18B20的程序包括LED显示
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V8.02   LJ                                                                    06/10/2007 21:33:29 PAGE 1   


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

line level    source

   1          #include <reg51.H>
   2          #include <string.H>
   3          
   4          sbit ds = P1^0;
   5          int tempValue;
   6          
   7          char code disp_scan[]={0x0e,0Xd,0x0b,0x07};     //显示扫描码    
   8          char code disp_data[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};      //共阳LED数码管段码表“0”“1”
             -“2”“3”“4”“5”“6”“7”“8”“9”
   9          char code sd_data[]={'0','1','2','3','4','5','6','7','8','9'};
  10          
  11          //延时函数, 对于11.0592MHz时钟, 例i=10,则大概延时10ms.
  12          void delay(unsigned int i)
  13           {
  14   1          unsigned int j;
  15   1           while(i--)
  16   1           {
  17   2               for(j = 0; j < 125; j++);
  18   2           }
  19   1        }
  20           //初始化DS18B20
  21           //让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
  22          void dsInit()
  23            {
  24   1          //对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
  25   1          unsigned int i;  
  26   1          ds = 0;
  27   1          i = 100;   //拉低约800us, 符合协议要求的480us以上
  28   1          while(i>0) i--;
  29   1           ds = 1;    //产生一个上升沿, 进入等待应答状态
  30   1           i = 4;
  31   1           while(i>0) i--;
  32   1       }
  33           
  34           void dsWait()
  35             {
  36   1            unsigned int i;
  37   1            while(ds);  
  38   1             while(~ds);  //检测到应答脉冲
  39   1            i = 4;
  40   1             while(i > 0) i--;
  41   1        }
  42            
  43           //向DS18B20读取一位数据
  44           //读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, 
  45            //之后DS18B20则会输出持续一段时间的一位数据
  46            bit readBit()
  47             {
  48   1           unsigned int i;
  49   1            bit b;
  50   1           ds = 0;
  51   1          i++;   //延时约8us, 符合协议要求至少保持1us
  52   1           ds = 1; 
  53   1            i++; i++;  //延时约16us, 符合协议要求的至少延时15us以上
  54   1           b = ds;
C51 COMPILER V8.02   LJ                                                                    06/10/2007 21:33:29 PAGE 2   

  55   1           i = 8; 
  56   1           while(i>0) i--;  //延时约64us, 符合读时隙不低于60us要求
  57   1            return b;
  58   1        }
  59          
  60            //读取一字节数据, 通过调用readBit()来实现
  61            unsigned char readByte()
  62            {
  63   1            unsigned int i;
  64   1            unsigned char j, dat;
  65   1            dat = 0;
  66   1            for(i=0; i<8; i++)
  67   1             {
  68   2                j = readBit();
  69   2                //最先读出的是最低位数据
  70   2                dat = (j << 7) | (dat >> 1);
  71   2           }
  72   1           return dat;
  73   1       }
  74            
  75            //向DS18B20写入一字节数据
  76            void writeByte(unsigned char dat)
  77             {
  78   1            unsigned int i;
  79   1           unsigned char j;
  80   1            bit b;
  81   1            for(j = 0; j < 8; j++)
  82   1            {
  83   2                b = dat & 0x01;
  84   2                dat >>= 1;
  85   2                //写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
  86   2                if(b)   
  87   2                 {
  88   3                    ds = 0;
  89   3                   i++; i++;  //拉低约16us, 符号要求15~60us内
  90   3                    ds = 1;    
  91   3                    i = 8; while(i>0) i--;  //延时约64us, 符合写时隙不低于60us要求
  92   3                }
  93   2               else  //写"0", 将DQ拉低60us~120us
  94   2                {
  95   3                   ds = 0;
  96   3                   i = 8; while(i>0) i--;  //拉低约64us, 符号要求
  97   3                   ds = 1;
  98   3                   i++; i++;  //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
  99   3               }
 100   2           }
 101   1       }
 102           
 103          //向DS18B20发送温度转换命令
 104           void sendChangeCmd()
 105           {
 106   1          dsInit();    //初始化DS18B20, 无论什么命令, 首先都要发起初始化
 107   1           dsWait();   //等待DS18B20应答
 108   1           delay(1);    //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
 109   1           writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
 110   1           writeByte(0x44); //写入温度转换命令字 Convert T
 111   1       }
 112           
 113           //向DS18B20发送读取数据命令
 114           void sendReadCmd()
 115            {
 116   1           dsInit();
C51 COMPILER V8.02   LJ                                                                    06/10/2007 21:33:29 PAGE 3   

 117   1           dsWait();
 118   1           delay(1);
 119   1           writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
 120   1           writeByte(0xbe); //写入读取数据令字 Read Scratchpad
 121   1                                     }
 122           
 123           //获取当前温度值
 124           int getTmpValue()
 125            {
 126   1           unsigned int tmpvalue;
 127   1           int value; //存放温度数值
 128   1           float t;
 129   1           unsigned char low, high;
 130   1           sendReadCmd();
 131   1           //连续读取两个字节数据
 132   1           low = readByte(); 
 133   1           high = readByte();
 134   1           //将高低两个字节合成一个整形变量
 135   1           //计算机中对于负数是利用补码来表示的
 136   1           //若是负值, 读取出来的数值是用补码表示的, 可直接赋值给int型的value
 137   1           tmpvalue = high;
 138   1           tmpvalue <<= 8;
 139   1           tmpvalue |= low;

⌨️ 快捷键说明

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