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

📄 w013.lst

📁 献给初学单片机的爱好者们
💻 LST
字号:
C51 COMPILER V8.08   W013                                                                  04/02/2008 20:53:36 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE W013
OBJECT MODULE PLACED IN w013.OBJ
COMPILER INVOKED BY: D:\program files\Keil 3\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^0;
  20          sbit LCD_RW = P2^1;
  21          
  22          sbit SELECT_LCD=P2^2;
  23          
  24          
  25          sbit DQ = P3^7 ;    //定义DS18B20端口DQ  
  26          bit presence ;      //DS18B20初始化成功标志位
  27          
  28          uchar data  temp_data[2] = {0x00,0x00} ;   //温度数据缓存
  29          uchar data  dis_data[5]={0,0,0,0,0};       //温度值百十个小数位及一个数据缓存
  30          
  31          uchar code  dis_code1[ ] = {"   DS18B20 OK   "} ;
  32          uchar code  dis_code2[ ] = {"  TEMP:    .  C "} ;
  33          uchar code  dis_code3[ ] = {" DS18B20  ERR0R "} ;
  34          uchar code  dis_code4[ ] = {"  PLEASE CHECK  "} ;
  35          
  36          
  37          /*温度小数部分查表*/
  38          unsigned char code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  39                                           0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
  40          
  41          
  42          /*自定义字符*/
  43          unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
  44          
  45          
  46          void Delay(unsigned int num) //us级延时函数
  47          {
  48   1        while( --num ) ;
  49   1      }
  50          
  51          bit LCD_Busy()     //LCD忙碌状态检测
  52          {                                                       
  53   1              bit result;
  54   1              LCD_RS = 0;                         
  55   1              LCD_RW = 1;
C51 COMPILER V8.08   W013                                                                  04/02/2008 20:53:36 PAGE 2   

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

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

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

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

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

⌨️ 快捷键说明

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