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

📄 w013.lst

📁 使用Keil环境开发了基于C8051单片机的温度采集模块
💻 LST
字号:
C51 COMPILER V8.02   W013                                                                  06/07/2007 21:45:36 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE W013
OBJECT MODULE PLACED IN w013.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE w013.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*******************************************************************************
   2          * 实验名称: 数字温度表(DS18B20)LCD1620显示                                     *
   3          ********************************************************************************
   4          * 实验描述: LCD1620显示测量的温度                                              *
   5          * 实验说明: DS18B20正常时,显示“DS18B20 OK”及温度值                                      *
   6          *           DS18B20没有安装时,显示“DS18B20  ERR0R PLEASE CHECK”                         *
   7          *                       实验前要在J7上安装DS18B20                                                                  *
   8          *                       1:接DS18B20的GND端                                                                                *
   9          *           2:接DS18B20的DQ端                                                 * 
  10          *           3:接DS18B20的VDD端                                                *
  11          *******************************************************************************/
  12          
  13          #include <reg51.h>
  14          #include <intrins.h>
  15          
  16          #define uchar unsigned char
  17          #define uint  unsigned int
  18          
  19          sbit LCD_RS = P2^3;
  20          sbit LCD_RW = P2^4;
  21          
  22          sbit HC138_A = P2^5;
  23          sbit HC138_B = P2^6;
  24          sbit HC138_C = P2^7;
  25          
  26          #define SELECT_LCD()    HC138_A=0; HC138_B=1; HC138_C=0
  27          #define NOSELECT_LCD()  HC138_A=1; HC138_B=1; HC138_C=1
  28          
  29          sbit DQ = P3^7 ;    //定义DS18B20端口DQ  
  30          bit presence ;      //DS18B20初始化成功标志位
  31          
  32          uchar data  temp_data[2] = {0x00,0x00} ;   //温度数据缓存
  33          uchar data  dis_data[5]={0,0,0,0,0};       //温度值百十个小数位及一个数据缓存
  34          
  35          uchar code  dis_code1[ ] = {"   DS18B20 OK   "} ;
  36          uchar code  dis_code2[ ] = {"  TEMP:    .  C "} ;
  37          uchar code  dis_code3[ ] = {" DS18B20  ERR0R "} ;
  38          uchar code  dis_code4[ ] = {"  PLEASE CHECK  "} ;
  39          
  40          
  41          /*温度小数部分查表*/
  42          unsigned char code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  43                                           0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  44          
  45          
  46          /*自定义字符*/
  47          unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
  48          
  49          
  50          void Delay(unsigned int num) //us级延时函数
  51          {
  52   1        while( --num ) ;
  53   1      }
  54          
  55          bit LCD_Busy()     //LCD忙碌状态检测
