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

📄 wend1u.lst

📁 数字温度计设计任务书,详细的代码
💻 LST
字号:
C51 COMPILER V8.02   WEND1U                                                                07/19/2007 19:56:23 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE WEND1U
OBJECT MODULE PLACED IN wend1u.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE wend1u.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //***********DS18B20数字温度计C程序****************//
   2          //*MCU:          AT89S51                          //
   3          //*MCU-crystal:  11.0592M                         //
   4          //*Version:      01                               //
   5          //*Last Updata:  2007-7-13                        //
   6          //*Author:       王文雄                           //
   7          //*Description:                                   //
   8          //89s51通过P3.4读写DS18B20内的数据                   //
   9          //温度传感器DS18B20采用器件默认的12位转化         //
  10          //最大转化时间750微秒,显示温度-55到+125度,显示精度//
  11          //为0.1度,显示采用4位LED共阳显示测温值           //
  12          //P1口为段码输出,P0.0~P0.5为位选                  //
  13          //************************************************//
  14          #include "reg51.h"
  15          #include "intrins.h"                            //_nop_();延时函数用
  16          #define  Disdata P1                             //段码输出口
  17          #define  discan  P0                             //扫描口
  18          #define  uchar unsigned char
  19          #define  uint  unsigned int
  20          sbit     DQ=P3^4;                               //温度输入口
  21          sbit     DIN=P1^7;                              //LED小数点控制
  22          sbit     music=P2^2;
  23          sbit     hold=P2^0;
  24          uint     h; 
  25          uint     temp;
  26          unsigned char presence,flash=0;
  27          uchar code ditab[16]=
  28          {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};      //温度小数部分用查表法
  29          //
  30          uchar code dis_7[14]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x9c,0xc6};
  31          //共阳LED段码表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-" "o" "C"        
  32          uchar code scan_con[6]={0xc1,0xc2,0xc4,0xc8,0xd0,0xe0};    //列扫描控制字
  33          uint data temp_data[2]={0x00,0x00};             //读出温度暂放
  34          uint data display[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共6个数据和一个运算暂用
  35          /*****************延时函数*************************/
  36          void delay(uint t)
  37          {
  38   1        for (;t>0;t--);
  39   1      }
  40          
  41          /********************************************************/
  42          /*                                                                                      
  43          /* 蜂鸣器驱动函数                                                                                    
  44          /*                                                                                                        
             -   
  45          /********************************************************/
  46           beep()
  47            {
  48   1          unsigned char i;
  49   1          for (i=0;i<100;i++)
  50   1          {
  51   2            music=1;
  52   2            delay(20);
  53   2           music=0;
  54   2          delay(20); 
C51 COMPILER V8.02   WEND1U                                                                07/19/2007 19:56:23 PAGE 2   

  55   2        } }
  56             
  57           /*******************************************************
  58               显示扫描函数1,在温度检测开始的时候显示HELLO!
  59           ********************************************************/
  60          scan1()
  61          { discan=scan_con[0];     //位选
  62   1        Disdata=0xf9;          //数据显示
  63   1        DIN=0; 
  64   1        delay(200);            //小数点显示
  65   1        discan=scan_con[1];    //位选
  66   1        Disdata=0xc0;          //数据显示
  67   1        delay(200);
  68   1        discan=scan_con[2];    //位选
  69   1        Disdata=0xc7;          //数据显示
  70   1        delay(200);
  71   1        discan=scan_con[3];    //位选
  72   1        Disdata=0xc7;          //数据显示
  73   1        delay(200);
  74   1        discan=scan_con[4];    //位选
  75   1        Disdata=0x86;          //数据显示
  76   1        delay(200);
  77   1        discan=scan_con[5];    //位选
  78   1        Disdata=0xc089;        //数据显示
  79   1        delay(200);
  80   1      
  81   1      }
  82          /****************显示扫描函数***************************/
  83          scan()
  84          {
  85   1         char k;
  86   1         for(k=0;k<6;k++)                   //6位LED扫描控制
  87   1      { 
  88   2      
  89   2        discan=scan_con[k];                 //位选
  90   2        Disdata=dis_7[display[k]];         //数据显示
  91   2        if (k==3)
  92   2        {DIN=0;}                          //小数点显示
  93   2        delay(200);
  94   2      }
  95   1      }
  96          //
  97          //
  98          /****************DS18B20复位函数************************/
  99          ow_reset(void)
 100          {
 101   1      char presence=1;
 102   1      while(presence)
 103   1      {
 104   2        while(presence)
 105   2         {
 106   3          DQ=1;_nop_();_nop_();//从高拉倒低
 107   3      DQ=0;                                       
 108   3      delay(50);                //550 us
 109   3      DQ=1;                                        
 110   3      delay(6);                //66 us
 111   3      presence=DQ;             //presence=0 复位成功,继续下一步
 112   3         } 
 113   2         delay(45);            //延时500 us
 114   2         presence=~DQ;         
 115   2      }
 116   1      DQ=1;                   //拉高电平
C51 COMPILER V8.02   WEND1U                                                                07/19/2007 19:56:23 PAGE 3   

 117   1      }
 118          //
 119          //
 120          /****************DS18B20写命令函数************************/
 121          void write_byte(uchar val)                    //向1-WIRE 总线上写1个字节
 122          { 
 123   1        uchar i;
 124   1        for(i=8;i>0;i--)
 125   1        {
 126   2         DQ=1;_nop_();_nop_();                  //从高拉倒低
 127   2         DQ=0;_nop_();_nop_();_nop_();_nop_();  //5 us
 128   2         DQ=val&0x01;                           //最低位移出
 129   2         delay(6);                              //66 us
 130   2         val=val/2;                             //右移1位
 131   2         }
 132   1         DQ=1;
 133   1         delay(1);
 134   1      }
 135          //
 136          /****************DS18B20读1字节函数************************/
 137          uchar read_byte(void)  //从总线上取1个字节
 138          {
 139   1      uchar i;
 140   1      uchar value=0;
 141   1      for(i=8;i>0;i--)
 142   1      {
 143   2        DQ=1;_nop_();_nop_();
 144   2        value>>=1;
 145   2        DQ=0;_nop_();_nop_();_nop_();_nop_();         //4 us
 146   2        DQ=1;_nop_();_nop_();_nop_();_nop_();         //4 us
 147   2        if(DQ)value|=0x80;
 148   2        delay(6);                                     //66 us
 149   2      }
 150   1      DQ=1;
 151   1      return(value);
 152   1      }
 153          //
 154          /****************读出温度函数************************/
 155          read_temp()
 156          {
 157   1        ow_reset();                           //总线复位
 158   1          if(presence==1)        
 159   1         { beep();flash=1;}                   //DS18B20不正常,蜂鸣器报警
 160   1          delay(200);
 161   1        write_byte(0xcc);                    //发命令
 162   1        write_byte(0x44);                   //发转换命令
 163   1        ow_reset(); 
 164   1        delay(1);
 165   1        write_byte(0xcc);                  //发命令
 166   1        write_byte(0xbe);
 167   1        temp_data[0]=read_byte();         //读温度值的第字节
 168   1        temp_data[1]=read_byte();          //读温度值的高字节
 169   1        temp=temp_data[1];
 170   1        temp<<=8;                                               
 171   1        temp=temp|temp_data[0];           // 两字节合成一个整型变量。
 172   1        return temp;                     //返回温度值
 173   1      }
 174          /****************温度数据处理函数************************/
 175          //二进制高字节的低半字节和低字节的高半字节组成一字节,这个
 176          //字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
 177          //下的低字节的低半字节转化成十进制后,就是温度值的小数部分
 178          /********************************************************/
C51 COMPILER V8.02   WEND1U                                                                07/19/2007 19:56:23 PAGE 4   

 179          work_temp(uint tem)
 180          {
 181   1      uchar n=0;
 182   1      if(tem>6348)                        // 温度值正负判断
 183   1           {tem=65536-tem;n=1;}                       // 负温度求补码,标志位置1           
 184   1            display[6]=tem&0x0f;          // 取小数部分的值
 185   1        display[2]=ditab[display[6]];     // 存入小数部分显示值
 186   1       display[6]=tem>>4;                         // 取中间八位,即整数部分的值
 187   1          display[0]=13;
 188   1              display[1]=12;      
 189   1        display[5]=(display[6])/100;      // 取百位数据暂存
 190   1        display[3]=(display[6])%100;      // 取后两位数据暂存
 191   1        display[4]=(display[3])/10;       // 取十位数据暂存
 192   1        display[3]=(display[3])%10;  
 193   1      /******************符号位显示判断**************************/
 194   1        if(!display[5]) 
 195   1        {
 196   2          display[5]=10;                 //最高位为0时不显示
 197   2          if(!display[4])
 198   2        {
 199   3         display[4]=10;                //次高位为0时不显示
 200   3        }
 201   2        }
 202   1        if(n)
 203   1        {display[5]=11;  //负温度时最高位显示"-"
 204   2        }         
 205   1        if(display[4]==2)
 206   1       {
 207   2         beep();                //当温度低于30°时开始报警
 208   2        }
 209   1      }
 210          /****************主函数************************/
 211          main()
 212          { int i;
 213   1        Disdata=0xff;                 //初始化端口
 214   1        discan=0xff;
 215   1         P2=0xff;
 216   1        ow_reset();                   //开机先转换一次
 217   1        write_byte(0xcc);             //Skip ROM
 218   1        write_byte(0x44);             //发转换命令
 219   1        for(h=0;h<100;h++)            //开机显示"HELLO!"
 220   1            {scan1();
 221   2                }
 222   1        while(1)
 223   1        {   if(flash)
 224   2            Disdata=0xff;            //DS18B20不正常关闭显示
 225   2                if(hold==0)
 226   2                for(i=0;;i++)
 227   2                {scan();
 228   3                if(hold==1) break;}
 229   2            else
 230   2            { work_temp(read_temp());         //处理温度数据
 231   3            scan(); 
 232   3                }                      //显示温度值
 233   2         }
 234   1      }
 235          //***********************结束**************************//


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    636    ----
   CONSTANT SIZE    =     36    ----
C51 COMPILER V8.02   WEND1U                                                                07/19/2007 19:56:23 PAGE 5   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24       2
   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 + -