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

📄 fantest.lst

📁 风扇控制程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 290   2            Delay_us(CN_45us);    /* 延时45us */
 291   2            AD_TEMP2 = 0;
 292   2            Delay_us(CN_525us);   /* 精确延时大于480us,取525us */
 293   2            AD_TEMP2 = 1;          /* 拉高端口 */
 294   2            Delay_us(CN_30us);
 295   2            k=0; /* 滤波计数器. */
 296   2            for(j=0;j<10;j++)
 297   2            {
C51 COMPILER V7.50   FANTEST                                                               07/21/2006 16:14:00 PAGE 6   

 298   3               if(!AD_TEMP2)       /* 如果检测结果为0则初始化成功,为1则失败. */
 299   3               {
 300   4                  k++;             /* 检测到低电平加1. */
 301   4               }
 302   3            }
 303   2            if(k>3)
 304   2                gb_18b20init2_ok = TRUE; /* 复位成功. */
 305   2            else
 306   2                gb_18b20init2_ok = FALSE;/* 复位失败. 温感开路或温感损坏 */
 307   2            Delay_us(CN_200us);
 308   2            k=0;
 309   2            AD_TEMP2=1;                  /* 输入允许 */
 310   2            if(TRUE==gb_18b20init2_ok)
 311   2            {
 312   3                for(j=0;j<10;j++)
 313   3                {
 314   4                   if(AD_TEMP2)          /* 如果检测结果为1则初始化成功,为0则失败. */
 315   4                   {
 316   5                      k++;                 /* 检测到高电平加1 */
 317   5                   }
 318   4                }
 319   3                if(k>3)
 320   3                   gb_18b20init2_ok = TRUE;    /* 复位成功 */
 321   3                else
 322   3                   gb_18b20init2_ok = FALSE;   /* 复位失败, 温感对地短路 */
 323   3            }
 324   2        }
 325   1      }
 326          
 327          /***************************************************************************
 328          函数名称: DS18B20_Readchar
 329          函数功能: 从DS18B20读一个字节
 330          输入参数: 温度传感器号
 331          输出参数: 返回读取的字节型值
 332          ***************************************************************************/
 333          uchar DS18B20_Readchar(uchar temp_number)
 334          {
 335   1        uchar i,d_data;
 336   1      
 337   1        d_data=0;
 338   1        if(temp_number==CN_TEMP1)
 339   1        {
 340   2            for (i=8;i>0;i--)
 341   2            {  
 342   3               EA = 0;
 343   3               AD_TEMP1 = 0;  /* 给脉冲信号  */
 344   3               d_data>>=1;
 345   3               AD_TEMP1 = 1;  /* 读允许     */
 346   3               if(AD_TEMP1)
 347   3               d_data|=0x80;
 348   3               EA = 1;
 349   3               Delay_us(CN_60us);
 350   3            }
 351   2            EA = 1;
 352   2        }
 353   1        if(temp_number==CN_TEMP2)
 354   1        {
 355   2            for (i=8;i>0;i--)
 356   2            {
 357   3               EA = 0;
 358   3               AD_TEMP2 = 0;  /* 给脉冲信号  */
 359   3               d_data>>=1;
C51 COMPILER V7.50   FANTEST                                                               07/21/2006 16:14:00 PAGE 7   

 360   3               AD_TEMP2 = 1;  /* 读允许     */
 361   3               if(AD_TEMP2)
 362   3               d_data|=0x80;
 363   3               EA = 1;
 364   3               Delay_us(CN_60us);
 365   3            }
 366   2            EA = 1;
 367   2        }
 368   1        Delay_us(CN_60us);
 369   1        return(d_data);
 370   1      }
 371          
 372          /***************************************************************************
 373          函数名称: DS18B20_Writechar
 374          函数功能: 向DS18B20写一个字节
 375          输入参数: 要写入的字节型参数, 温度传感器号
 376          输出参数: 无
 377          ***************************************************************************/
 378          void DS18B20_Writechar(uchar d_data,uchar temp_number)
 379          {
 380   1        uchar i;
 381   1      
 382   1        if(temp_number==CN_TEMP1)
 383   1        {
 384   2           for (i=8;i>0;i--)
 385   2           {
 386   3              EA = 0;
 387   3              AD_TEMP1 = 0;
 388   3              AD_TEMP1 = d_data&0x01;
 389   3              Delay_us(CN_45us);
 390   3              EA = 1;
 391   3              AD_TEMP1 = 1;
 392   3              d_data>>=1;
 393   3           }
 394   2           EA = 1;
 395   2        }
 396   1        if(temp_number==CN_TEMP2)
 397   1        {
 398   2           for (i=8;i>0;i--)
 399   2           {
 400   3              EA = 0;
 401   3              AD_TEMP2 = 0;
 402   3              AD_TEMP2 = d_data&0x01;
 403   3              Delay_us(CN_45us);
 404   3              EA = 1;
 405   3              AD_TEMP2 = 1;
 406   3              d_data>>=1;
 407   3           }
 408   2           EA = 1;
 409   2        }
 410   1        Delay_us(CN_60us);
 411   1      }
 412          
 413          /***************************************************************************
 414          函数名称: DS18B20_Gettemp
 415          函数功能: 从DS18B20读取温度值
 416          输入参数: 温度传感器号
 417          输出参数: 字节型温度值(全局变量)
 418          ***************************************************************************/
 419          void DS18B20_Gettemp(uchar temp_number)
 420          {
 421   1         uchar temp_low;
C51 COMPILER V7.50   FANTEST                                                               07/21/2006 16:14:00 PAGE 8   

 422   1         uchar temp_high;
 423   1         uchar i,j;
 424   1         uint  k;
 425   1         uchar temp_buff[5];
 426   1      
 427   1         for(i=0;i<5;i++)  /* 进行5次温度检测,以避免检测数据错误. */
 428   1         {
 429   2            DS18B20_Init(temp_number);
 430   2            DS18B20_Writechar(0xCC,temp_number); /* 跳过读序列号操作 */
 431   2            DS18B20_Writechar(0xBE,temp_number); /* 读取温度寄存器操作,共可读9个,前两个是温度 */
 432   2            temp_low  = DS18B20_Readchar(temp_number);
 433   2            temp_high = DS18B20_Readchar(temp_number);
 434   2            DS18B20_Init(temp_number);
 435   2            k = temp_high;
 436   2            k<<=8;
 437   2            k = k|temp_low;
 438   2            k>>=4;       /* 将精度变为1度 */
 439   2            k=k&0x00FF;  /* 消去高8位 */
 440   2            temp_buff[i]=k;
 441   2         }
 442   1         for(i=0;i<5;i++)
 443   1         {
 444   2            temp_low  = temp_buff[i];
 445   2            temp_high = 0;
 446   2            for(j=0;j<5;j++)
 447   2            {
 448   3               if(temp_buff[i]==temp_buff[j])
 449   3                    temp_high++;       /* 如果发现一次两个温度值相等,则计数器加1 */
 450   3            }
 451   2            if(temp_high>=4)
 452   2            {
 453   3                if(temp_buff[i]>=128)  /* 符号位为负, 表示为负温度 */
 454   3                {
 455   4                    temp_buff[i] = temp_buff[i]-255;
 456   4                    temp_buff[i] = temp_buff[i]-1;
 457   4                }
 458   3                else
 459   3                {
 460   4                    temp_buff[i] = temp_buff[i];
 461   4      
 462   4                  
 463   4                }   
 464   3                if(temp_number==CN_TEMP1 && gb_18b20init1_ok==TRUE)
 465   3                {
 466   4                    g_temp_value1 = temp_buff[i];  /* 将温度值写入温度寄存器1 */
 467   4                }
 468   3                if(temp_number==CN_TEMP2 && gb_18b20init2_ok==TRUE)
 469   3                {
 470   4                    g_temp_value2 = temp_buff[i];  /* 将温度值写入温度寄存器2 */
 471   4                }
 472   3                break;
 473   3            }
 474   2        
 475   2         DS18B20_Writechar(0xCC,temp_number); /* 跳过读序列号操作 */
 476   2         DS18B20_Writechar(0x44,temp_number); /* 启动温度转换    */
 477   2         WDG_CONTR = 0x35;                    /* 喂狗,2秒看门狗定时 */ 
 478   2      }
 479   1      
 480   1       }
 481          
 482          
 483           /***************************************************************************
C51 COMPILER V7.50   FANTEST                                                               07/21/2006 16:14:00 PAGE 9   

 484          函数名称: TEMP_handle
 485          函数功能: 根据获取的两路温度值进行处理,变为所需的温度值
 486          输入参数: 无
 487          输出参数: 无
 488          ***************************************************************************/ 
 489          void TEMP_handle()
 490          {
 491   1         Delay_Set(CN_10ms);
 492   1         g_temp_getcnt++;
 493   1         DS18B20_Gettemp(CN_TEMP1);
 494   1         DS18B20_Gettemp(CN_TEMP2);
 495   1        if(g_temp_getcnt>=70)
 496   1              {
 497   2               WDG_CONTR = 0x35;                                   /*喂狗,2秒看门狗定时 */ 
 498   2        if ((TRUE == gb_18b20init1_ok) || (TRUE == gb_18b20init1_ok) )
 499   2           g_temp_value = (g_temp_value1 + g_temp_value2)/2;   /* 两路温感均正常,取其平均值*/
 500   2        if (FALSE == gb_18b20init1_ok)                         /* 如果温感1坏*/
 501   2           g_temp_value = g_temp_value2;                       /* 温度取温感2的值*/
 502   2        if (FALSE == gb_18b20init2_ok)                         /* 如果温感2坏*/
 503   2           g_temp_value = g_temp_value1;                       /* 温度取温感1的值*/
 504   2        else g_temp_value = 0;                                 /* 两路温感均坏,取0*/
 505   2        if (g_temp_value >=99)
 506   2           g_temp_value = 99;                                  /* 如果大于99度,取99*/
 507   2        if (g_temp_value <=-9)
 508   2           g_temp_value = -9;                                  /* 如果小于-9度,取-9*/
 509   2         else 
 510   2           g_temp_value = g_temp_value;       
 511   2        if (g_temp_value > SUP_temp || g_temp_value < LOW_temp)
 512   2            AD_OVTEMP_ALM = 0;  
 513   2                AD_TEMP_LED=0;                               /* 高低温告警输出*/
 514   2              }
 515   1      } 
 516          
 517            /***************************************************************************
 518          函数名称: Display_handle
 519          函数功能: 根据温度值进行处理,并在数码管显示
 520          输入参数: 无
 521          输出参数: 无
 522          ***************************************************************************/
 523          void Display_handle()
 524          {
 525   1              uchar i,j;
 526   1          uchar code data_arry [11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};   /*  定义"0~9,-"
             -*/
 527   1          i=g_temp_value%10;
 528   1              j=g_temp_value/10;
 529   1               LE1 = 0; LE2=1;                    /* 开个位显示*/
 530   1               P2 = data_arry[i];           /* 显示个位*/
 531   1               Delay_Set(CN_5ms);
 532   1               LE1 = 1;          LE2 = 0;         /* 开十位显示*/
 533   1               P2 = data_arry[j];           /* 显示十位*/
 534   1               Delay_Set(CN_5ms);
 535   1               LE2 = 1;
 536   1      }
 537          
 538           /***************************************************************************
 539          函数名称: System_Init
 540          函数功能: 系统初始化
 541          输入参数: 无
 542          输出参数: 无
 543          ***************************************************************************/
 544          void System_Init()
