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

📄 yl-10-ds18b20

📁 DS18B20测温资料集全
💻
📖 第 1 页 / 共 2 页
字号:
 182   2           }                     
 183   1      return(dat);    //返回读出的十进制数据
 184   1      }
 185          /*****************************************************
 186          函数功能:向DS18B20写入一个字节数据
 187          入口参数:dat
 188          ***************************************************/ 
 189          WriteOneChar(unsigned char dat)
 190          {
 191   1      unsigned char i=0;
 192   1      for (i=0; i<8; i++)
 193   1         {
 194   2          DQ =1;         // 先将数据线拉高
 195   2          _nop_();      //等待一个机器周期 
 196   2          DQ=0;          //将数据线从高拉低时即启动写时序       
 197   2          DQ=dat&0x01;   //利用与运算取出要写的某位二进制数据,
 198   2                             //并将其送到数据线上等待DS18B20采样 
 199   2         for(time=0;time<10;time++) 
 200   2             ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
 201   2          DQ=1;          //释放数据线      
 202   2          for(time=0;time<1;time++)
 203   2           ;//延时3us,两个写时序间至少需要1us的恢复期
 204   2          dat>>=1;       //将dat中的各二进制位数据右移1位
 205   2         }
 206   1         for(time=0;time<4;time++)
 207   1                     ; //稍作延时,给硬件一点反应时间
 208   1      }
 209          /******************************************************************************
 210          以下是与温度有关的显示设置
 211          ******************************************************************************/
 212          /*****************************************************
 213          函数功能:显示没有检测到DS18B20
 214          ***************************************************/   
 215          void display_error(void)
 216          {
 217   1             unsigned char i;
 218   1            WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 219   1            i = 0;                //从第一个字符开始显示
 220   1           while(Error[i] != '\0') //只要没有写到结束标志,就继续写
 221   1           {      
 222   2            WriteData(Error[i]);   //将字符常量写入LCD
 223   2            i++;                 //指向下一个字符
 224   2            delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
 225   2           } 
 226   1           while(1)              //进入死循环,等待查明原因
 227   1            ;
 228   1      }
 229          /*****************************************************
 230          函数功能:显示说明信息
 231          ***************************************************/   
 232          void display_explain(void)
 233          {
 234   1             unsigned char i;
 235   1            WriteAddress(0x00);    //写显示地址,将在第1行第1列开始显示
 236   1            i = 0;                //从第一个字符开始显示
 237   1           while(Str[i] != '\0') //只要没有写到结束标志,就继续写
 238   1           {      
 239   2            WriteData(Str[i]);   //将字符常量写入LCD
 240   2            i++;                 //指向下一个字符
 241   2            delaynms(100);        //延时100ms较长时间,以看清关于显示的说明
C51 COMPILER V9.00   18B20瞋蝊                                                             06/01/2011 15:05:58 PAGE 5   

 242   2           } 
 243   1      }
 244          /*****************************************************
 245          函数功能:显示温度符号
 246          ***************************************************/   
 247          void display_symbol(void)
 248          {
 249   1             unsigned char i;
 250   1            WriteAddress(0x40);    //写显示地址,将在第2行第1列开始显示
 251   1            i = 0;                //从第一个字符开始显示
 252   1           while(Temp[i] != '\0') //只要没有写到结束标志,就继续写
 253   1           {      
 254   2            WriteData(Temp[i]);   //将字符常量写入LCD
 255   2            i++;                 //指向下一个字符
 256   2            delaynms(50);        //延时1ms给硬件一点反应时间
 257   2           } 
 258   1      }
 259          /*****************************************************
 260          函数功能:显示温度的小数点
 261          ***************************************************/   
 262          void display_dot(void)
 263          {         
 264   1      WriteAddress(0x49);   //写显示地址,将在第2行第10列开始显示     
 265   1      WriteData('.');      //将小数点的字符常量写入LCD
 266   1      delaynms(50);         //延时1ms给硬件一点反应时间  
 267   1      }
 268          /*****************************************************
 269          函数功能:显示温度的单位(Cent)
 270          ***************************************************/   
 271          void display_cent(void)
 272          {
 273   1                 unsigned char i;    
 274   1            WriteAddress(0x4c);        //写显示地址,将在第2行第13列开始显示 
 275   1            i = 0;                    //从第一个字符开始显示 
 276   1           while(Cent[i] != '\0')     //只要没有写到结束标志,就继续写
 277   1           {     
 278   2            WriteData(Cent[i]);     //将字符常量写入LCD
 279   2            i++;                 //指向下一个字符
 280   2            delaynms(50);        //延时1ms给硬件一点反应时间
 281   2           } 
 282   1      }
 283          /*****************************************************
 284          函数功能:显示温度的整数部分
 285          入口参数:x
 286          ***************************************************/ 
 287          void display_temp1(unsigned char x)
 288          {
 289   1      unsigned char j,k,l;     //j,k,l分别储存温度的百位、十位和个位
 290   1      j=x/100;              //取百位
 291   1      k=(x%100)/10;    //取十位
 292   1      l=x%10;             //取个位 
 293   1      WriteAddress(0x46);    //写显示地址,将在第2行第7列开始显示
 294   1      WriteData(digit[j]);    //将百位数字的字符常量写入LCD
 295   1      WriteData(digit[k]);    //将十位数字的字符常量写入LCD
 296   1      WriteData(digit[l]);    //将个位数字的字符常量写入LCD
 297   1      delaynms(50);         //延时1ms给硬件一点反应时间     
 298   1      }
 299          /*****************************************************
 300          函数功能:显示温度的小数数部分
 301          入口参数:x
 302          ***************************************************/ 
 303          void display_temP3(unsigned char x)
