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

📄 w014.lst

📁 W014-多功能数字温度表(DS18B20)
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V8.02   W014                                                                  06/07/2007 21:46:16 PAGE 1   


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

line level    source

   1          /*******************************************************************************
   2          * 实验名称: 多功能数字温度表(DS18B20)                                          *
   3          ********************************************************************************
   4          * 实验描述: 多功能数字温度表具有测温、预设温度上下限、声光报警等功能           *                          
             -     *
   5          * 实验说明: 各功能键如下:                                                                     *
   6          *                       S1      温度上下限设置及确认键                                                         *
   7          *                       S2          温度上(下)限加1键                                                                  *
   8          *           S3      温度上(下)限减1键                                          *
   9          *           BELL    声音报警                                                                                               *
  10          *           D04     光报警                                                                                                         * 
  11          *                                                                                                                                          *
  12          *                   温度上下限设置过程:                                                                                           *
  13          *                   (1)按S1进入温度上限设置界面,然后按S2或S3设置温度上限值,              *
  14          *                      最后按S1确认,自动进入温度下限设置界面。                                            *
  15          *                       (2)按S2或S3设置温度下限值,按S1确认,自动进入温度测量状态                  *
  16          *                                                                                                                                                          *
  17          *                      当温度超过上下限时,会发出声光报警,并显示相关信息                          *
  18          *******************************************************************************/
  19          
  20          #include <reg52.h>
  21          #include <intrins.h>
  22          
  23          #define uchar unsigned char
  24          #define uint  unsigned int
  25          
  26          
  27          sbit DQ = P3^7 ;         //定义DS18B20端口DQ 
  28          sbit BEEP = P1^4 ;       //定义蜂鸣器端口
  29          sbit RED_Light = P1^3 ;  //报警灯
  30          
  31          sbit LCD_RS = P2^3;
  32          sbit LCD_RW = P2^4;
  33          
  34          sbit HC138_A = P2^5;
  35          sbit HC138_B = P2^6;
  36          sbit HC138_C = P2^7;
  37          
  38          #define SELECT_LCD()    HC138_A=0; HC138_B=1; HC138_C=0
  39          #define NOSELECT_LCD()  HC138_A=1; HC138_B=1; HC138_C=1
  40          
  41          sbit S1 = P1^5 ;        //设置键和确认键
  42          sbit S2 = P1^6 ;        //加1键
  43          sbit S3 = P1^7 ;        //减1键
  44          
  45          bit presence  ;
  46          
  47          uchar TH=30;    //初始温度上限值
  48          uchar TL=25;    //初始温度下限值
  49          
  50          uchar Keyset_Flag = 0;  //S1键扫描标志位
  51          uchar BEEP_Flag = 0;    //蜂鸣器报警标志位
  52          
  53          uchar code  dis_code1[ ] = {"   DS18B20 OK   "} ;
  54          uchar code  dis_code2[ ] = {"  TEMP:    .  C "} ;
C51 COMPILER V8.02   W014                                                                  06/07/2007 21:46:16 PAGE 2   

  55          uchar code  dis_code3[ ] = {" DS18B20  ERR0R "} ;
  56          uchar code  dis_code4[ ] = {"  PLEASE CHECK  "} ;
  57          
  58          uchar data  temp_data[2] = {0x00,0x00} ;   //温度数据缓存
  59          uchar data  display_TH[2] = {0x00,0x00} ;  //温度上限值十位个位
  60          uchar data  display_TL[2] = {0x00,0x00} ;  //温度下限值十位个位
  61          
  62          uchar data  dis_data[5] =   {0x00,0x00,0x00,0x00,0x00} ;  //温度值百十个小数位及一个数据缓存
  63          
  64          /*温度小数部分查表*/
  65          uchar code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
  66                                   0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;
  67          
  68          /*自定义字符*/
  69          uchar code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
  70          
  71          
  72          
  73          /*******************************************************************/
  74          /*                                                                 */
  75          /* us级延时函数                                                    */
  76          /*                                                                 */
  77          /*******************************************************************/
  78          void Delay(unsigned int num) 
  79          {
  80   1        while( --num ) ;
  81   1      }
  82          
  83          /*******************************************************************/
  84          /*                                                                 */
  85          /* ms级延时函数                                                    */
  86          /*                                                                 */
  87          /*******************************************************************/
  88          void Delayms(unsigned char ms)
  89          {                                               
  90   1              unsigned char i;
  91   1              while(ms--)
  92   1              {
  93   2                      for(i = 0; i < 120; i++);
  94   2              }
  95   1      }
  96          
  97          /*******************************************************************/
  98          /*                                                                 */
  99          /* 检测LCD的忙碌状态                                               */
 100          /*                                                                 */
 101          /*******************************************************************/
 102          bit LCD_Busy()          
 103          {                                                       
 104   1              bit result;
 105   1              LCD_RS = 0;                         
 106   1              LCD_RW = 1;
 107   1              SELECT_LCD();
 108   1              _nop_();
 109   1              _nop_();
 110   1              _nop_();
 111   1              _nop_();
 112   1              result = (bit)(P0 & 0x80);      //检查LCD的DB7的值 1为忙 0为空闲,可写指令与数据
 113   1              NOSELECT_LCD();
 114   1              return result;  
 115   1      }
 116          
