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

📄 t2-18b20.lst

📁 RZ-51V20 实例程序
💻 LST
字号:
C51 COMPILER V8.18   T2_18B20                                                              01/06/2010 20:47:34 PAGE 1   


C51 COMPILER V8.18, COMPILATION OF MODULE T2_18B20
OBJECT MODULE PLACED IN T2-18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE T2-18B20.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include <intrins.h>
   3          
   4          sbit DQ   = P3^3;       //定义DS18B20端口DQ
   5          sbit BEEP = P3^6;       //定义蜂鸣器控制端口
   6          
   7          bit presence;           //检测DS18B20标志位
   8          
   9          unsigned char code LEDData[] =
  10          {
  11            0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 
  12            0xF8, 0x80, 0x90, 0xff, 0xc6, 0x9c, 0xbf
  13          };
  14          
  15          unsigned char  shift,n = 0;
  16          
  17          unsigned char data temp_data[2]; //温度数据存放单元
  18          unsigned char data display[7];   //显存单元
  19          
  20          
  21          /**********************************************************
  22          
  23          us延时子函数  (8*1.085)*num
  24          
  25          **********************************************************/
  26          void Delay(unsigned int num) //延时函数
  27          {
  28   1         while (--num)
  29   1          ;
  30   1      }
  31          
  32          /**********************************************************
  33          
  34          ms延时子函数
  35          
  36          **********************************************************/
  37          void delayms(unsigned int ms)
  38          {
  39   1         unsigned char k;
  40   1         while (ms--)
  41   1         {
  42   2           for (k = 0; k < 114; k++)
  43   2            ;
  44   2         }
  45   1      }
  46          
  47          /**********************************************************
  48          
  49          蜂鸣器驱动子函数
  50          
  51          **********************************************************/
  52          void beep()
  53          {
  54   1         unsigned char i;
  55   1         for (i = 0; i < 180; i++)
C51 COMPILER V8.18   T2_18B20                                                              01/06/2010 20:47:34 PAGE 2   

  56   1         {
  57   2           Delay(80);
  58   2           BEEP = !BEEP;    //BEEP取反
  59   2         }
  60   1         BEEP = 1;          //关闭蜂鸣器
  61   1         delayms(100);      //延时100ms
  62   1      }
  63          
  64          /**********************************************************
  65          
  66          DS18B20初始化子函数
  67          
  68          presence=0  OK  presence=1  ERROR
  69          
  70          **********************************************************/
  71          unsigned char Init_DS18B20(void)
  72          {
  73   1         DQ = 0;            //单片机发出低电平复位信号
  74   1         Delay(60);         //延时>480us
  75   1         DQ = 1;            //释放数据线
  76   1         Delay(8);          //延时>64us,等待应答
  77   1      
  78   1         presence = DQ;     //接收应答信号
  79   1         Delay(50);         //延时>400us,等待数据线出现高电平
  80   1         DQ = 1;            //释放数据线
  81   1         
  82   1         return (presence); //返回presence信号
  83   1      }
  84          
  85          /**********************************************************
  86          
  87          读一个字节数据子函数
  88          
  89          **********************************************************/
  90          unsigned char ReadOneChar(void)
  91          {
  92   1        unsigned char i;
  93   1        unsigned char dat = 0;
  94   1      
  95   1        EA = 0;                  //读取温度数据时,要关闭中断。
  96   1        DQ = 1;
  97   1        for (i = 0; i < 8; i++)
  98   1        {
  99   2           DQ = 0;                //给低脉冲信号
 100   2           dat >>= 1;
 101   2           DQ = 1;                //释放总线
 102   2           _nop_();
 103   2           _nop_();
 104   2           if(DQ)               //读总线电平状态
 105   2           dat |= 0x80;          //最高位置1
 106   2           Delay(6);             //延时>45us
 107   2           DQ = 1;               //释放总线,表示此次读操作完成
 108   2         }
 109   1         EA = 1;                 //开中断
 110   1         return (dat);           //返回所读得数据
 111   1      }
 112          
 113          /**********************************************************
 114          
 115          写一个字节数据子函数
 116          
 117          **********************************************************/
