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

📄 temper.lst

📁 用89C51单片机,LCD1602,建成的数字温度计.
💻 LST
字号:
C51 COMPILER V7.50   TEMPER                                                                05/14/2007 21:37:30 PAGE 1   


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

line level    source

   1          #include < reg51.h >
   2          #include < intrins.h >
   3          
   4          #define uchar unsigned char
   5          #define uint  unsigned int
   6          
   7          sbit DQ = P3^5 ;  //定义DS18B20端口DQ  
   8          sbit BEEP=P3^3  ; //蜂鸣器驱动线
   9          
  10          bit presence  ;
  11          
  12          sbit LCD_RS = P3^7 ;             
  13          sbit LCD_RW = P3^6 ;
  14          sbit LCD_EN = P3^4 ;
  15          
  16          #define  LCD_DATA   P2          //LCD
  17          uchar code  cdis1[ ] = {"   DS18B20 OK   "} ;
  18          uchar code  cdis2[ ] = {"  TEMP:    .  C "} ;
  19          uchar code  cdis3[ ] = {" DS18B20  ERR0R "} ;
  20          uchar code  cdis4[ ] = {"  PLEASE CHECK  "} ;
  21          
  22          unsigned char data  temp_data[2] = {0x00,0x00} ;
  23          unsigned char data  display[5] =   {0x00,0x00,0x00,0x00,0x00} ;
  24          unsigned char code  ditab[16] =    {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  25                                              0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
  26          void beep(); 
  27          unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
  28          
  29          #define delayNOP(); {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;
  30          
  31          /*******************************************************************/
  32          void delay1(int ms)
  33          {
  34   1       unsigned char y ;
  35   1        while(ms--)
  36   1       {
  37   2        for(y = 0 ; y<250 ; y++)
  38   2        {
  39   3         _nop_() ;
  40   3         _nop_() ;
  41   3         _nop_() ;
  42   3         _nop_() ;
  43   3        }
  44   2       }
  45   1      }
  46          
  47          /******************************************************************/
  48          /*检查LCD忙状态                                                   */
  49          /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。   */
  50          /******************************************************************/ 
  51          bit lcd_busy()
  52           {                          
  53   1          bit result ;
  54   1          LCD_RS = 0 ;
  55   1          LCD_RW = 1 ;
C51 COMPILER V7.50   TEMPER                                                                05/14/2007 21:37:30 PAGE 2   

  56   1          LCD_EN = 1 ;
  57   1          delayNOP() ;
  58   1          result = (bit)(LCD_DATA&0x80) ;
  59   1          LCD_EN = 0 ;
  60   1          return(result) ; 
  61   1       }
  62          
  63          /*写指令数据到LCD                                                  */
  64          /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。          */
  65          /*******************************************************************/
  66          void lcd_wcmd(uchar cmd)
  67          {                          
  68   1         while(lcd_busy()) ;
  69   1          LCD_RS = 0 ;
  70   1          LCD_RW = 0 ;
  71   1          LCD_EN = 0 ;
  72   1          _nop_() ;
  73   1          _nop_() ; 
  74   1          LCD_DATA = cmd ;
  75   1          delayNOP() ;
  76   1          LCD_EN = 1 ;
  77   1          delayNOP() ;
  78   1          LCD_EN = 0 ;  
  79   1      }
  80          
  81          /*******************************************************************/
  82          /*写显示数据到LCD                            */
  83          /*RS=H,RW=L,E=高脉冲,D0-D7=数据。       */
  84          /*******************************************************************/
  85          void lcd_wdat(uchar dat)
  86          {                          
  87   1         while(lcd_busy()) ;
  88   1          LCD_RS = 1 ;
  89   1          LCD_RW = 0 ;
  90   1          LCD_EN = 0 ;
  91   1          LCD_DATA = dat ;
  92   1          delayNOP() ;
  93   1          LCD_EN = 1 ;
  94   1          delayNOP() ;
  95   1          LCD_EN = 0 ; 
  96   1      }
  97          
  98          
  99          /*  LCD初始化设定                                                  */
 100          /*******************************************************************/
 101          void lcd_init()
 102          { 
 103   1          delay1(15) ;   
 104   1          lcd_wcmd(0x01) ;      //清除LCD的显示内容            
 105   1          lcd_wcmd(0x38) ;      //16*2显示,5*7点阵,8位数据
 106   1          delay1(5) ;
 107   1          lcd_wcmd(0x38) ;         
 108   1          delay1(5) ;
 109   1          lcd_wcmd(0x38) ;         
 110   1          delay1(5) ;
 111   1      
 112   1          lcd_wcmd(0x0c) ;      //显示开,关光标
 113   1          delay1(5) ;
 114   1          lcd_wcmd(0x06) ;      //移动光标
 115   1          delay1(5) ;
 116   1          lcd_wcmd(0x01) ;      //清除LCD的显示内容
 117   1          delay1(5) ;
C51 COMPILER V7.50   TEMPER                                                                05/14/2007 21:37:30 PAGE 3   

 118   1      }
 119          
 120          /*  设定显示位置                                    */
 121          /*******************************************************************/
 122          void lcd_pos(uchar pos)
 123          {                          
 124   1        lcd_wcmd(pos | 0x80) ;  //数据指针=80+地址变量
 125   1      }
 126          
 127          /*自定义字符写入CGRAM                                   */
 128          /*******************************************************************/
 129          void  writetab()  
 130          {  
 131   1          unsigned char i ;
 132   1          lcd_wcmd(0x40) ;            //写CGRAM
 133   1          for (i = 0 ; i< 8 ; i++)       
 134   1          lcd_wdat(mytab[ i ]) ;        
 135   1      }
 136          
 137          /*us级延时函数                                        */
 138          /*******************************************************************/
 139          
 140          void Delay(unsigned int num)
 141          {
 142   1        while( --num ) ;
 143   1      }
 144          
 145          /*初始化ds1820                                      */
 146          /*******************************************************************/
 147          Init_DS18B20(void)
 148          {  
 149   1           DQ = 1 ;      //DQ复位
 150   1           Delay(8) ;    //稍做延时
 151   1      
 152   1           DQ = 0 ;      //单片机将DQ拉低
 153   1           Delay(90) ;   //精确延时 大于 480us
 154   1      
 155   1           DQ = 1 ;       //拉高总线
 156   1           Delay(8) ;
 157   1      
 158   1           presence = DQ ;    //如果=0则初始化成功 =1则初始化失败
 159   1           Delay(100) ;
 160   1           DQ = 1 ; 
 161   1           
 162   1           return(presence) ; //返回信号,0=presence,1= no presence
 163   1      }
 164          
 165          
 166          /* 读一个字节                     */
 167          /*******************************************************************/
 168           ReadOneChar(void)
 169          {
 170   1      unsigned char i = 0 ;
 171   1      unsigned char dat = 0 ;
 172   1      
 173   1      for (i = 8 ; i > 0 ; i--)
 174   1        {
 175   2          DQ = 0 ; // 给脉冲信号
 176   2          dat >>= 1 ;
 177   2          DQ = 1 ; // 给脉冲信号
 178   2      
 179   2          if(DQ)
C51 COMPILER V7.50   TEMPER                                                                05/14/2007 21:37:30 PAGE 4   

 180   2           dat |= 0x80 ;
 181   2          Delay(4) ;
 182   2        }
 183   1      
 184   1          return (dat) ;
 185   1      }
 186          
 187          /* 写一个字节                                         */
 188          /*******************************************************************/
 189           WriteOneChar(unsigned char dat)
 190          {
 191   1        unsigned char i = 0 ;
 192   1        for (i = 8 ; i > 0 ; i--)
 193   1        {
 194   2          DQ = 0 ;
 195   2          DQ = dat&0x01 ;
 196   2          Delay(5) ;
 197   2      
 198   2          DQ = 1 ;
 199   2          dat>>=1 ;
 200   2        }
 201   1      }
 202          
 203          /* 读取温度                            */
 204          /*******************************************************************/
 205           Read_Temperature(void)
 206          {
 207   1           Init_DS18B20() ;
 208   1        
 209   1           WriteOneChar(0xCC) ;  // 跳过读序号列号的操作
 210   1           WriteOneChar(0x44) ;  // 启动温度转换
 211   1      
 212   1           Init_DS18B20() ;
 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          /* 数据转换与温度显示                                              */
 221          /*******************************************************************/
 222           Disp_Temperature()
 223          {
 224   1        display[4]=temp_data[0]&0x0f ;
 225   1        display[0]=ditab[display[4]]+0x30 ;     //查表得小数位的值
 226   1        
 227   1        display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;
 228   1        display[3]=display[4]/100+0x30 ;
 229   1        display[1]=display[4]%100 ;
 230   1        display[2]=display[1]/10+0x30 ;
 231   1        display[1]=display[1]%10+0x30 ;
 232   1      
 233   1          if(display[3]==0x30)        //高位为0,不显示
 234   1         { 
 235   2           display[3]=0x20 ;              
 236   2           if(display[2]==0x30)      //次高位为0,不显示
 237   2           display[2]=0x20 ;
 238   2         }
 239   1      
 240   1           lcd_pos(0x48) ;             
 241   1           lcd_wdat(display[3]) ;        //百位数显示 
C51 COMPILER V7.50   TEMPER                                                                05/14/2007 21:37:30 PAGE 5   

 242   1           lcd_pos(0x49) ;             
 243   1           lcd_wdat(display[2]) ;        //十位数显示 
 244   1        lcd_pos(0x4a) ;             
 245   1           lcd_wdat(display[1]) ;        //个位数显示 
 246   1        lcd_pos(0x4c) ;             
 247   1           lcd_wdat(display[0]) ;        //小数位数显示 
 248   1      }  
 249          
 250          /*******************************************************************/
 251          /* 蜂鸣器响一声                 */
 252          /*******************************************************************/
 253          void beep()
 254            {
 255   1          unsigned char y ;
 256   1          for (y=0 ;y<100 ;y++)
 257   1          {
 258   2            Delay(60) ;
 259   2            BEEP=!BEEP ;                //BEEP取反
 260   2          } 
 261   1          BEEP=1 ;                      //关闭蜂鸣器
 262   1       Delay(40000) ;
 263   1        }
 264          
 265          /* DS18B20 OK 显示菜单                                             */
 266          /*******************************************************************/
 267          void  Ok_Menu ()
 268          { 
 269   1          uchar  m ;
 270   1          lcd_init() ;                //初始化LCD 
 271   1                  
 272   1          lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
 273   1           m = 0 ;
 274   1          while(cdis1[m] != '\0')
 275   1           {                         //显示字符
 276   2             lcd_wdat(cdis1[m]) ;
 277   2             m++ ;
 278   2           }
 279   1      
 280   1          lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
 281   1           m = 0 ;
 282   1          while(cdis2[m] != '\0')
 283   1           {
 284   2             lcd_wdat(cdis2[m]) ;      //显示字符
 285   2             m++ ;
 286   2           }
 287   1      
 288   1           writetab() ;               //自定义字符写入CGRAM
 289   1           delay1(5) ;
 290   1           lcd_pos(0x4d) ;
 291   1           lcd_wdat(0x00) ;          //显示自定义字符
 292   1      }
 293          
 294          
 295          /* DS18B20 ERROR 显示菜单                             */
 296          /*******************************************************************/
 297          void  Error_Menu ()
 298          {
 299   1           uchar  m ;
 300   1           lcd_init() ;                //初始化LCD 
 301   1       
 302   1          lcd_pos(0) ;                //设置显示位置为第一行的第1个字符
 303   1           m = 0 ;
C51 COMPILER V7.50   TEMPER                                                                05/14/2007 21:37:30 PAGE 6   

 304   1           while(cdis3[m] != '\0')
 305   1           {                         //显示字符
 306   2             lcd_wdat(cdis3[m]) ;
 307   2             m++ ;
 308   2           }
 309   1      
 310   1           lcd_pos(0x40) ;             //设置显示位置为第二行第1个字符
 311   1           m = 0 ;
 312   1           while(cdis4[m] != '\0')
 313   1           {
 314   2             lcd_wdat(cdis4[m]) ;      //显示字符
 315   2             m++ ;
 316   2           }
 317   1      }
 318          
 319          
 320          /* 主函数     */
 321          /************************************/
 322          void main()
 323           {        delay1(10) ;
 324   1           Ok_Menu () ;
 325   1      
 326   1       do
 327   1        {
 328   2            Read_Temperature() ;
 329   2         Disp_Temperature() ;
 330   2           }
 331   1          while(!presence)  ;
 332   1      
 333   1           Error_Menu () ;
 334   1      
 335   1       do
 336   1        {  
 337   2          Init_DS18B20() ;
 338   2          beep() ;
 339   2           }
 340   1       while(presence) ;
 341   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    629    ----
   CONSTANT SIZE    =     92    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7    ----
   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 + -