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

📄 thermometer.lst

📁 单片机系统复位后在液晶上显示当前温度值,测量温度范围为 -55°C~+125
💻 LST
字号:
C51 COMPILER V7.09   THERMOMETER                                                           11/02/2008 12:33:48 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE THERMOMETER
OBJECT MODULE PLACED IN Thermometer.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE Thermometer.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /****************************************************/
   2          /*
   3          *文件名:Thermomete.c
   4          *功能描述:单片机系统复位后在液晶上显示当前温度值,测量温度范围为 -55°C~+125,可显示负温度值 
   5          *作者:黄英杰
   6          *单位:吉首大学                         *时间:2008.11.01
   7          */
   8          /****************************************************/
   9          /*
  10          DS18B20为"一线总线"数字温度传感器,测量温度范围为 -55°C~+125°C,分辨率为12,相当于温度分辨率为0.0625摄氏
             -度
  11          在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果.
  12          */
  13          #include "Thermomete.h"
  14          
  15          sbit DQ=P1^1;//定义数据通信端口
  16          bit  Negative=0;//温度负值标志位
  17          
  18          void delay_us(unsigned int x);//延时1us函数
  19          void delay(unsigned int t);//延时函数
  20          void lcd_code(unsigned char lcdcode);//向液晶写一个命令的函数
  21          void lcd_data(unsigned char lcddata);//向液晶写一个数据的函数
  22          void init_lcd(void);//初始化液晶屏函数
  23          void delay_ms(unsigned int x);//延时1ms函数
  24          void display_char(unsigned char *displaychar);//显示字符串函数
  25          void display_tem(float f);//显示温度值函数 
  26          void Reset(void);//DS18B20复位函数
  27          void Built(void);//自制摄氏温度符号函数
  28          unsigned char read_data(void);//读一个字节数据函数
  29          void write_data(unsigned char value);//写一个字节数据函数
  30          float Read_Temperature(void);//读取温度并转换函数
  31          
  32          
  33          void main(void)
  34          {
  35   1             float temp;  
  36   1             EA=0;
  37   1             init_lcd();
  38   1             Built();
  39   1             lcd_code(0x80);
  40   1             display_char("Currently Temer:");
  41   1             while(1)
  42   1             {
  43   2                   temp=Read_Temperature();//温度转换
  44   2                   display_tem(temp);//显示当前温度
  45   2             }
  46   1      }
  47          
  48          
  49          /***************延时1us函数*************/
  50          void delay_us(unsigned int x)
  51          {
  52   1            while(x--);
  53   1      }//x<255时,精确延时为(6*x)us
  54          
C51 COMPILER V7.09   THERMOMETER                                                           11/02/2008 12:33:48 PAGE 2   

  55          
  56          
  57          /***************延时1ms函数*************/
  58          void delay_ms(unsigned int x)
  59          { 
  60   1             unsigned char i;
  61   1             while(x--)
  62   1             {
  63   2                     for(i=0;i<125;i++);
  64   2             }
  65   1      }
  66          
  67          
  68          /****************DS18B20复位函数******************/
  69          void  Reset(void)
  70          {
  71   1               unsigned char ch=0;
  72   1               DQ = 1;//DQ复位
  73   1               delay_us(8);//延时
  74   1               DQ = 0;//DQ拉低
  75   1               delay_us(80); //精确延时大于480us
  76   1               DQ = 1;
  77   1               //控制器应该将数据单总线拉高,以便于在15~60uS后接收存在脉冲
  78   1               delay_us(14);//延时,存在脉冲为一个60~240uS的低电平信号
  79   1               ch=DQ;//接收存在脉冲
  80   1               delay(20);
  81   1      }    
  82          
  83          
  84          /****************读一个字节数据函数******************/
  85          unsigned char read_data(void)
  86          {
  87   1             unsigned char i;
  88   1             unsigned char value = 0;
  89   1             for (i=0;i<8;i++)
  90   1             {
  91   2                   DQ = 0; //给脉冲信号
  92   2                       value=value>>1;//产生至少1uS的低电平,表示读时间的起始
  93   2                               DQ = 1; //给脉冲信号,在总线被释放后的15uS中DS18B20会发送内部数据位
  94   2                   if(DQ)
  95   2                               {
  96   3                        value=value|0x80;
  97   3                   }
  98   2                       delay_us(4);
  99   2             }
 100   1             return(value);
 101   1      }
 102          
 103          
 104          /****************写一个字节数据函数******************/
 105          void write_data(unsigned char value)
 106          {
 107   1              unsigned char i;
 108   1              for(i=0;i<8;i++)
 109   1              {
 110   2                  DQ=0;
 111   2                      //写数据时间隙的前15uS总线需要是被控制器拉置低电平
 112   2                  DQ=value&0x01;
 113   2                  delay_us(5);//芯片对总线数据的采样时间,采样时间在15~60uS
 114   2                  DQ=1;
 115   2                  value=value>>1;
 116   2              }//字节的读写是从低位开始的
C51 COMPILER V7.09   THERMOMETER                                                           11/02/2008 12:33:48 PAGE 3   

 117   1              delay(4);
 118   1      }
 119          
 120          
 121          /****************读取温度并转换函数******************/
 122          //DS18b20一线工作协议流程为:
 123          //复位 发送ROM指令 发送存储器指令 数据通信
 124          float Read_Temperature(void)
 125          {
 126   1              unsigned char first_byte,second_byte,num=0;
 127   1              float Temperature_value;
 128   1              unsigned int buf;
 129   1              Reset();//复位
 130   1              write_data(0xcc);//跳跃ROM指令,跳过读序列号
 131   1              write_data(0x44);//启动温度转换
 132   1              delay_ms(750);//延时大于转换时间
 133   1              Reset();//复位
 134   1              write_data(0xcc);//跳跃ROM指令,跳过读序列号
 135   1              write_data(0xbe);//从RAM中读数据,前两个字节为温度值
 136   1              first_byte=read_data();//读取温度值低八位
 137   1              second_byte=read_data();//读取温度值高八位
 138   1              //Reset();//复位中止读数
 139   1              num=second_byte&0x80;//判断温度值的正负
 140   1              buf=second_byte;
 141   1              buf=buf<<8;//温度值高八位存放在整型变量buf高八位
 142   1              buf=buf|first_byte;//相或运算将温度值低八位存放在整型变量buf低八位
 143   1              if(num!=0)
 144   1              {
 145   2                   buf=(~buf)+1;
 146   2                   Negative=1;
 147   2              }//温度值为负数,取反后加一
 148   1              Temperature_value=buf*0.0625;//分辨率为12位,LSB=0.0625
 149   1              return(Temperature_value);
 150   1      }
 151          
 152          
 153          /*********************延时函数********************/
 154          void delay(unsigned int t)
 155          {
 156   1              unsigned int i;
 157   1              for(i=0;i<=t;i++);
 158   1      }
 159          
 160          
 161          
 162          /************向液晶写一个命令的函数***************/
 163          void lcd_code(unsigned char lcdcode)
 164          { 
 165   1                 delay(3);
 166   1                 A_LCDCOM=lcdcode;
 167   1                 delay(200);
 168   1      } 
 169          
 170          
 171          
 172          /**************向液晶写一个数据的函数*************/
 173          void lcd_data(unsigned char lcddata)
 174          {
 175   1                 delay(3);
 176   1                 A_LCDDATA=lcddata;
 177   1                 delay(200);
 178   1      }
