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

📄 temper.lst

📁 利用89S51单片机
💻 LST
字号:
C51 COMPILER V8.08   TEMPER                                                                10/02/2008 18:07:41 PAGE 1   


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

line level    source

   1          /***********************************************************
   2          *函数功能:通过DS18B20温度传感器测得当前的温度值,再送入4位8段数码管显示
   3          *创建者:  曹兴
   4          *创建日期:2008-10-2
   5          *版本号:  20081002
   6          ***********************************************************/
   7          #include"reg51.h"
   8          #include "intrins.h"
   9          /*******************宏定义*********************************/
  10          #define  TH0_value  0x3C
  11          #define  TL0_value  0xB0
  12          #define  TMOD_value 0x01
  13          #define  TCON_value 0x15
  14          #define  IE_value   0x82
  15          #define  P0_value   0x0ff
  16          /*******************端口定义及开辟相应的存储单元***********/
  17          sbit  DQ = P2^2;                    //DS18B20单总线接入点          
  18          bit   flag  ;                       //检测芯片是否存在的标志位
  19          bit   singal;                           //符号位
  20          sbit  b=P1^0;                       //芯片存在P1.0置0点亮LED灯
  21          sbit  c=P1^1;                                   //芯片不存在P1.1置0点亮LED灯
  22          unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};      
  23                                          //8段数码管0~9数字的共阳显示代码
  24          unsigned char  buf[3] ;     //存储转换后温度的高8位与低8位      
  25          unsigned char  buf1[3];
  26          unsigned char  temper_value;  //存储转化后温度的结果值
  27          /********************************************************** 
  28          * 函数名:  延时子函数delay             
  29          * 函数功能:延时
  30          * 入口参数:i
  31          * 出口参数:无 
  32          ***********************************************************/
  33           void delay(unsigned char i)
  34          {
  35   1        while(--i);
  36   1       }
  37          /********************************************************** 
  38          * 函数名:  初始化子函数        reset_signal
  39          * 函数功能:信号复位进行初始化
  40          * 入口参数:无
  41          * 出口参数:无 
  42          ***********************************************************/
  43          reset_signal()
  44          {
  45   1       DQ = 1;
  46   1       _nop_();
  47   1       DQ = 0;                                                 //主机发送复位脉冲至少持续480uS
  48   1       delay(250);                     //480uS~960uS之间
  49   1       DQ = 1;
  50   1       delay(20);                                      //延时至少16uS
  51   1       flag = DQ;                                              //DS18B20      等待16uS后发送存在脉冲(低电平)持续60uS~240uS
  52   1       if(flag==0)                                     //若flag=0则表示存在
  53   1       {
  54   2        b = 0;                                                 //P1.0亮
  55   2        delay(90);                                 //延时60uS~240uS之间
C51 COMPILER V8.08   TEMPER                                                                10/02/2008 18:07:41 PAGE 2   

  56   2       }
  57   1       else  c=0;                                              //不存在则P1.1亮
  58   1       DQ = 1; 
  59   1      }
  60          /********************************************************** 
  61          * 函数名:  写命令子函数 w_order
  62          * 函数功能:写入将要执行操作的命令
  63          * 入口参数:cmd
  64          * 出口参数:无 
  65          ***********************************************************/
  66          void  w_order(unsigned char cmd)
  67          {
  68   1       unsigned char i;
  69   1       for(i=0;i<8;i++)
  70   1       {
  71   2        if(cmd&(0x01<<i))                              //写1
  72   2        {
  73   3         DQ = 0;                                               //主机将数据线拉至低电平产生写时间片
  74   3         _nop_();                                              //最好是拉至低电平后就释放(但延时至少1uS以上),这样才能在15uS内恢复到高电平
  75   3         _nop_();                                              //15uS内必须拉至高电平(因为DS18B20在15uS~60uS之间对数据线进行采样)
  76   3         DQ = 1;
  77   3         delay(28);                                    //延时60uS(因为一个写周期至少延时60uS)
  78   3        }
  79   2        else                                                   //写0
  80   2        { 
  81   3         DQ = 0;                                               //主机将数据线拉至低电平产生写时间片
  82   3         delay(40);                                    //延时60uS以上(因为一个写周期至少延时60uS)
  83   3         DQ = 1;
  84   3         _nop_();                                              //恢复延时(因为个写周期之间至少有1uS的恢复时间)      
  85   3         _nop_();
  86   3         _nop_();
  87   3         _nop_();
  88   3        }     
  89   2        }       
  90   1      }
  91          /********************************************************** 
  92          * 函数名:  读数据子函数 r_data
  93          * 函数功能:读出转换后的温度结果存入 buf 中
  94          * 入口参数:无
  95          * 出口参数:无 
  96          ***********************************************************/
  97          void   r_data()
  98          {
  99   1       unsigned int i,j;      
 100   1       for(j=0;j<2;j++)
 101   1       {
 102   2        buf[j] = 0;
 103   2        for(i=0;i<8;i++)                              
 104   2        {
 105   3         DQ = 1;
 106   3         _nop_();
 107   3         DQ = 0;                                               //主机将数据线拉至低电平产生读时间片
 108   3         _nop_();                                              //最好是拉至低电平后就释放(但延时至少1uS以上),这样才能在15uS内恢复到高电平
 109   3         _nop_();                                              //15uS内必须驱动至高电平(因为DS18B20输出数据在读时间片下降沿后15uS有效)
 110   3         DQ = 1;
 111   3         _nop_();
 112   3         if(DQ)                        //提高总线后马上读取
 113   3         {
 114   4          buf[j]|=(1<<i);
 115   4         }
 116   3         else
 117   3         {
C51 COMPILER V8.08   TEMPER                                                                10/02/2008 18:07:41 PAGE 3   

 118   4          buf[j]&=~(1<<i);
 119   4         }
 120   3         delay(28);                                    //每个读周期至少持续60uS
 121   3         DQ = 1;                               
 122   3         _nop_();                                              //恢复延时(因为个读周期之间至少有1uS的恢复时间)
 123   3         }  
 124   2        } 
 125   1       }
 126          /********************************************************** 
 127          * 函数名:  获取温度子函数 get_temper_value
 128          * 函数功能:获得当前的温度值 
 129          * 入口参数:无
 130          * 出口参数:无 
 131          ***********************************************************/
 132           void  get_temper_value()
 133          {
 134   1       DQ = 1;
 135   1       reset_signal();                                 //初始化 ,检测是否存在 DS18B20
 136   1       if(flag==0)                                     
 137   1       {
 138   2        w_order(0xcc);                                 //跳过ROM
 139   2        w_order(0x44);                                 //启动温度变换 
 140   2        reset_signal();                                //复位
 141   2        w_order(0xcc);                                 //跳过ROM
 142   2        w_order(0xbe);                                 //准备读暂存器
 143   2        r_data();                                              //读暂存器中温度变化的结果 
 144   2       }
 145   1      }
 146          /********************************************************** 
 147          * 函数名:  二-十进制转换子函数Conversion
 148          * 函数功能:将二进制数转入十进制中
 149          * 入口参数:无 
 150          * 出口参数:无 
 151          ***********************************************************/
 152          void Conversion() 
 153          {
 154   1       singal = (buf[1]&0xf8);                 //检温度测是正还是负
 155   1       buf1[2] = 0;                                    //温度的符号位 
 156   1       if(singal)
 157   1       {
 158   2        buf[0]=~buf[0];
 159   2        buf[1]=~buf[1];
 160   2        buf1[2]=10;
 161   2       } 
 162   1       buf[0]=(buf[0]>>4);                     //将温度转换结果的低8位的高4位移入低4位  
 163   1                                       //这里我们抛弃了温度转换结果的第四位(小数部分,因为我们不需要那么准确)
 164   1       buf[0]=(buf[0]&0x0f);                   //保留低4位并存入buf[0]中  
 165   1       buf[1]=(buf[1]<<4);                     //将温度转换结果的高8位的低4位移入高4位
 166   1       buf[1]=(buf[1]&0xf0);                   //保留高4位并存入buf[1]中
 167   1       temper_value=(buf[0]|buf[1]);   //将buf[0]与buf[1]相或得温度转换结果存入temper_value中
 168   1       if(singal)
 169   1       {temper_value++;}                               //为负时取反加1
 170   1       buf1[0]=temper_value%10;                //将个位保存在buf1[0]中
 171   1       buf1[1]=temper_value/10;                //将十位保存在buf1[1]中
 172   1      }
 173          /********************************************************** 
 174          * 函数名:   LED显示子函数display
 175          * 函数功能:将获得的温度结果通过LED显示
 176          * 入口参数:无 
 177          * 出口参数:无 
 178          ***********************************************************/
 179          void display()