C51 COMPILER V8.02   W013                                                                  06/07/2007 21:45:36 PAGE 2   

  56          {                                                       
  57   1              bit result;
  58   1              LCD_RS = 0;                         
  59   1              LCD_RW = 1;
  60   1              SELECT_LCD();
  61   1              _nop_();
  62   1              _nop_();
  63   1              _nop_();
  64   1              _nop_();
  65   1              result = (bit)(P0 & 0x80);      
  66   1              NOSELECT_LCD();
  67   1              return result;  
  68   1      }
  69          
  70          LCD_WriteCommand(uchar cmd)      //写指令数据到LCD
  71          {                                                          
  72   1              while(LCD_Busy());
  73   1              LCD_RS = 0;
  74   1              LCD_RW = 0;
  75   1              NOSELECT_LCD();
  76   1              _nop_();
  77   1              _nop_();        
  78   1              P0 = cmd;
  79   1              _nop_();
  80   1              _nop_();
  81   1              _nop_();
  82   1              _nop_();
  83   1              SELECT_LCD();
  84   1              _nop_();
  85   1              _nop_();
  86   1              _nop_();
  87   1              _nop_();
  88   1              NOSELECT_LCD();         
  89   1      }
  90          
  91          LCD_WriteDate(uchar dat)   //写字符显示数据到LCD
  92          {                                                       
  93   1              while(LCD_Busy());
  94   1              LCD_RS = 1;
  95   1              LCD_RW = 0;
  96   1              NOSELECT_LCD();
  97   1              P0 = dat;
  98   1              _nop_();
  99   1              _nop_();
 100   1              _nop_();
 101   1              _nop_();
 102   1              SELECT_LCD();
 103   1              _nop_();
 104   1              _nop_();
 105   1              _nop_();
 106   1              _nop_();
 107   1              NOSELECT_LCD(); 
 108   1      }
 109          
 110          LCD_DisplayPosit(uchar pos)      //设定字符在LCD上显示的位置
 111          {                                                       
 112   1              LCD_WriteCommand(pos | 0x80);
 113   1      }
 114          
 115          LCD_Init()      //LCD初始化
 116          {                                                       
 117   1              LCD_WriteCommand(0x38);    
C51 COMPILER V8.02   W013                                                                  06/07/2007 21:45:36 PAGE 3   

 118   1              Delay(5);
 119   1              LCD_WriteCommand(0x0c);   
 120   1              Delay(5);
 121   1              LCD_WriteCommand(0x06);   
 122   1              Delay(5);
 123   1              LCD_WriteCommand(0x01); 
 124   1              Delay(5);
 125   1      }
 126          
 127          void  LCD_WriteMytab()  //自定义字符写入CGRAM函数
 128          {  
 129   1          unsigned char i ;
 130   1          LCD_WriteCommand(0x40) ;  //写CGRAM
 131   1          for (i = 0 ; i< 8 ; i++)       
 132   1          LCD_WriteDate(mytab[ i ]) ;        
 133   1      }
 134          
 135          void LCD_DisplayLine(uchar a[ ],uchar b[ ])     //LCD1620显示两行字符函数
 136          {
 137   1          uchar  m ;
 138   1          LCD_Init() ;                //初始化LCD 
 139   1                  
 140   1          LCD_DisplayPosit(0) ;       //设置显示位置为第一行的第1个字符
 141   1           m = 0 ;
 142   1          while(a[m] != '\0')
 143   1           {                          //显示第一行字符
 144   2             LCD_WriteDate(a[m]) ;
 145   2             m++ ;
 146   2           }
 147   1      
 148   1          LCD_DisplayPosit(0x40) ;    //设置显示位置为第二行第1个字符
 149   1           m = 0 ;
 150   1          while(b[m] != '\0')
 151   1           {
 152   2             LCD_WriteDate(b[m]) ;    //显示第二行字符
 153   2             m++ ;
 154   2           } 
 155   1      }
 156          
 157          DS18B20_Init(void)       //DS18B20初始化函数
 158          {  
 159   1           DQ = 1 ;        //DQ复位
 160   1           Delay(8) ;      //延时
 161   1      
 162   1           DQ = 0 ;        //单片机将DQ拉低
 163   1           Delay(90) ;     //延时 大于 480us
 164   1      
 165   1           DQ = 1 ;        //拉高总线
 166   1           Delay(8) ;
 167   1      
 168   1           presence = DQ ;    //如果 presence=0则初始化成功 presence=1则初始化失败
 169   1           Delay(100) ;
 170   1           DQ = 1 ; 
 171   1           
 172   1           return(presence) ; // 返回信号,0=presence,1= no presence
 173   1      }                                                  
 174          
 175           ReadOneChar(void)         //读一个字节数据函数
 176          {                                           
 177   1        unsigned char i = 0 ;
 178   1        unsigned char dat = 0 ;
 179   1      
C51 COMPILER V8.02   W013                                                                  06/07/2007 21:45:36 PAGE 4   

 180   1        for (i = 8 ; i > 0 ; i--)
 181   1          {
 182   2            DQ = 0 ;   
 183   2            dat >>= 1 ;
 184   2            DQ = 1 ;    
 185   2      
 186   2            if(DQ)
 187   2              dat |= 0x80 ;
 188   2              Delay(4) ;
 189   2          }
 190   1      
 191   1          return (dat) ;
 192   1      }
 193          
 194          
 195           WriteOneChar(unsigned char dat)  //写一个字节数据函数
 196          {
 197   1        unsigned char i = 0 ;
 198   1        for (i = 8 ; i > 0 ; i--)
 199   1        {
 200   2          DQ = 0 ;
 201   2          DQ = dat&0x01 ;
 202   2          Delay(5) ;
 203   2      
 204   2          DQ = 1 ;
 205   2          dat>>=1 ;
 206   2        }
 207   1      }
 208          
 209           ReadTemperature(void)   //读取温度函数
 210          {
 211   1           DS18B20_Init() ;
 212   1        
 213   1           WriteOneChar(0xCC) ;  //跳过读序号列号的操作
 214   1           WriteOneChar(0x44) ;  //启动温度转换
 215   1      
 216   1           DS18B20_Init() ;
 217   1           WriteOneChar(0xCC) ;  //跳过读序号列号的操作
 218   1           WriteOneChar(0xBE) ;  //读取温度寄存器
 219   1      
 220   1           temp_data[0] = ReadOneChar() ;   //读温度低8位
 221   1           temp_data[1] = ReadOneChar() ;   //读温度高8位 
 222   1      }
 223          
 224           TemperatureDisplay()   //温度数据转换和显示函数
 225          {
 226   1        dis_data[4]=temp_data[0]&0x0f ;            //temp_data[0]低4为有效
 227   1        dis_data[3]=ditab[dis_data[4]]+0x30;   //查表得小数位的值
 228   1        
 229   1        dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
 230   1        dis_data[2]=dis_data[4]%10+0x30;                 //个位
 231   1        dis_data[1]=(dis_data[4]/10)%10+0x30;    //十位
 232   1        dis_data[0]=dis_data[4]/100+0x30;                //百位
 233   1      
 234   1          if(dis_data[0]==0x30)     //百位为0,不显示
 235   1         { 
 236   2           dis_data[0]=0x20;
 237   2                             
 238   2           if(dis_data[1]==0x30)    //十位为0,不显示
 239   2             dis_data[1]=0x20 ;
 240   2         }
 241   1      
C51 COMPILER V8.02   W013                                                                  06/07/2007 21:45:36 PAGE 5   

 242   1           LCD_DisplayPosit(0x48) ;             
 243   1           LCD_WriteDate(dis_data[0]) ;  //百位数显示 
 244   1           LCD_DisplayPosit(0x49) ;             
 245   1           LCD_WriteDate(dis_data[1]) ;  //十位数显示 
 246   1           LCD_DisplayPosit(0x4a) ;             
 247   1           LCD_WriteDate(dis_data[2]) ;  //个位数显示 
 248   1           LCD_DisplayPosit(0x4c) ;             
 249   1           LCD_WriteDate(dis_data[3]) ;  //小数位数显示
 250   1               LCD_WriteMytab() ;            //自定义字符(度的符号)写入CGRAM
 251   1           Delay(5) ;
 252   1           LCD_DisplayPosit(0x4d) ;
 253   1           LCD_WriteDate(0x00) ;         //显示自定义字符(度的符号)
 254   1      
 255   1      }
 256          
 257          void  DS18B20_OkMenu ()    //DS18B20 OK 菜单显示函数
 258          { 
 259   1           LCD_DisplayLine(dis_code1,dis_code2); 
 260   1      }
 261          
 262          void  DS18B20_ErrorMenu ()  //DS18B20 ERROR 菜单显示函数
 263          {
 264   1           LCD_DisplayLine(dis_code3,dis_code4);
 265   1      }
 266          
 267          void main()        //主函数
 268           {
 269   1            DS18B20_OkMenu () ;
 270   1      
 271   1          do
 272   1          {
 273   2            ReadTemperature() ;
 274   2            TemperatureDisplay() ;
 275   2          }
 276   1          while(!presence)  ;
 277   1      
 278   1           DS18B20_ErrorMenu () ;
 279   1      
 280   1          do
 281   1          {  
 282   2            DS18B20_Init() ;
 283   2          }
 284   1          while(presence) ;
 285   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    592    ----
   CONSTANT SIZE    =     92    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7       6
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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