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

📄 temperature.lst

📁 采用DS1820精确到4位小数的温度计C语言
💻 LST
字号:
C51 COMPILER V8.08   TEMPERATURE                                                           05/25/2007 09:24:33 PAGE 1   


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

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

 118   1              LCD_WRITE_IR(0x91);//在LCD第2行显示
 119   1              LCD_WRITE_DR(temp[0]);  //显示百位
 120   1              LCD_WRITE_DR(temp[1]);  //显示十位
 121   1              LCD_WRITE_DR(temp[2]);  //显示个位
 122   1              LCD_WRITE_DR(0x2e);             //显示"."
 123   1              LCD_WRITE_DR(temp[3]);  //显示小数位
 124   1              LCD_WRITE_DR(temp[4]);  //显示小数位
 125   1              LCD_WRITE_DR(temp[5]);  //显示小数位
 126   1              LCD_WRITE_DR(temp[6]);  //显示小数位
 127   1              LCD_WRITE_DR(0xa1);             //显示"℃"
 128   1              LCD_WRITE_DR(0xe6);
 129   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 + -