C51 COMPILER V9.00   18B20瞋蝊                                                             06/01/2011 15:05:58 PAGE 6   

 304          {
 305   1         WriteAddress(0x4a);      //写显示地址,将在第2行第11列开始显示
 306   1      WriteData(digit[x]);     //将小数部分的第一位数字字符常量写入LCD
 307   1      delaynms(50);          //延时1ms给硬件一点反应时间
 308   1      }
 309          /*****************************************************
 310          函数功能:做好读温度的准备
 311          ***************************************************/ 
 312          void ReadyReadTemp(void)
 313          {
 314   1            Init_DS18B20();     //将DS18B20初始化
 315   1         WriteOneChar(0xCC); // 跳过读序号列号的操作
 316   1         WriteOneChar(0x44); // 启动温度转换   
 317   1          for(time=0;time<100;time++)
 318   1                   ; //温度转换需要一点时间
 319   1         Init_DS18B20();     //将DS18B20初始化
 320   1         WriteOneChar(0xCC); //跳过读序号列号的操作
 321   1         WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位 
 322   1      }
 323          
 324          /*****************************************************
 325          函数功能:主函数
 326          ***************************************************/ 
 327          void main(void)
 328          {   
 329   1         unsigned char TL;     //储存暂存器的温度低位
 330   1           unsigned char TH;    //储存暂存器的温度高位
 331   1           unsigned char TN;      //储存温度的整数部分
 332   1         unsigned char TD;       //储存温度的小数部分
 333   1         LcdInitiate();         //将液晶初始化
 334   1          delaynms(5);        //延时5ms给硬件一点反应时间 
 335   1         if(Init_DS18B20()==1)
 336   1           display_error();
 337   1         display_explain();
 338   1         display_symbol();    //显示温度说明
 339   1            display_dot();       //显示温度的小数点
 340   1            display_cent();      //显示温度的单位
 341   1         while(1)                //不断检测并显示温度
 342   1      { 
 343   2         ReadyReadTemp();     //读温度准备
 344   2          TL=ReadOneChar();    //先读的是温度值低位
 345   2         TH=ReadOneChar();    //接着读的是温度值高位
 346   2         TN=TH*16+TL/16;      //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
 347   2                           //这样得出的是温度的整数部分,小数部分被丢弃了
 348   2          TD=(TL%16)*10/16;    //计算温度的小数部分,将余数乘以10再除以16取整,
 349   2                           //这样得到的是温度小数部分的第一位数字(保留1位小数)
 350   2          display_temp1(TN);    //显示温度的整数部分
 351   2          display_temP3(TD);    //显示温度的小数部分
 352   2            delaynms(10);               
 353   2          } 
 354   1           
 355   1      }
*** WARNING C290 IN LINE 208 OF 18B20测温.C: missing return value


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    635    ----
   CONSTANT SIZE    =     50    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      1       1
   IDATA SIZE       =   ----    ----
C51 COMPILER V9.00   18B20瞋蝊                                                             06/01/2011 15:05:58 PAGE 7   

   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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