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

📄 tem_test.lst

📁 温度传感器的详细说明
💻 LST
字号:
C51 COMPILER V8.01   TEM_TEST                                                              11/08/2008 14:53:07 PAGE 1   


C51 COMPILER V8.01, COMPILATION OF MODULE TEM_TEST
OBJECT MODULE PLACED IN tem_test.OBJ
COMPILER INVOKED BY: C:\Program Files\keilc\C51\BIN\C51.EXE tem_test.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*----------------------------------www.ucdev.cn-----------------------------------------
   2                                ╔=======================================╗
   3                                ┆     ICE51-100开发板配套实验学习例程  ┆
   4                                ┆             Version 0.0.1            ┆
   5                                ┆                                      ┆
   6                                ┆               艾斯电子               ┆
   7                                ┆                                      ┆
   8                                ┆          http://www.ucdev.cn         ┆
   9                                ┆         E-mail:sales@ucdev.cn        ┆
  10                                ╚=======================================╝
  11          *********************************** 程序功能说明 *******************************************
  12          数码管显示当前温度
  13          ********************************************************************************************/
  14          
  15          #include <reg52.h>
  16          #define  uchar  unsigned char
  17          
  18          sbit DQ =P3^7; //18B20数据线引脚
  19          
  20          //数码管显示的段码表
  21          //uchar code table[] ={0x84,0xBD,0xE0,0xB0,0x99,0x92,0x82,0xBC,0x80,0x90};
  22          uchar code table[] ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  23                           //   0    1    2    3    4    5    6    7    8    9    
  24          //uchar code table_d[]={0x04,0x3D,0x60,0x30,0x19,0x12,0x02,0x3C,0x00,0x10};
  25          uchar code table_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  26                            //   0    1    2    3    4    5    6    7    8    9    
  27          
  28          uchar dispbuf[4]; //显示缓冲区   
  29          uchar  temper[2];//存放温度的数组       
  30          
  31          void seg_scan();               
  32          
  33          /*****************************延时函数**************************/
  34          
  35          void delay (unsigned int us)  
  36          {
  37   1        while(us--);
  38   1      }
  39          
  40          void reset(void)   //复位
  41          {
  42   1        uchar x=0;
  43   1        DQ = 1;
  44   1        delay(8);   //稍做延时
  45   1        DQ = 0;
  46   1        delay(80);   //精确延时 大于 480us
  47   1        DQ = 1;   //拉高总线
  48   1        delay(14);
  49   1        x=DQ;
  50   1        delay(20);
  51   1      }
  52          /**********************从DS18B20读一字节***************/
  53          uchar readbyte(void) //读1字节
  54          {
  55   1        uchar i=0;
C51 COMPILER V8.01   TEM_TEST                                                              11/08/2008 14:53:07 PAGE 2   

  56   1        uchar dat=0;
  57   1        for (i=8;i>0;i--)
  58   1        {
  59   2          DQ = 0;
  60   2          dat>>=1;
  61   2          DQ = 1;
  62   2          if(DQ)
  63   2          dat|=0x80;
  64   2          delay(4);
  65   2         }
  66   1        return(dat);
  67   1       }
  68          /***********************向DS18B20写一字节***********************/
  69          void writebyte(unsigned char dat) //写1字节
  70          {
  71   1        uchar i=0;
  72   1        for (i=8; i>0; i--)
  73   1        {
  74   2         DQ = 0;
  75   2         DQ = dat&0x01;
  76   2         delay(5);
  77   2         DQ = 1;
  78   2         dat>>=1;
  79   2         }
  80   1       delay(4);
  81   1      }
  82          /***********************CPU读取温度值***************************/
  83          void readtemp(void) //读取温度
  84          {
  85   1        uchar a=0,b=0;
  86   1        reset();
  87   1      
  88   1        seg_scan();
  89   1      
  90   1        writebyte(0xCC); // 跳过序列号
  91   1        writebyte(0x44); // 启动温度转换
  92   1        reset();
  93   1       
  94   1        seg_scan();
  95   1        
  96   1        writebyte(0xCC);
  97   1        writebyte(0xBE); //读9个寄存器,前两个为温度
  98   1      
  99   1        seg_scan(); 
 100   1      
 101   1        a=readbyte();   //低位
 102   1        b=readbyte();   //高位
 103   1      
 104   1        seg_scan();
 105   1      
 106   1        temper[0]=a&0x0f;
 107   1        a=a>>4;         //低位右移4位,舍弃小数部分
 108   1        temper[1]=b<<4;         //高位左移4位,舍弃符号位
 109   1        temper[1]=temper[1]|a;
 110   1        }
 111          
 112          /******************************显示*************************/
 113          
 114          void seg_scan()
 115          {    
 116   1        int i,j=0xFE;
 117   1        int dispdata;
C51 COMPILER V8.01   TEM_TEST                                                              11/08/2008 14:53:07 PAGE 3   

 118   1        for(i=0;i<4;i++)
 119   1          {
 120   2           P2=j;
 121   2           dispdata=dispbuf[i];
 122   2           if(i==1)
 123   2             P0=table_d[dispdata];
 124   2           else
 125   2             P0=table[dispdata];
 126   2           delay(500);
 127   2           j=(j<<1)|0x01;
 128   2           if(j==0xEF)j=0xFE;
 129   2           }  
 130   1      }
 131          
 132          /*******************************主函数***********************/
 133          
 134          main()
 135          { uchar i;
 136   1        uchar temp;
 137   1        float backbit;   
 138   1        for(i=0;i<4;i++)
 139   1         dispbuf[i] = 0;
 140   1        while(1){
 141   2             readtemp();//读18B20
 142   2             backbit = temper[0];//换成浮点数
 143   2             backbit = backbit * 6.25;//乘以0.0625*100
 144   2             temp = backbit;//取低2位整数部分
 145   2             dispbuf[3] = temp%10 ;
 146   2             
 147   2             temp = temp/10;
 148   2             dispbuf[2] = temp%10 ;
 149   2             
 150   2             temp = temper[1];//取整数部分
 151   2             dispbuf[1] = temp%10;
 152   2             
 153   2             temp = temp/10;
 154   2             dispbuf[0]= temp%10;
 155   2             
 156   2                 seg_scan(); //显示扫描 
 157   2        }
 158   1      }
 159          
 160          /********************************结束************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    381    ----
   CONSTANT SIZE    =     20    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6       8
   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 + -