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

📄 zlg7289demo2.lst

📁 使用89c51单片机实现单总线多个DS18B20测温
💻 LST
字号:
C51 COMPILER V7.50   ZLG7289DEMO2                                                          01/12/2008 22:13:59 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE ZLG7289DEMO2
OBJECT MODULE PLACED IN ZLG7289Demo2.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\c51.exe ZLG7289Demo2.c DB OE SMALL ROM(LARGE)

line level    source

   1           
   2          #include "ZLG7289.h" 
   3           
   4          
   5          sbit DQ = P1^3;  //定义DS18B20端口DQ  
   6          sbit BEEP=P1^7 ;
   7          
   8          unsigned char presence,j ;
   9          unsigned char code rom[4][8]={0x28,0x62,0x77,0x39,0x01,0x00,0x00,0xff,
  10                                        0x28,0xbe,0x7e,0x39,0x01,0x00,0x00,0xb5,
  11                                        0x28,0xbb,0xd7,0x5d,0x01,0x00,0x00,0x00,
  12                                        0x28,0x73,0xeb,0x5d,0x01,0x00,0x00,0x9b};
  13          unsigned char   temp_data[8] = {0x00,0x00};     //读到的温度值
  14          unsigned int   H_T=250,L_T=190,crru_temp=0,temp=0;                  //设定的最高、最低温度阈值 
  15          unsigned char   key_flag=0,HL_flag=0,mem_flag=1;
  16          unsigned char   display[6] ={0x00,0x00,0x00,0x00,0x00,0x00}; //数码管显示的值 
  17          unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  18                                              0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //小数点转换
  19          volatile unsigned char key = 0xFF; 
  20          void beep(); 
  21          unsigned char   alarm=0;     //显示开关标记
  22          
  23          
  24          void INT0_SVC() interrupt 0 
  25          { 
  26   1        key = ZLG7289_Key(); 
  27   1        key_flag=1;
  28   1       } 
  29            
  30           
  31           
  32          /* 
  33          函数:Delay() 
  34          功能:延时0.01 655.36s 
  35          参数: 
  36           t>0时,延时(t*0.01)s 
  37           t=0时,延时655.36s 
  38          说明: 
  39            晶振采用11.0592MHz 
  40          */ 
  41          void Delay(unsigned int t) 
  42          { 
  43   1        do 
  44   1       { 
  45   2        TH0 = 0xDC; 
  46   2        TL0 = 0x00; 
  47   2        TR0 = 1; 
  48   2         while ( !TF0 ); 
  49   2        TF0 = 0; 
  50   2        TR0 = 0; 
  51   2       } while (--t); 
  52   1      } 
  53           
  54           /**********************************************************/
  55          void Delayb20(unsigned int num)//延时函数
C51 COMPILER V7.50   ZLG7289DEMO2                                                          01/12/2008 22:13:59 PAGE 2   

  56          {
  57   1        while( --num );
  58   1      }
  59          
  60          /**********************************************************/
  61           Init_DS18B20(void)//初始化ds1820
  62          {
  63   1           EA=0; 
  64   1           DQ = 1;      //DQ复位
  65   1           Delayb20(8);    //稍做延时
  66   1      
  67   1           DQ = 0;      //单片机将DQ拉低
  68   1           Delayb20(90);   //精确延时 大于 480us
  69   1      
  70   1           DQ = 1;       //拉高总线
  71   1           Delayb20(8);
  72   1      
  73   1           presence = DQ;    //如果=0则初始化成功 =1则初始化失败
  74   1           Delayb20(100);
  75   1           DQ = 1; 
  76   1           EA=1;
  77   1           return(presence); //返回信号,0=presence,1= no presence
  78   1      }
  79          
  80          /**********************************************************/
  81          ReadOneChar(void)//读一个字节
  82          {
  83   1      unsigned char i = 0;
  84   1      unsigned char dat = 0;
  85   1      EA=0;
  86   1      for (i = 8; i > 0; i--)
  87   1        {
  88   2          DQ = 0; // 给脉冲信号
  89   2          dat >>= 1;
  90   2          DQ = 1; // 给脉冲信号
  91   2      
  92   2          if(DQ)
  93   2           dat |= 0x80;
  94   2          Delayb20(4);
  95   2        }
  96   1      EA=1;
  97   1          return (dat);
  98   1      }
  99          
 100          /**********************************************************/
 101          WriteOneChar(unsigned char dat)//写一个字节
 102          {
 103   1        unsigned char i = 0;
 104   1        EA=0;
 105   1        for (i = 8; i > 0; i--)
 106   1        {
 107   2          DQ = 0;
 108   2          DQ = dat&0x01;
 109   2          Delayb20(5);
 110   2      
 111   2          DQ = 1;
 112   2          dat>>=1;
 113   2        }
 114   1        EA=1;
 115   1      }
 116          /*********************************************************/
 117          Read_Romnum(void)      //读器件的系列号