C51 COMPILER V8.08   TEMPER                                                                10/02/2008 18:07:41 PAGE 4   

 180          {
 181   1       unsigned  char i,a;
 182   1       long int j;
 183   1       for(i=0;i<3;i++)
 184   1       {
 185   2        P2=~(0x10<<i);                                 //动态扫描显示 
 186   2        a =buf1[i];
 187   2        P0=~tab[a];                                    //P0口输出显示数据
 188   2        for(j=400;j>0;j--);
 189   2       }
 190   1      }
 191          
 192          /********************************************************** 
 193          * 函数名:  中断函数timer0
 194          * 函数功能:定时对DS18B20的转换温度进行更新
 195          * 入口参数:无 
 196          * 出口参数:无 
 197          ***********************************************************/
 198          void timer0(void)  interrupt 1  using  0
 199          {
 200   1       TH0 =TH0_value;
 201   1       TL0 =TL0_value;
 202   1       get_temper_value();
 203   1       Conversion();
 204   1      }
 205          /********************************************************** 
 206          * 函数名:  主函数main          
 207          * 函数功能:通过温度传感器测当前室温
 208          * 入口参数:无
 209          * 出口参数:无 
 210          ***********************************************************/ 
 211          void main()
 212          {
 213   1       TMOD=TMOD_value;
 214   1       TH0 =TH0_value;
 215   1       TL0 =TL0_value;
 216   1       TCON=TCON_value;
 217   1       IE  =IE_value ;
 218   1       P0  =P0_value;
 219   1       while(1)
 220   1       {               
 221   2        display();                                     //将当前温度值送入LED显示
 222   2       }
 223   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    458    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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