C51 COMPILER V8.02   W014                                                                  06/07/2007 21:46:16 PAGE 3   

 117          /*******************************************************************/
 118          /*                                                                 */
 119          /* 写指令数据到LCD                                                 */
 120          /*                                                                 */
 121          /*******************************************************************/
 122          LCD_WriteCommand(uchar cmd)      
 123          {                                                          
 124   1              while(LCD_Busy());
 125   1              LCD_RS = 0;
 126   1              LCD_RW = 0;
 127   1              NOSELECT_LCD();
 128   1              _nop_();
 129   1              _nop_();        
 130   1              P0 = cmd;
 131   1              _nop_();
 132   1              _nop_();
 133   1              _nop_();
 134   1              _nop_();
 135   1              SELECT_LCD();
 136   1              _nop_();
 137   1              _nop_();
 138   1              _nop_();
 139   1              _nop_();
 140   1              NOSELECT_LCD();         
 141   1      }
 142          
 143          /*******************************************************************/
 144          /*                                                                 */
 145          /* 写显示数据到LCD                                                 */
 146          /*                                                                 */
 147          /*******************************************************************/
 148          LCD_WriteDate(uchar dat)
 149          {                                                       
 150   1              while(LCD_Busy());
 151   1              LCD_RS = 1;
 152   1              LCD_RW = 0;
 153   1              NOSELECT_LCD();
 154   1              P0 = dat;
 155   1              _nop_();
 156   1              _nop_();
 157   1              _nop_();
 158   1              _nop_();
 159   1              SELECT_LCD();
 160   1              _nop_();
 161   1              _nop_();
 162   1              _nop_();
 163   1              _nop_();
 164   1              NOSELECT_LCD(); 
 165   1      }
 166          
 167          /*******************************************************************/
 168          /*                                                                 */
 169          /* 设定字符在LCD上显示的位置                                       */
 170          /*                                                                 */
 171          /*******************************************************************/
 172          LCD_DisplayPosit(uchar pos)        
 173          {                                                       
 174   1              LCD_WriteCommand(pos | 0x80);
 175   1      }
 176          
 177          /*******************************************************************/
 178          /*                                                                 */
C51 COMPILER V8.02   W014                                                                  06/07/2007 21:46:16 PAGE 4   

 179          /* LCD初始化                                                       */
 180          /*                                                                 */
 181          /*******************************************************************/
 182          LCD_Init()                      
 183          {                                                       
 184   1              LCD_WriteCommand(0x38);    
 185   1              Delay(5);
 186   1              LCD_WriteCommand(0x0c);   
 187   1              Delay(5);
 188   1              LCD_WriteCommand(0x06);    
 189   1              Delay(5);
 190   1              LCD_WriteCommand(0x01);    
 191   1              Delay(5);
 192   1      }
 193          
 194          /*******************************************************************/
 195          /*                                                                 */
 196          /* 自定义字符写入CGRAM函数                                         */
 197          /*                                                                 */
 198          /*******************************************************************/
 199          void  LCD_WriteMytab()  
 200          {  
 201   1          unsigned char i ;
 202   1          LCD_WriteCommand(0x40) ;      //写CGRAM
 203   1          for (i = 0 ; i< 8 ; i++)       
 204   1          LCD_WriteDate(mytab[ i ]) ;        
 205   1      }
 206          
 207          /*******************************************************************/
 208          /*                                                                 */
 209          /* LCD上显示两行字符函数                                           */
 210          /*                                                                 */
 211          /*******************************************************************/
 212          void LCD_DisplayLine(uchar a[ ],uchar b[ ])     
 213          {
 214   1          uchar  m ;
 215   1          LCD_Init() ;                
 216   1                  
 217   1          LCD_DisplayPosit(0) ;      //设置显示位置为第一行的第1个字符
 218   1           m = 0 ;
 219   1          while(a[m] != '\0')
 220   1           {                         //显示第一行字符
 221   2             LCD_WriteDate(a[m]) ;
 222   2             m++ ;
 223   2           }
 224   1      
 225   1          LCD_DisplayPosit(0x40) ;   //设置显示位置为第二行第1个字符
 226   1           m = 0 ;
 227   1          while(b[m] != '\0')
 228   1           {
 229   2             LCD_WriteDate(b[m]) ;   //显示第二行字符
 230   2             m++ ;
 231   2           } 
 232   1      }
 233          
 234          /*******************************************************************/
 235          /*                                                                 */
 236          /* DS18B20初始化                                                   */
 237          /*                                                                 */
 238          /*******************************************************************/
 239          DS18B20_Init(void)       
 240          {  
C51 COMPILER V8.02   W014                                                                  06/07/2007 21:46:16 PAGE 5   

 241   1           DQ = 1 ;        //DQ复位
 242   1           Delay(8) ;      //延时
 243   1      
 244   1           DQ = 0 ;        //将DQ拉低
 245   1           Delay(90) ;     //精确延时 大于 480us
 246   1      
 247   1           DQ = 1 ;        //拉高总线
 248   1           Delay(8) ;
 249   1      
 250   1           presence = DQ ;    //如果 presence=0则初始化成功 presence=1则初始化失败
 251   1           Delay(100) ;
 252   1           DQ = 1 ; 

⌨️ 快捷键说明

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