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

📄 two_ds1820_lcd_write.lst

📁 89C52单片机12M晶振下DS18B20温度传感器测量温度应用子程序源码
💻 LST
字号:
C51 COMPILER V7.50   TWO_DS1820_LCD_WRITE                                                  08/11/2005 20:24:45 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TWO_DS1820_LCD_WRITE
OBJECT MODULE PLACED IN two_DS1820_LCD_write.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE two_DS1820_LCD_write.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          
   3          
   4          
   5          
   6          //**********************************************************************//
   7          //                                          头文件区                                //
   8          //**********************************************************************//
   9          
  10          #include <reg52.h>                                      /*单片机内部寄存器*/
  11          
  12          #include <intrins.h>                            /*内部函数调用,如_nop_() 、_crol_()、cror();*/
  13          
  14          #include <absacc.h>                             /*绝对地址访问,如XBYTE[0x0fff0]*/
  15          
  16          #include <LCD1602_packet.h>                             /*LCD 的初始化*/
  17          
  18          #define pot 10
  19          unsigned char disp[17]="temperature is:  ";
  20          unsigned char disp_number[]="0123456789.";
  21          unsigned char buffer[17]="                 ";  
  22          //unsigned char temp[10];
  23          
  24          unsigned char ROM_0_code[]={0x28,0x25,0xb3,0x84,0x00,0x00,0x00,0x95};
  25          unsigned char ROM_1_code[]={0x28,0x50,0xe2,0x84,0x00,0x00,0x00,0xbe};
  26          
  27          /*--------------------------------------------------------------------------
  28          DS1820.H
  29          
  30          
  31          --------------------------------------------------------------------------*/
  32          sbit TSOR = P1^3;
  33          
  34          
  35          //**********************************************************************//
  36          //                                      延时子程序                                 //
  37          //**********************************************************************//
  38          /*void delay(unsigned int d)
  39          {
  40                  while(d--);
  41          }
  42          */
  43          void delay100ms(void)
  44          {
  45   1              unsigned char i,j,k;
  46   1              for(i=0;i<8;i++)
  47   1                      for(j=0;j<25;j++)
  48   1                              for(k=0;k<250;k++);
  49   1      }
  50          
  51          void delay15us(void)
  52          {
  53   1              unsigned char i;
  54   1              for(i=0;i<8;i++);
  55   1      }
