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

📄 13-18b20

📁 18B20测温1602LCD显示(STC单片机)
💻
📖 第 1 页 / 共 2 页
字号:
 171   2                     dat|=0x80;  //如果读到的数据是1,则将1存入dat
 172   2                 DelayXus(60);  
 173   2               }                          
 174   1               return(dat);    //返回读出的十进制数据
 175   1      }
 176          /*****************************************************
 177          函数功能:向DS18B20写入一个字节数据
 178          入口参数:dat
 179          ***************************************************/  
C51 COMPILER V9.01   EX90                                                                  10/13/2012 12:28:23 PAGE 4   

 180          void  WriteOneChar(unsigned char dat)
 181          {       unsigned char i=0;
 182   1              for (i=0; i<8; i++)
 183   1              {       DQ = 0;                     //开始时间片
 184   2              DelayXus(1);                //延时等待
 185   2              dat >>= 1;                  //送出数据
 186   2              DQ = CY;
 187   2              DelayXus(60);               //等待时间片结束
 188   2              DQ = 1;                     //恢复数据线
 189   2              DelayXus(1);   
 190   2              }
 191   1                for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间
 192   1      }
 193          /******************************************************************************
 194          以下是与温度有关的显示设置
 195          函数功能:显示没有检测到DS18B20
 196          ***************************************************/   
 197          void display_error(void)
 198          {       unsigned char i;
 199   1              WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 200   1              i = 0;                //从第一个字符开始显示
 201   1              while(Error[i] != '\0')  //只要没有写到结束标志,就继续写
 202   1              {       WriteData(Error[i]);   //将字符常量写入LCD
 203   2                      i++;//指向下一个字符
 204   2                      delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 205   2              }       
 206   1              while(1);              //进入死循环,等待查明原因
 207   1      }
 208          /*****************************************************
 209          函数功能:显示说明信息
 210          ***************************************************/   
 211          void display_explain(void)
 212          {       unsigned char i;
 213   1              WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 214   1              i = 0;  //从第一个字符开始显示
 215   1              while(Str[i] != '\0')  //只要没有写到结束标志,就继续写
 216   1              {       WriteData(Str[i]);   //将字符常量写入LCD
 217   2                      i++;                 //指向下一个字符
 218   2                      delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 219   2              }       
 220   1      }
 221          /*****************************************************
 222          函数功能:显示温度符号
 223          ***************************************************/   
 224          void display_symbol(void)
 225          {       unsigned char i;
 226   1          WriteAddress(0x40);    //写显示地址,将在第2行第1列开始显示
 227   1              i = 0;                //从第一个字符开始显示
 228   1              while(Temp[i] != '\0')  //只要没有写到结束标志,就继续写
 229   1              {       WriteData(Temp[i]);   //将字符常量写入LCD
 230   2                      i++;                 //指向下一个字符
 231   2                      delaynms(50);        //延时1ms给硬件一点反应时间
 232   2              }       
 233   1      }
 234          
 235          /*****************************************************
 236          函数功能:显示温度的小数点
 237          ***************************************************/   
 238          void    display_dot(void)
 239          {       WriteAddress(0x49);       //写显示地址,将在第2行第10列开始显示            
 240   1              WriteData('.');      //将小数点的字符常量写入LCD
 241   1              delaynms(50);         //延时1ms给硬件一点反应时间               
C51 COMPILER V9.01   EX90                                                                  10/13/2012 12:28:23 PAGE 5   

 242   1      }
 243          /*****************************************************
 244          函数功能:显示温度的单位(Cent)
 245          ***************************************************/   
 246          void    display_cent(void)
 247          {       unsigned char i;    
 248   1              WriteAddress(0x4c);        //写显示地址,将在第2行第13列开始显示        
 249   1          i = 0;                    //从第一个字符开始显示 
 250   1              while(Cent[i] != '\0')     //只要没有写到结束标志,就继续写
 251   1              {       WriteData(Cent[i]);     //将字符常量写入LCD
 252   2                      i++;                 //指向下一个字符
 253   2                      delaynms(50);        //延时1ms给硬件一点反应时间
 254   2              }       
 255   1      }
 256          /*****************************************************
 257          函数功能:显示温度的整数部分
 258          入口参数:x
 259          ***************************************************/ 
 260          void display_temp1(unsigned char x)
 261          {       unsigned char j,k,l;     //j,k,l分别储存温度的百位、十位和个位
 262   1              j=x/100;    //取百位
 263   1              k=(x%100)/10;   //取十位
 264   1              l=x%10;       //取个位  
 265   1              WriteAddress(0x46);    //写显示地址,将在第2行第7列开始显示
 266   1              WriteData(digit[j]);    //将百位数字的字符常量写入LCD
 267   1              WriteAddress(0x47);
 268   1              WriteData(digit[k]);    //将十位数字的字符常量写入LCD
 269   1              WriteAddress(0x48);
 270   1              WriteData(digit[l]);    //将个位数字的字符常量写入LCD
 271   1              delaynms(50);         //延时1ms给硬件一点反应时间     
 272   1       }
 273           /*****************************************************
 274          函数功能:显示温度的小数数部分
 275          入口参数:x
 276          ***************************************************/ 
 277           void display_temp2(unsigned char x)
 278          {       WriteAddress(0x4a);      //写显示地址,将在第2行第11列开始显示
 279   1              WriteData(digit[x]);     //将小数部分的第一位数字字符常量写入LCD
 280   1              delaynms(50);          //延时1ms给硬件一点反应时间
 281   1      }
 282          /*****************************************************
 283          函数功能:做好读温度的准备
 284          ***************************************************/ 
 285          void ReadyReadTemp(void)
 286          {       Init_DS18B20();     //将DS18B20初始化
 287   1              WriteOneChar(0xCC); // 跳过读序号列号的操作
 288   1              WriteOneChar(0x44); // 启动温度转换       
 289   1              for(time=0;time<100;time++);     //温度转换需要一点时间
 290   1              Init_DS18B20();     //将DS18B20初始化
 291   1              WriteOneChar(0xCC); //跳过读序号列号的操作
 292   1              WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位       
 293   1      }
 294          
 295          
 296          /*****************************************************
 297          函数功能:主函数
 298          ***************************************************/ 
 299          
 300          void main(void)
 301          {       unsigned char TL;     //储存暂存器的温度低位
 302   1          unsigned char TH;    //储存暂存器的温度高位
 303   1          unsigned char TN;      //储存温度的整数部分
C51 COMPILER V9.01   EX90                                                                  10/13/2012 12:28:23 PAGE 6   

 304   1              unsigned char TD;       //储存温度的小数部分
 305   1              LcdInitiate();         //将液晶初始化
 306   1              delaynms(5);        //延时5ms给硬件一点反应时间 
 307   1              if(Init_DS18B20()==1)
 308   1                      display_error();
 309   1              display_explain();
 310   1              display_symbol();    //显示温度说明
 311   1          display_dot();       //显示温度的小数点
 312   1          display_cent();      //显示温度的单位
 313   1              while(1)                //不断检测并显示温度
 314   1              {       ReadyReadTemp();     //读温度准备
 315   2                      TL=ReadOneChar();    //先读的是温度值低位
 316   2                      TH=ReadOneChar();    //接着读的是温度值高位
 317   2                      TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
 318   2                                               //这样得出的是温度的整数部分,小数部分被丢弃了
 319   2                      TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
 320   2                                                //这样得到的是温度小数部分的第一位数字(保留1位小数)
 321   2                      display_temp1(TN);    //显示温度的整数部分
 322   2                      display_temp2(TD);    //显示温度的小数部分
 323   2              delaynms(10);               
 324   2          }   
 325   1                                
 326   1      }
 327          
 328          
 329          
 330          
 331          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    627    ----
   CONSTANT SIZE    =     50    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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