C51 COMPILER V7.50   FANTEST                                                               07/21/2006 16:14:00 PAGE 10  

 545          {       uchar x;
 546   1          P1M0 = 0x01;             /*  P1.0为开漏,其余I/O为传统口*/       
 547   1          P1M1 = 0x01;
 548   1              g_ADC_fan=0;
 549   1              Delay_Set(CN_1000ms);
 550   1              AD_FAN_ALM      = 1;            /* 关闭风机告警输出  */
 551   1          AD_TEMP_ALM     = 1;            /* 设温感正常;关闭告警输出 */
 552   1              AD_TEMP_LED     = 1;            /* 设温感正常;告警灯灭 */
 553   1              g_temp1_errcnt  = 0;            /* 温感1故障计数器清0  */
 554   1          g_temp2_errcnt  = 0;            /* 温感2故障计数器清0  */
 555   1              AD_FAN_CONT1    = CN_FAN_ON;    /* 开启第一组风机*/
 556   1              AD_FAN_CONT2    = CN_FAN_OFF;    /* 开启第二组风机*/    
 557   1              
 558   1         for(x=0;x<10;x++)                /* 做10次温度转换,稳定参数.   */
 559   1         {
 560   2            DS18B20_Gettemp(CN_TEMP1);
 561   2            DS18B20_Gettemp(CN_TEMP2);
 562   2            Delay_Set(CN_200ms);
 563   2         }    
 564   1      }
 565          
 566          
 567          void main()
 568            {
 569   1        System_Init();
 570   1        while(1)
 571   1        {
 572   2              TEMP_handle();
 573   2              Display_handle();
 574   2         }
 575   1        }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    882    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11      10
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      6    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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