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

📄 9 ds18b20.lst

📁 很好的51单片机仿真模板。
💻 LST
字号:
C51 COMPILER V8.08   9_DS18B20                                                             10/28/2008 12:22:28 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE 9_DS18B20
OBJECT MODULE PLACED IN 9 DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 9 DS18B20.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //安装目录下的 EXE 文件,通过串口线连接计算机与实验板,打开 
   2          //软件后可在软件界面上显示当前温度值。 
   3          #include <reg52.h> 
   4          #define uchar unsigned char 
   5          #define uint unsigned int 
   6          sbit DS=P2^2;           //define interface  定义 DS18B20 接口 
   7          uint temp;             // variable of temperature 
   8          uchar flag1;            // sign of the result positive or negative 
   9          sbit dula=P2^6; 
  10          sbit wela=P2^7; 
  11          unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 
  12                                                                  0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。 
  13          unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 
  14                                                           0x87,0xff,0xef};          //    带小数点编码。 
  15          void delay(uint count)      //延时子函数 
  16          { 
  17   1              uint i; 
  18   1              while(count) 
  19   1              { 
  20   2                      i=200; 
  21   2                      while(i>0) 
  22   2                      i--; 
  23   2                      count--; 
  24   2              } 
  25   1      } 
  26          ///////功能:串口初始化,波特率 9600,方式 1/////// 
  27          void Init_Com(void)    
  28          { 
  29   1              TMOD = 0x20; 
  30   1              PCON = 0x00; 
  31   1              SCON = 0x50; 
  32   1              TH1 = 0xFd; 
  33   1              TL1 = 0xFd; 
  34   1              TR1 = 1; 
  35   1      } 
  36           
  37          void dsreset(void)       //发送初始化及复位信号 
  38          { 
  39   1              uint i;                //DS18B20 初始化 
  40   1              DS=0; 
  41   1              i=103; 
  42   1              while(i>0)i--; 
  43   1              DS=1; 
  44   1              i=4; 
  45   1              while(i>0)i--; 
  46   1      } 
  47           
  48          bit tmpreadbit(void)       //read a bit 读一位 
  49          { 
  50   1              uint i; 
  51   1              bit dat; 
  52   1              DS=0;i++;          //i++ for delay  小延时一下 
  53   1              DS=1;i++;i++; 
  54   1              dat=DS; 
  55   1              i=8;while(i>0)i--; 
C51 COMPILER V8.08   9_DS18B20                                                             10/28/2008 12:22:28 PAGE 2   

  56   1              return (dat); 
  57   1      } 
  58           
  59          uchar tmpread(void)      //read a byte date  读一个字节 
  60          { 
  61   1              uchar i,j,dat; 
  62   1              dat=0; 
  63   1              for(i=1;i<=8;i++) 
  64   1              { 
  65   2                      j=tmpreadbit(); 
  66   2                      dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好//一个字节在 DAT 里 
  67   2              } 
  68   1              return(dat);             //将一个字节数据返回 
  69   1      } 
  70           
  71          void tmpwritebyte(uchar dat)      //write a byte to ds18b20 
  72          {                           //写一个字节到 DS18B20 里 
  73   1              uint i; 
  74   1              uchar j; 
  75   1              bit testb; 
  76   1              for(j=1;j<=8;j++) 
  77   1              { 
  78   2                      testb=dat&0x01; 
  79   2                      dat=dat>>1; 
  80   2                      if(testb)     //write 1     写 1 部分 
  81   2                      { 
  82   3                              DS=0; 
  83   3                              i++;i++; 
  84   3                              DS=1; 
  85   3                              i=8;while(i>0)i--; 
  86   3                      } 
  87   2                      else 
  88   2                      { 
  89   3                              DS=0;       //write 0    写 0 部分 
  90   3                              i=8;while(i>0)i--; 
  91   3                              DS=1; 
  92   3                              i++;i++; 
  93   3                      } 
  94   2              } 
  95   1      } 
  96           
  97          void tmpchange(void)    //DS18B20 begin change  发送温度转换命令 
  98          { 
  99   1              dsreset();             //初始化 DS18B20 
 100   1              delay(1);             //延时 
 101   1              tmpwritebyte(0xcc);  //  跳过序列号命令 
 102   1              tmpwritebyte(0x44);  //发送温度转换命令 
 103   1      } 
 104          uint tmp()               //get the temperature  获得温度 
 105          { 
 106   1              float tt; 
 107   1              uchar a,b; 
 108   1              dsreset(); 
 109   1              delay(1); 
 110   1              tmpwritebyte(0xcc);    
 111   1              tmpwritebyte(0xbe);    //发送读取数据命令 
 112   1              a=tmpread();          //连续读两个字节数据 
 113   1              b=tmpread(); 
 114   1              temp=b; 
 115   1              temp<<=8;             //two byte  compose a int variable 
 116   1              temp=temp|a;         //两字节合成一个整型变量。 
 117   1              tt=temp*0.0625;       //得到真实十进制温度值,因为 DS18B20 
C51 COMPILER V8.08   9_DS18B20                                                             10/28/2008 12:22:28 PAGE 3   

 118   1              //可以精确到 0.0625 度,所以读回数据的最低位代表的是 
 119   1              //0.0625 度。 
 120   1              temp=tt*10+0.5;   //放大十倍,这样做的目的将小数点后第一位 
 121   1              //也转换为可显示数字,同时进行一个四舍五入操作。 
 122   1              return temp;     //返回温度值 
 123   1      } 
 124          /*
 125          void readrom()          //read the serial  读取温度传感器的序列号 
 126          {                      //本程序中没有用到此函数 
 127                  uchar sn1,sn2; 
 128                  dsreset(); 
 129                  delay(1); 
 130                  tmpwritebyte(0x33); 
 131                  sn1=tmpread(); 
 132                  sn2=tmpread(); 
 133          } 
 134          */
 135          void display(uint temp)      //显示程序 
 136          { 
 137   1              uchar A1,A2,A2t,A3,ser; 
 138   1              ser=temp/10;           //分离出三位要显示的数字 
 139   1              SBUF=ser; 
 140   1              A1=temp/100; 
 141   1              A2t=temp%100; 
 142   1              A2=A2t/10; 
 143   1              A3=A2t%10; 
 144   1              dula=0; 
 145   1      
 146   1              P0=table[A1];    //显示百位 
 147   1              dula=1; 
 148   1              dula=0; 
 149   1              wela=0; 
 150   1              P0=0x7e; 
 151   1              wela=1; 
 152   1              wela=0; 
 153   1              delay(2); 
 154   1              
 155   1              P0=0;             //------------
 156   1              dula=1;           //该部分仿真必须要。
 157   1              dula=0;           //因为每次下一位的段选打开后,码值会先赋值给上一位,
 158   1              P0=0x7e;          //从而改变上一位的显示。然后再打开下一位的位选。
 159   1              wela=1;           //
 160   1              wela=0;           //------------
 161   1      
 162   1              //dula=0; 
 163   1              P0=table1[A2];   //显示十位  带小数点的 
 164   1              dula=1; 
 165   1              dula=0; 
 166   1              wela=0; 
 167   1              P0=0x7d; 
 168   1              wela=1; 
 169   1              wela=0; 
 170   1              delay(2);         //延时改为2 仿真需要
 171   1      
 172   1              P0=0;             //------------
 173   1              dula=1;           //该部分仿真需要
 174   1              dula=0;           //
 175   1              P0=0x7d;          //
 176   1              wela=1;           //
 177   1              wela=0;           //-------------
 178   1      
 179   1              P0=table[A3];    //显示个位 
C51 COMPILER V8.08   9_DS18B20                                                             10/28/2008 12:22:28 PAGE 4   

 180   1              dula=1; 
 181   1              dula=0; 
 182   1              P0=0x7b; 
 183   1              wela=1; 
 184   1              wela=0; 
 185   1              delay(2); 
 186   1              
 187   1              P0=0;             //------------
 188   1              dula=1;           //该部分仿真需要
 189   1              dula=0;           //
 190   1              P0=0x7b;          //
 191   1              wela=1;           //
 192   1              wela=0;           //-------------
 193   1      } 
 194          void main()               //主函数 
 195          { 
 196   1              uchar a; 
 197   1              Init_Com();            //初始化串口 
 198   1              do 
 199   1              { 
 200   2                      tmpchange();      //温度转换 
 201   2                      for(a=20;a>0;a--) 
 202   2                      {    
 203   3                              display(tmp());   //显示十次 
 204   3                      } 
 205   2              }               
 206   1              while(1); 
 207   1      } 
 208           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    516    ----
   CONSTANT SIZE    =     26    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      3       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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