C51 COMPILER V7.50   TWO_DS1820_LCD_WRITE                                                  08/11/2005 20:24:45 PAGE 2   

  56          
  57          void delay60us(void)
  58          {
  59   1              unsigned char i;
  60   1              for(i=0;i<30;i++);
  61   1      }
  62          
  63          void write_0_DS(void)//写 bit 0
  64          {//写数据位0:置总线为低电平并保持至少15us,
  65   1      //然后保持低电平15us~45us等待从端对电平采样,最后拉高电平完成写操作
  66   1              TSOR=1;
  67   1              TSOR=0;
  68   1              delay15us();
  69   1              delay15us();
  70   1              delay15us();
  71   1              delay15us();
  72   1              delay15us();
  73   1      
  74   1              TSOR=1;
  75   1      
  76   1              _nop_();
  77   1              _nop_();
  78   1      }
  79          
  80          void write_1_DS(void)//写 bit 1
  81          {//写数据位1:置总线为低电平并保持1us~15us,
  82   1      //然后拉高电平并保持15us~45us等待从端对电平采样,最后完成写操作
  83   1              TSOR=1;
  84   1              TSOR=0;
  85   1              _nop_();
  86   1              _nop_();
  87   1              _nop_();
  88   1              _nop_();
  89   1              _nop_();
  90   1              _nop_();
  91   1              _nop_();
  92   1      
  93   1              TSOR=1;
  94   1      
  95   1              _nop_();
  96   1              _nop_();
  97   1              _nop_();
  98   1              _nop_();
  99   1              _nop_();
 100   1              _nop_();
 101   1              _nop_();
 102   1              delay15us();
 103   1              delay15us();
 104   1      }
 105          
 106          
 107          bit read_DS(void)//读取数据位
 108          {//读数据位:置总线为低电平并保持至少1us,然后拉高电平保持1us,
 109   1      //在15us内采样总线电平获得数据,延时45us完成读操作
 110   1              bit b;
 111   1      
 112   1              TSOR=1;
 113   1              TSOR=0;
 114   1              _nop_();
 115   1              _nop_();
 116   1              _nop_();
 117   1      
C51 COMPILER V7.50   TWO_DS1820_LCD_WRITE                                                  08/11/2005 20:24:45 PAGE 3   

 118   1              TSOR=1;
 119   1      
 120   1              _nop_();
 121   1              _nop_();
 122   1              _nop_();
 123   1      
 124   1              b=TSOR;
 125   1      
 126   1              delay15us();
 127   1              delay15us();
 128   1              delay15us();
 129   1              _nop_();
 130   1              _nop_();
 131   1      
 132   1              return b;
 133   1      }
 134          
 135          void reset_DS(void)//复位总线
 136          {//总线复位:置总线为低电平并保持480us,然后拉高电平,
 137   1      //等待从端重新拉低电平作为响应,则总线复位完成
 138   1              unsigned char i;
 139   1      
 140   1              TSOR=1;
 141   1              TSOR=0;
 142   1              for(i=0;i<9;i++)
 143   1              delay60us();
 144   1              TSOR=1;
 145   1      
 146   1              while(TSOR);//程序的关键,总线控制器发出(TX)一个复位脉冲(一个最少480us的
 147   1              //低电平信号),然后释放总线,进入接收状态(RX)。单线总线由4.7K上拉电阻拉到
 148   1              //到高电平。探测到I/0引脚上的上升沿后,DS182015等待15~60us,然后发出存在脉冲
 149   1              //(一个60~240us的低电平信号。
 150   1      
 151   1              for(i=0;i<3;i++)
 152   1              delay60us();    
 153   1      }
 154          
 155          void write_byte_DS(unsigned char byte)//写一个字节(byte)
 156          {
 157   1              unsigned char i;
 158   1              for(i=0;i<8;i++)
 159   1              {
 160   2                      if(byte & 0x01==0x01)           //最低bit是否为0?
 161   2                              write_1_DS();
 162   2                      else 
 163   2                              write_0_DS();
 164   2                      byte=byte>>1;
 165   2              }
 166   1      }
 167          
 168          unsigned char read_byte_DS(void)        //读一个字节(byte)
 169          {
 170   1              unsigned char i,j=0;
 171   1              bit b;
 172   1      
 173   1              for(i=0;i<8;i++)
 174   1              {
 175   2                      b=read_DS();                            //读取1bit
 176   2                      if(b)                                           //为1否?
 177   2                              j+=1;
 178   2                      j=_cror_(j,1);                          //循环右移1位
 179   2              }
C51 COMPILER V7.50   TWO_DS1820_LCD_WRITE                                                  08/11/2005 20:24:45 PAGE 4   

 180   1              return j;
 181   1      }
 182          
 183          void DS1820_system_Init(void)
 184          {
 185   1              reset_DS();                                             //复位总线
 186   1              write_byte_DS(0xcc);                    //忽略ROM匹配操作
 187   1              write_byte_DS(0x4e);                    //设置写模式
 188   1              write_byte_DS(0x64);                    //写温度上限TH为100度
 189   1              write_byte_DS(0x8a);                    //写温度下限为负10度
 190   1              write_byte_DS(0x1f);                    //写温度计配置寄存器
 191   1      }
 192          
 193          
 194          int get_temperature_0_DS1820(void)                              //获得温度,2字节的数据分别放在MSB,LSB中
 195          {
 196   1              unsigned char i;
 197   1              unsigned char MSB=0,LSB=0;//温度值的整数部分,小数部分
 198   1      
 199   1              reset_DS();                                             //复位总线
 200   1              write_byte_DS(0x55);                    //ROM匹配操作
 201   1      
 202   1              for(i=0;i<8;i++)
 203   1              {
 204   2                      write_byte_DS(ROM_0_code[i]);
 205   2              }
 206   1      
 207   1              write_byte_DS(0x44);                    //温度转换命令
 208   1              delay100ms();
 209   1      
 210   1              reset_DS();                                             //复位总线
 211   1              write_byte_DS(0x55);                    //ROM匹配操作
 212   1      
 213   1              for(i=0;i<8;i++)
 214   1              {
 215   2                      write_byte_DS(ROM_0_code[i]);
 216   2              }
 217   1      
 218   1              write_byte_DS(0xbe);                    //读取寄存器
 219   1      
 220   1              LSB=read_byte_DS();                             //读取第1字节
 221   1              MSB=read_byte_DS();                             //读取第2字节
 222   1      /*      read_byte_DS();                                 //读取第3字节
 223   1              read_byte_DS();                                 //读取第4字节
 224   1              read_byte_DS();                                 //读取第5字节
 225   1              read_byte_DS();                                 //读取第6字节
 226   1              read_byte_DS();                                 //读取第7字节
 227   1              read_byte_DS();                                 //读取第8字节
 228   1              read_byte_DS();                                 //读取第9字节*/
 229   1      
 230   1              MSB=MSB<<4;
 231   1              MSB+=(LSB&0xf0)>>4;                             //获得温度值整数部分
 232   1              LSB=(LSB&0x0f) ? 5:0;                   //获得温度值小数部分
 233   1              return (MSB*10+LSB);
 234   1      }
 235          
 236          int get_temperature_1_DS1820(void)                              //获得温度,2字节的数据分别放在MSB,LSB中
 237          {
 238   1              unsigned char i;
 239   1              unsigned char MSB=0,LSB=0;//温度值的整数部分,小数部分
 240   1      
 241   1              reset_DS();                                             //复位总线
C51 COMPILER V7.50   TWO_DS1820_LCD_WRITE                                                  08/11/2005 20:24:45 PAGE 5   

 242   1              write_byte_DS(0x55);                    //ROM匹配操作
 243   1      
 244   1              for(i=0;i<8;i++)
 245   1              {
 246   2                      write_byte_DS(ROM_1_code[i]);
 247   2              }
 248   1      
 249   1              write_byte_DS(0x44);                    //温度转换命令
 250   1              delay100ms();
 251   1      
 252   1              reset_DS();                                             //复位总线
 253   1              write_byte_DS(0x55);                    //ROM匹配操作
 254   1      
 255   1              for(i=0;i<8;i++)
 256   1              {
 257   2                      write_byte_DS(ROM_1_code[i]);
 258   2              }
 259   1      
 260   1              write_byte_DS(0xbe);                    //读取寄存器
 261   1      
 262   1              LSB=read_byte_DS();                             //读取第1字节
 263   1              MSB=read_byte_DS();                             //读取第2字节
 264   1      /*      read_byte_DS();                                 //读取第3字节
 265   1              read_byte_DS();                                 //读取第4字节
 266   1              read_byte_DS();                                 //读取第5字节
 267   1              read_byte_DS();                                 //读取第6字节
 268   1              read_byte_DS();                                 //读取第7字节
 269   1              read_byte_DS();                                 //读取第8字节
 270   1              read_byte_DS();                                 //读取第9字节
 271   1      */
 272   1              MSB=MSB<<4;
 273   1              MSB+=(LSB&0xf0)>>4;                             //获得温度值整数部分
 274   1              LSB=(LSB&0x0f) ? 5:0;                   //获得温度值小数部分
 275   1              return (MSB*10+LSB);
 276   1      }
 277          
 278          
 279          void main(void)
 280          {
 281   1      
 282   1              LCD_system_Init ();
 283   1      
 284   1              DS1820_system_Init();
 285   1      
 286   1              while(1)
 287   1              {
 288   2                      buffer[0]=disp_number[get_temperature_0_DS1820()/100];
 289   2                      buffer[1]=disp_number[get_temperature_0_DS1820()/10%10];
 290   2                      buffer[2]=disp_number[pot];
 291   2                      buffer[3]=disp_number[get_temperature_0_DS1820()%10];
 292   2      
 293   2                      buffer[7]=disp_number[get_temperature_1_DS1820()/100];
 294   2                      buffer[8]=disp_number[get_temperature_1_DS1820()/10%10];
 295   2                      buffer[9]=disp_number[pot];
 296   2                      buffer[10]=disp_number[get_temperature_1_DS1820()%10];
 297   2      
 298   2      
 299   2      
 300   2                      LCD_display(0,0,disp);
 301   2                      LCD_display(1,2,buffer);
 302   2              }  
 303   1      }
C51 COMPILER V7.50   TWO_DS1820_LCD_WRITE                                                  08/11/2005 20:24:45 PAGE 6   



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    765    ----
   CONSTANT SIZE    =    173    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     64       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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