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

📄 temperature.lst

📁 该程序通过DS18B20测温度
💻 LST
字号:
C51 COMPILER V7.50   TEMPERATURE                                                           10/04/2007 11:52:12 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE TEMPERATURE
OBJECT MODULE PLACED IN temperature.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE temperature.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #include "temp.h"
   3          
   4          /**********************************************************
   5          *采用DS1820+YM12864R精确到4位小数的温度计
   6          
   7          
   8          *版本:V0.3
   9          *DS1820设置为12位精度
  10          **********************************************************/
  11          
  12          //声明外部温度读数数组
  13          extern unsigned char data temperature[2];
  14          //存放分解的7个ASCII码温度数据  
  15          unsigned char temp[7];
  16          unsigned char code string[6]={"温度:"};
  17          unsigned char code DispStr[7]={"系列号"};
  18          unsigned char fCode[8]; //存放序列号,CRC 
  19          
  20          /**********************************************************
  21          *主程序
  22          **********************************************************/
  23          void main()
  24          {
  25   1              unsigned char i;
  26   1              delay100us();//等待电源稳定,液晶复位完成
  27   1              delay100us();
  28   1              LCD_INIT();      //液晶初始化
  29   1              DS1820_Reset();//DS1820复位
  30   1              DS1820_WriteData(0x33);//读ROM指令
  31   1              for (i=0;i<8;i++)
  32   1                      {//读取64位系列号
  33   2                      fCode[i] = DS1820_ReadData();
  34   2                      }
  35   1              DS1820_Reset();//DS1820复位
  36   1              LCD_WRITE_IR(0x80);//在第一行显示
  37   1              for (i=0;i<5;i++)
  38   1                      {
  39   2                       LCD_WRITE_DR(string[i]);//显示"温度:"
  40   2                      }
  41   1              LCD_WRITE_IR(0x88);//在第3行显示
  42   1              for (i=0;i<6;i++)
  43   1                      {
  44   2                       LCD_WRITE_DR(DispStr[i]);//显示"系列号"
  45   2                      }
  46   1              DispCode();//在第4行显示序列号
  47   1              do{
  48   2                      read_temp(); //读取温度值
  49   2                      delay100us();
  50   2                      display();       //显示温度值
  51   2                      delay100us();
  52   2               }while (1);    //无限循环
  53   1      }
  54          
  55          /**********************************************************
C51 COMPILER V7.50   TEMPERATURE                                                           10/04/2007 11:52:12 PAGE 2   

  56          *系列号显示子程序
  57          *显示顺序(从左到右)8位CRC编码->48位序列号->8位产品系列编码
  58          **********************************************************/
  59          void DispCode()
  60          {
  61   1       unsigned char i,temp;
  62   1       LCD_WRITE_IR(0x98); //在第4行显示
  63   1       for (i=8;i>0;i--)
  64   1              {
  65   2              //显示高4位
  66   2              temp = fCode[i-1]>>4;
  67   2                      if (temp<10) //ASCII码转换
  68   2                               LCD_WRITE_DR(temp += 0x30);
  69   2                      else
  70   2                               LCD_WRITE_DR(temp += 0x37);
  71   2              //显示低4位
  72   2              temp = fCode[i-1]&0x0f;
  73   2                      if (temp<10) //ASCII码转换
  74   2                               LCD_WRITE_DR(temp += 0x30);
  75   2                      else
  76   2                               LCD_WRITE_DR(temp += 0x37);
  77   2               }
  78   1      }
  79          /**********************************************************
  80          *延时子程序
  81          **********************************************************/
  82          void delay100us()
  83          {
  84   1       unsigned char i;
  85   1       for (i=49;i>0;i--);
  86   1      }
  87          /**********************************************************
  88          *转换显示子程序
  89          **********************************************************/
  90          void display()
  91          {
  92   1       unsigned char temp_data,temp_data_2;
  93   1       unsigned int TempDec;  //用来存放4位小数
  94   1       temp_data = temperature[1];
  95   1       temp_data &= 0xf0;     //取高4位
  96   1       if (temp_data==0xf0)   //判断是正温度还是负温度读数
  97   1              {
  98   2              //负温度读数求补,取反加1,判断低8位是否有进位
  99   2                      if (temperature[0]==0)
 100   2                              {       //有进位,高8位取反加1
 101   3                                      temperature[0]=~temperature[0]+1;
 102   3                                      temperature[1]=~temperature[1]+1;
 103   3                              }
 104   2                      else
 105   2                              {       //没进位,高8位不加1
 106   3                                      temperature[0]=~temperature[0]+1;
 107   3                                      temperature[1]=~temperature[1];
 108   3                              }
 109   2               }
 110   1              temp_data = temperature[1]<<4;          //取高字节低4位(温度读数高4位)
 111   1              temp_data_2 = temperature[0]>>4;        //取低字节高4位(温度读数低4位)
 112   1              temp_data = temp_data|temp_data_2;      //组合成完整数据
 113   1              temp[0] = temp_data/100+0x30;           //取百位转换为ASCII码
 114   1              temp[1] = (temp_data%100)/10+0x30;      //取十位转换为ASCII码
 115   1              temp[2] = (temp_data%100)%10+0x30;      //取个位转换为ASCII码
 116   1              temperature[0]&=0x0f;                           //取小数位转换为ASCII码
 117   1              TempDec = ((temperature[0]&0x0f)*0.0625)*10000;//小数部分,扩大1万倍
C51 COMPILER V7.50   TEMPERATURE                                                           10/04/2007 11:52:12 PAGE 3   

 118   1              temp[3] = TempDec/1000+0x30;            //取小数个位转换为ASCII码
 119   1              temp[4] = (TempDec%1000)/100+0x30;      //取小数十位转换为ASCII码
 120   1              temp[5] = ((TempDec%1000)%100)/10+0x30;//取小数百位转换为ASCII码
 121   1              temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数千位转换为ASCII码
 122   1              LCD_WRITE_IR(0x91);//在LCD第2行显示
 123   1              LCD_WRITE_DR(temp[0]);  //显示百位
 124   1              LCD_WRITE_DR(temp[1]);  //显示十位
 125   1              LCD_WRITE_DR(temp[2]);  //显示个位
 126   1              LCD_WRITE_DR(0x2e);             //显示"."
 127   1              LCD_WRITE_DR(temp[3]);  //显示小数位
 128   1              LCD_WRITE_DR(temp[4]);  //显示小数位
 129   1              LCD_WRITE_DR(temp[5]);  //显示小数位
 130   1              LCD_WRITE_DR(temp[6]);  //显示小数位
 131   1              LCD_WRITE_DR(0xa1);             //显示"℃"
 132   1              LCD_WRITE_DR(0xe6);
 133   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    491    ----
   CONSTANT SIZE    =     13    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     15       3
   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 + -