C51 COMPILER V7.50   ZLG7289DEMO2                                                          01/12/2008 22:13:59 PAGE 3   

 118          {
 119   1         unsigned char i = 0;
 120   1         Init_DS18B20();
 121   1         if(presence==1)        
 122   1          { beep();alarm=1;}      //DS18B20不正常,蜂鸣器报警
 123   1          else
 124   1          {
 125   2            WriteOneChar(0x33);  // 跳过读序号列号的操作
 126   2          //  for(i=0;i<8;i++)
 127   2              //   rom[j][i]=ReadOneChar();        
 128   2          }
 129   1      }
 130          
 131          /*********************************************************/
 132          
 133          Read_Temperature()//读取温度
 134          {
 135   1          unsigned char i = 0,j=0,num=0;
 136   1          
 137   1          Init_DS18B20();
 138   1          if(presence==1)        
 139   1            { beep();alarm=1;}      //DS18B20不正常,蜂鸣器报警
 140   1          else 
 141   1           {
 142   2             WriteOneChar(0xCC);  // 跳过读序号列号的操作
 143   2             WriteOneChar(0x44);  // 启动温度转换
 144   2           }  
 145   1           
 146   1           
 147   1          for(num=0;num<3;num++)
 148   1           {
 149   2             Init_DS18B20();
 150   2             WriteOneChar(0x55);  //pipei序号列号的操作
 151   2             for(i=0;i<8;i++)
 152   2             {
 153   3                WriteOneChar(rom[num][i]);
 154   3              }
 155   2             WriteOneChar(0xBE);  //读取温度寄存器
 156   2      
 157   2             temp_data[num<<1] = ReadOneChar();   //温度低8位
 158   2             temp_data[(num<<1)+1] = ReadOneChar();   //温度高8位 
 159   2           }   
 160   1           if((mem_flag==1)||(mem_flag==2)||(mem_flag==3))
 161   1             {
 162   2               temp_data[6]=temp_data[(mem_flag-1)<<1];
 163   2               temp_data[7]=temp_data[((mem_flag-1)<<1)+1];
 164   2             }
 165   1           else if(mem_flag==4)
 166   1             {  
 167   2               for(j=0;j<3;j++)
 168   2               {
 169   3                 display[3]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 170   3                 display[2]=((temp_data[2]&0xf0)>>4)|((temp_data[3]&0x0f)<<4);
 171   3                 display[1]=((temp_data[4]&0xf0)>>4)|((temp_data[5]&0x0f)<<4);
 172   3                 display[5]=(display[1]+display[2]+display[3])%3;
 173   3                 temp=(display[1]+display[2]+display[3])/3;
 174   3                 display[4]=(temp_data[0]&0x0f)+(temp_data[2]&0x0f)+(temp_data[4]&0x0f);
 175   3                 display[2]=(display[4]+(display[5]<<4))/3;
 176   3                 display[0]=ditab[display[2]&0x0f]; 
 177   3                 display[4]=temp+((display[2]&0xf0)>>4);
 178   3               } 
 179   2             }           
C51 COMPILER V7.50   ZLG7289DEMO2                                                          01/12/2008 22:13:59 PAGE 4   

 180   1      }
 181          
 182          /*********************************************************/
 183          void beep()
 184            {
 185   1          unsigned char i;
 186   1          for (i=0;i<10;i++)
 187   1          {
 188   2            Delayb20(60);
 189   2            BEEP=!BEEP;                //BEEP取反
 190   2          } 
 191   1          BEEP=1;                      //关闭蜂鸣器
 192   1        }
 193            
 194          Disp_Temperature()//显示温度
 195          {
 196   1        if(alarm)
 197   1        {
 198   2          if(alarm==1)
 199   2          {
 200   3              display[3]=0x0b;
 201   3              display[2]=0x0b;
 202   3              display[1]=0x0a;
 203   3              display[0]=0x0a;
 204   3          }
 205   2          else if(alarm==2) 
 206   2          {
 207   3              display[3]=0x0c;
 208   3              display[2]=0x0b;
 209   3              display[1]=0x0a;
 210   3              display[0]=0x0a;
 211   3          }
 212   2          else if(alarm==3) 
 213   2          {
 214   3              display[3]=0x0d;
 215   3              display[2]=0x0b;
 216   3              display[1]=0x0a;
 217   3              display[0]=0x0a;
 218   3          }
 219   2        }
 220   1        else if(key==0xff)
 221   1        {
 222   2          if(mem_flag!=4)
 223   2          { 
 224   3           display[4]=temp_data[6]&0x0f;
 225   3           display[0]=ditab[display[4]];     //查表得小数位的值
 226   3           display[4]=((temp_data[6]&0xf0)>>4)|((temp_data[7]&0x0f)<<4);
 227   3          }
 228   2          display[3]=mem_flag;
 229   2          if(mem_flag==4)display[3]=0x0e;
 230   2          display[1]=display[4]%100;
 231   2          display[2]=display[1]/10;
 232   2          display[1]=display[1]%10;
 233   2          crru_temp=display[4];
 234   2          crru_temp=crru_temp*10+display[0];
 235   2          H_T=H_T%1000;
 236   2          L_T=L_T%1000;
 237   2          if(crru_temp>H_T)alarm=2;
 238   2          if(crru_temp<L_T)alarm=3;
 239   2        }
 240   1        else if(HL_flag==1)
 241   1        {
C51 COMPILER V7.50   ZLG7289DEMO2                                                          01/12/2008 22:13:59 PAGE 5   

 242   2           display[3]=0x0c;
 243   2           display[2]=H_T/100;
 244   2           display[1]=H_T/10%10;
 245   2           display[0]=H_T%10;  
 246   2        }
 247   1        else if(HL_flag==2)
 248   1        {
 249   2           display[3]=0x0d;
 250   2           display[2]=L_T/100;
 251   2           display[1]=L_T/10%10;
 252   2           display[0]=L_T%10;  
 253   2        }
 254   1        else if(key==59)
 255   1        {
 256   2           display[3]=mem_flag;
 257   2           if(mem_flag==4)display[3]=0x0e;
 258   2           display[2]=0x0a;
 259   2           display[1]=0x0a;
 260   2           display[0]=0x0a; 
 261   2        }
 262   1        
 263   1        ZLG7289_Download(0,4,0,display[0]); 
 264   1        ZLG7289_Download(0,5,1,display[1]); 
 265   1        ZLG7289_Download(0,6,0,display[2]); 
 266   1        ZLG7289_Download(0,7,1,display[3]); 
 267   1        //ZLG7289_Hide(8);  
 268   1      }
 269          
 270          void initTarg(void)      //初始化目标板
 271          {
 272   1              TMOD=0x21;
 273   1              TH0=0xDC;
 274   1              TL0=0x00;
 275   1              IT0=1;
 276   1              EA=1;
 277   1              EX0=1;
 278   1      }
 279          
 280          void main() 
 281          { 
 282   1      
 283   1        initTarg();
 284   1        //TMOD = 0x01; 
 285   1       Delay(30);    //延时300ms,等待ZLG7289复位完毕 
 286   1       ZLG7289_Init(20);  //调用ZLG7289的初始化函数 
 287   1       Delay(100); 
 288   1      //测试 
 289   1       ZLG7289_Test(); 
 290   1       Delay(200); 
 291   1      //复位 
 292   1       ZLG7289_Reset(); 
 293   1       Delay(100); 
 294   1       while(1)
 295   1       {
 296   2         if(key==0xff)
 297   2         {
 298   3           Read_Temperature();    
 299   3         }
 300   2         
 301   2         Disp_Temperature();
 302   2         if(key_flag)
 303   2         {
C51 COMPILER V7.50   ZLG7289DEMO2                                                          01/12/2008 22:13:59 PAGE 6   

 304   3          switch(key)
 305   3          {
 306   4           case 63:              //设定功能键
 307   4                  key_flag=1;
 308   4                  HL_flag ++;
 309   4                  if(HL_flag==3)HL_flag=1;
 310   4                  break;
 311   4          case 62:              //十位数加1
 312   4                  if(HL_flag==1) H_T=H_T+100;
 313   4                  if(HL_flag==2) L_T=L_T+100;
 314   4                  break;
 315   4          case 61:              //个位数加1
 316   4                  if(HL_flag==1) H_T=H_T+10;
 317   4                  if(HL_flag==2) L_T=L_T+10;
 318   4                  break;
 319   4          case 60:              //小数位加1
 320   4                  if(HL_flag==1) H_T=H_T+1;
 321   4                  if(HL_flag==2) L_T=L_T+1;
 322   4                  break;           
 323   4          case 59:              //说明测得是单个DS18b20温度  还是多个DS18b20的平均值
 324   4                  key_flag=1;
 325   4                  mem_flag++;
 326   4                  if(mem_flag==5)mem_flag=1;
 327   4                  break;
 328   4          case 58:              // 确认键
 329   4                  key_flag=0;
 330   4                  HL_flag=0;
 331   4                  key=0xff;
 332   4                  break;
 333   4          case 57:
 334   4                  break;
 335   4          default:break;
 336   4         }
 337   3         key_flag=0;
 338   3        } 
 339   2        
 340   2        if(alarm)
 341   2        {   
 342   3          beep();   
 343   3        }
 344   2        
 345   2        Delay(20);
 346   2        } 
 347   1        
 348   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1212    ----
   CONSTANT SIZE    =     48    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     29       4
   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 + -