C51 COMPILER V8.18   T2_18B20                                                              01/06/2010 20:47:34 PAGE 3   

 118          void WriteOneChar(unsigned char dat)
 119          {
 120   1         unsigned char i;
 121   1        
 122   1         for (i = 0; i < 8; i++)  //一个字节8个bit
 123   1         {
 124   2           DQ = 0;                //给低脉冲信号
 125   2           Delay(1);              //延时<15us
 126   2           DQ = (bit)(dat&0x01);  //写1bit数据
 127   2           dat >>= 1;             //数据右移一位
 128   2           Delay(6);              //延时>45us
 129   2           DQ = 1;                //释放总线,表示此次写操作完成
 130   2         }
 131   1      }
 132          
 133          /**********************************************************
 134          
 135          温度数据转换子函数
 136          
 137          **********************************************************/
 138          void Temperature_conver()
 139          {
 140   1         bit minus = 0;
 141   1      
 142   1         display[0]=0x0b;                //显示 C
 143   1         display[1]=0x0c;                //显示 ° 
 144   1      
 145   1         if (temp_data[1] > 127)         //温度为负值
 146   1         {
 147   2           temp_data[0] = (~temp_data[0]) + 1; //取反加一,将补码变成原码
 148   2           if ((~temp_data[0]) >= 0xff)
 149   2            temp_data[1] = (~temp_data[1]) + 1;
 150   2           else
 151   2            temp_data[1] = ~temp_data[1];
 152   2           minus = 1;                         //温度为负值标志
 153   2         }
 154   1      
 155   1         display[6] = temp_data[0] &0x0f;     //取小数位数据
 156   1         display[2] = (display[6] *10) / 16;  //保留一位小数
 157   1      
 158   1         display[6] = ((temp_data[0] &0xf0) >> 4)|((temp_data[1] &0x0f) << 4); //取整数
 159   1          
 160   1         display[5] = display[6] / 100;        //百位
 161   1         display[4] = (display[6] % 100) / 10; //十位
 162   1         display[3] = display[6] % 10;         //个位
 163   1      
 164   1         if (!display[5])
 165   1         {
 166   2           display[5] = 0x0a;   //高位为0,不显示
 167   2           if (!display[4])
 168   2           display[4] = 0x0a;   //次高位为0,不显示
 169   2         }
 170   1      
 171   1         if (minus)
 172   1         {
 173   2           display[5] = 0x0d;   //显示负号
 174   2         }
 175   1      }
 176          
 177          /**********************************************************
 178          
 179          主函数
C51 COMPILER V8.18   T2_18B20                                                              01/06/2010 20:47:34 PAGE 4   

 180          
 181          **********************************************************/
 182          void main(void)
 183          {
 184   1         P0 = 0xff;
 185   1         P2 = 0xff;
 186   1        
 187   1         T2CON = 0x00;           //设置T2CON寄存器       
 188   1         TH2 = 0xfc;             //1ms定时常数
 189   1         TL2 = 0x66;
 190   1         ET2 = 1;                //允许Timer2中断
 191   1         EA = 1;                 //总中断允许
 192   1         TR2 = 1;                //启动定时器2
 193   1         shift = 0x7f;           //送位码初值
 194   1      
 195   1         while (1)
 196   1         {
 197   2          Init_DS18B20();
 198   2          if (presence == 0)
 199   2          {
 200   3            WriteOneChar(0xCC);  //跳过ROM匹配操作
 201   3            WriteOneChar(0x44);  //启动温度转换
 202   3            delayms(2);
 203   3          }
 204   2      
 205   2          Init_DS18B20();
 206   2          if (presence == 0)
 207   2          {
 208   3            WriteOneChar(0xCC);  //跳过ROM匹配操作
 209   3            WriteOneChar(0xBE);  //读取温度寄存器
 210   3      
 211   3            temp_data[0] = ReadOneChar(); //读温度低8位
 212   3            temp_data[1] = ReadOneChar(); //读温度高8位
 213   3            
 214   3            Temperature_conver();         //温度数据转换
 215   3            delayms(200);
 216   3          }
 217   2          else
 218   2          {
 219   3            beep(); //蜂鸣器报警    
 220   3          }
 221   2         }
 222   1      }
 223          
 224          /**********************************************************
 225          
 226            Timer2中断服务子函数 (负责数码管显示)
 227          
 228          **********************************************************/
 229          void  timer2(void) interrupt 5 
 230          { 
 231   1         TF2 = 0;                    //手工清中断标志  
 232   1         TH2 = 0xfc;                 //1ms定时常数
 233   1         TL2 = 0x66;
 234   1      
 235   1         if (presence)               //如果DS18B20不存在
 236   1         {
 237   2           P2 = 0xff;                //关闭显示
 238   2           P0 = 0xff;
 239   2           return;                   //退出中断 
 240   2         }
 241   1      
C51 COMPILER V8.18   T2_18B20                                                              01/06/2010 20:47:34 PAGE 5   

 242   1         if(n >= 6)
 243   1         {
 244   2           n = 0;                    //中断计数单元清零
 245   2           shift = 0x7f;             //赋位码初值
 246   2           P2 = 0xff;                //关闭数码管显示 
 247   2         }
 248   1         else
 249   1         {
 250   2            if (n == 3)
 251   2            P0 = (LEDData[display[n]]) &0x7f; //加小数点显示    
 252   2            else
 253   2            P0 = LEDData[display[n]]; //送段码
 254   2      
 255   2            P2 = shift;               //送位码
 256   2            shift = shift>>1|0x80;    //修改位码
 257   2            n++;                      //计数值加1
 258   2         }
 259   1      }
 260          
 261          /*********************************************************/


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


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

⌨️ 快捷键说明

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