C51 COMPILER V7.09   THERMOMETER                                                           11/02/2008 12:33:48 PAGE 4   

 179          
 180          
 181          /******************初始化液晶屏函数**************/
 182          void  init_lcd(void)
 183          {
 184   1                  delay(1000);
 185   1              lcd_code(0x38);//功能设定,5*7点阵,8位数据接口
 186   1              delay(1000);
 187   1              lcd_code(0x0c);//显示画面设置,开显示
 188   1              delay(1000);
 189   1              lcd_code(0x01);//清屏指令
 190   1              delay(1000);
 191   1              lcd_code(0x06);//当读或写一个字符后地址指针加1,且光标加1
 192   1              delay(1000);
 193   1      }
 194          
 195          
 196          /***************显示字符串的函数*******************/
 197          void display_char(unsigned char *displaychar)
 198          {
 199   1              while(*displaychar>0)
 200   1              {
 201   2                      lcd_data(*displaychar);
 202   2                      displaychar++;
 203   2              }
 204   1      }
 205          
 206          
 207          /***************显示温度值的函数*******************/
 208          void display_tem(float f)
 209          {
 210   1             unsigned int num0,num1;
 211   1             num0=f;//小数部分舍去,留下整数部分
 212   1             f=f-num0;//减去整数部分得到小数部分
 213   1             num1=f*10000;
 214   1             lcd_code(0xc3);
 215   1             if(Negative==1)
 216   1             {
 217   2                   Negative=0;
 218   2                   lcd_data('-');
 219   2             }//若温度为负,则先显示负号
 220   1             lcd_data((num0/100)%10+0x30);
 221   1             delay(30);
 222   1             lcd_data((num0/10)%10+0x30);
 223   1             delay(30);
 224   1             lcd_data((num0%10)+0x30);
 225   1             delay(30);
 226   1             lcd_data('.');
 227   1             delay(30);
 228   1             lcd_data((num1/1000)%10+0x30);
 229   1             delay(30);
 230   1             lcd_data((num1/100)%10+0x30);
 231   1             delay(30);
 232   1             lcd_data((num1/10)%10+0x30);
 233   1             delay(30);
 234   1             lcd_data((num1%10)+0x30);
 235   1             delay(30);//将温度值转换成各位显示
 236   1             lcd_data(0x00);//显示摄氏温度符号
 237   1             delay(30);
 238   1      }
 239          
 240          
C51 COMPILER V7.09   THERMOMETER                                                           11/02/2008 12:33:48 PAGE 5   

 241          
 242          /***************自制摄氏温度符号函数*******************/
 243          void Built(void)
 244          {
 245   1                lcd_code(0x40);//设置CGRAM地址,自定义字符字模就可以写入CGRAM中 
 246   1                lcd_data(0x08);//自定义字符°C,字符码为00
 247   1                lcd_data(0x14);
 248   1                lcd_data(0x0b);
 249   1                lcd_data(0x04);
 250   1                lcd_data(0x04);
 251   1                lcd_data(0x04);
 252   1                lcd_data(0x03);
 253   1                lcd_data(0x00);
 254   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    666    ----
   CONSTANT SIZE    =     17    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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