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

📄 all.lst

📁 ds18b20测温程序,在keilc51调适通过
💻 LST
📖 第 1 页 / 共 4 页
字号:
 231   1        unsigned char i=0;
 232   1        unsigned char j=0;
 233   1        unsigned char dat=0;
 234   1              for (i=0;i<8;i++)
 235   1               {
 236   2                        DQ = 0;               //给脉冲信号
 237   2                        dat>>=1;              //右移位等待接收一位数据
 238   2                        DQ = 1;               //给脉冲信号
 239   2                        for(j=0;j<3;j++) ;    //延时15微秒
 240   2                        if(DQ)                //从低位开始接收数据
 241   2                        dat|=0x80; 
C51 COMPILER V7.20   ALL                                                                   01/16/2009 13:29:33 PAGE 5   

 242   2                        Delay_short(6);       //等待复位
 243   2               }
 244   1         return(dat);
 245   1      }
 246          
 247          /*向ds18b20写一个字节 dat为待写入字节*/ 
 248          void DS_WriteByte(unsigned char dat)
 249          {
 250   1              unsigned char i=0;
 251   1              for (i=0; i<8; i++)
 252   1              {
 253   2                      DQ = 0;  //给脉冲信号
 254   2                      DQ = dat&0x01;  //从低位开始发送数据
 255   2              Delay_short(5);
 256   2                      DQ = 1;  //给脉冲信号
 257   2              dat>>=1; //右移位等待发送
 258   2          }
 259   1        Delay_short(5) ;
 260   1      }
 261          
 262          /*读DS18B20序列号程序*/
 263          /*入口参数:器件序号*/
 264          /*全局变量:ID[5][8]*/
 265          void DS_ReadID(unsigned char Num)
 266          {
 267   1        signed char i;
 268   1        DS_Reset();
 269   1        DS_WriteByte(READ_ROM) ;
 270   1        for(i=7;i>-1;i--)                       //从最低位开始读取
 271   1         {
 272   2              ID[Num][i]=DS_ReadByte();
 273   2          }
 274   1      }       
 275          
 276          /*匹配序列号程序           */
 277          /*入口参数:器件序号(0-4)*/
 278          /*全局变量:ID[5][8]       */
 279          unsigned char Match_ID(unsigned char Num)
 280          {
 281   1        signed char i;
 282   1        if(DS_Reset()==1)                              //有器件响应
 283   1         {
 284   2               DS_WriteByte(MATCH_ROM);        //发送ID
 285   2               for(i=7;i>-1;i--)
 286   2                {
 287   3                      DS_WriteByte(ID[Num][i]);
 288   3                }
 289   2               return 1;                                   //返回1表示成功
 290   2         }
 291   1        else
 292   1           return 0;                                   //返回0表示失败
 293   1      }
 294          
 295          /*显示序列号程序         */
 296          /*入口参数为器件序号(0-4)*/
 297          /*全局变量:ID[5][8]     */
 298          void Show_ID(unsigned char Num)   //Num为序号
 299          { 
 300   1        unsigned char i;
 301   1        GotoXY(0,2);                                    //显示NO:
 302   1        Print("NO:");
 303   1        GotoXY(3,2);
C51 COMPILER V7.20   ALL                                                                   01/16/2009 13:29:33 PAGE 6   

 304   1        LCD_Write(LCD_DATA,Num+1+0x30); //显示序号(1-5)对应ID0-ID4
 305   1        GotoXY(0,1);
 306   1        for(i=0;i<8;i++)
 307   1              {
 308   2               unsigned char l=ID[Num][i]&0x0f;           //取低4位
 309   2               unsigned char h=ID[Num][i]&0xf0;               //取高4位
 310   2               h>>=4;
 311   2               if((h>=0x00)&&(h<=0x09))
 312   2                LCD_Write(LCD_DATA,h+0x30);          //取ASCII码
 313   2               else  
 314   2                LCD_Write(LCD_DATA,h+0x37);          //取ASCII码
 315   2      
 316   2               if((l>=0x00)&&(l<=0x09))
 317   2                LCD_Write(LCD_DATA,l+0x30);          //取ASCII码
 318   2               else  
 319   2                LCD_Write(LCD_DATA,l+0x37);          //取ASCII码
 320   2              }
 321   1      }
 322          
 323          /*读取ds18b20当前温度 和Th,Tl              */
 324          /*入口参数:器件编号(0-4)                 */
 325          /*全局变量DS_Temp[5][3] DS_Th[5] DS_Tl[5]*/
 326          
 327          void DS_ReadTemp(unsigned char Num)
 328          {
 329   1              unsigned char temp_lsb=0; //温度寄存器低字节
 330   1              unsigned char temp_msb=0; //温度寄存器高字节
 331   1              unsigned char Temp=0;
 332   1      
 333   1              DS_Reset();                                 //初始化
 334   1              DS_WriteByte(SKIP_ROM);         //跳过读序号列号的操作
 335   1              DS_WriteByte(CONVERT_T);            //启动温度转换
 336   1      
 337   1              Delay_short(5);                 //延时过程
 338   1              DS_Reset();                                 //初始化
 339   1              Match_ID(Num);                  //匹配ROM
 340   1              DS_WriteByte(READ_SCR);         //读取温度寄存器前两个就是温度
 341   1      
 342   1              temp_lsb=DS_ReadByte();             //读取温度寄存器低字节
 343   1              temp_msb=DS_ReadByte();             //读取温度寄存器高字节
 344   1              DS_Th[Num]=DS_ReadByte();               //读取TH
 345   1              DS_Tl[Num]=DS_ReadByte();               //读取TL
 346   1              
 347   1               if(temp_msb>0xf0)
 348   1                 DS_Temp[Num][0]=1;                   //取温度符号(正为0,负为1)
 349   1           else
 350   1                 DS_Temp[Num][0]=0;   
 351   1      
 352   1              DS_Temp[Num][1]=temp_msb<<4;         //取温度整数部分的高四位
 353   1              DS_Temp[Num][1]+=(temp_lsb&0xf0)>>4; //取温度整数部分的低四位
 354   1              Temp=DS_Temp[Num][1];
 355   1          DS_Temp[Num][2]=temp_lsb&0x0f;       //取温度小数部分      
 356   1      
 357   1               if(DS_Temp[Num][0]==1)                          //温度为负的处理
 358   1                {
 359   2                      DS_Temp[Num][1]=~DS_Temp[Num][1];  //整数取反
 360   2                      DS_Temp[Num][2]=~DS_Temp[Num][2]+1;//小数取反加1
 361   2                        if(DS_Temp[Num][2]==0x10)                //如果有进位(在温度为负整数时)
 362   2                          {
 363   3                                DS_Temp[Num][1]=DS_Temp[Num][1]+1;    //整数加1   
 364   3                                DS_Temp[Num][2]= 0;   //小数清0
 365   3                              }
C51 COMPILER V7.20   ALL                                                                   01/16/2009 13:29:33 PAGE 7   

 366   2                }              
 367   1              if((Temp+1>DS_Th[Num])||(Temp<DS_Tl[Num]))
 368   1                Alarm_flag=1;
 369   1              else
 370   1                Alarm_flag=0;
 371   1      }
 372          
 373          /*温度数据转换成液晶字符显示      */
 374          /*全局变量 DS_Temp[5][3]          */
 375          /*入口参数 器件序号(0-4)          */
 376          void TempDisp(unsigned char Num)   
 377          {
 378   1        GotoXY(0,1);                                    
 379   1        Print("NO.");                              //显示NO.
 380   1        GotoXY(3,1);
 381   1        LCD_Write(LCD_DATA,Num+1+'0');         //显示器件序号(1-5)
 382   1        LCD_Write(LCD_DATA,':');               //显示“:”
 383   1         if(DS_Temp[Num][0]==0)
 384   1           LCD_Write(LCD_DATA,'+') ;   //温度为正显示“+”否则显示“-”
 385   1         else
 386   1           LCD_Write(LCD_DATA,'-') ;
 387   1      
 388   1        LCD_Write(LCD_DATA,DS_Temp[Num][1]/100+'0') ;                //百位
 389   1        LCD_Write(LCD_DATA,(DS_Temp[Num][1]%100)/10+'0') ;       //十位
 390   1        LCD_Write(LCD_DATA,DS_Temp[Num][1]%10+'0') ;                 //个位
 391   1        LCD_Write(LCD_DATA,'.') ;                                                            //小数点
 392   1        LCD_Write(LCD_DATA,DS_Temp[Num][2]*10/16+'0') ;              //十分位
 393   1      }
 394          
 395          
 396          /*显示TH和TL程序                              */
 397          /*入口参数:器件序号Num(0-4)位置坐标y(1,2)  */
 398          /*全局变量:DS_Tl[5] DS_Th[5]                 */
 399          
 400          void ThTlDisp(unsigned char Num,unsigned char y)
 401          {
 402   1        unsigned char Th=DS_Th[Num];   //
 403   1        unsigned char Tl=DS_Tl[Num];
 404   1        
 405   1        GotoXY(1,y);
 406   1        Print("TH=");                                  //显示TH
 407   1          if(Th>=0x80)                             //为负显示“-”并取绝对值  
 408   1               {
 409   2                LCD_Write(LCD_DATA,'-');
 410   2                Th=~Th+1;
 411   2               }
 412   1          else
 413   1            LCD_Write(LCD_DATA,'+');   //为正显示“+”
 414   1      
 415   1        LCD_Write(LCD_DATA,Th/100+'0');                //百位
 416   1        LCD_Write(LCD_DATA,(Th%100)/10+'0');   //十位
 417   1        LCD_Write(LCD_DATA,Th%10+'0');                 //个位
 418   1      
 419   1        GotoXY(9,y);
 420   1        Print("TL=");                              //显示TL
 421   1          if(Tl>=0x80)                             //为负显示“-”并取绝对值
 422   1               {
 423   2                LCD_Write(LCD_DATA,'-');
 424   2                Tl=~Tl+1;
 425   2               }
 426   1          else
 427   1            LCD_Write(LCD_DATA,'+');   //为正显示“+”
C51 COMPILER V7.20   ALL                                                                   01/16/2009 13:29:33 PAGE 8   

 428   1      
 429   1        LCD_Write(LCD_DATA,Tl/10+'0');  //十位
 430   1        LCD_Write(LCD_DATA,Tl%10+'0');  //个位
 431   1      }
 432          
 433          
 434          /////////////////////////////////////////////////////
 435          /***************STC单片机ISP功能部分****************/
 436          /////////////////////////////////////////////////////
 437          
 438          /*STC新增特殊功能寄存器声明*/
 439          sfr ISP_DATA  = 0xe2; //ISP数据寄存器
 440          sfr ISP_ADDRH = 0xe3; //EEPROM地址高8位
 441          sfr ISP_ADDRL = 0xe4; //EEPROM地址高8位
 442          sfr ISP_CMD   = 0xe5; //ISP命令模式寄存器:0无操作,1读,2写,3擦除
 443          sfr ISP_TRIG  = 0xe6; //ISP命令触发寄存器:先写46H再写B9H则ISP_CMD生效
 444          sfr ISP_CONTR = 0xe7; //ISP控制寄存器:取81H允许ISP功能
 445          
 446          /*定义ISP命令模式*/
 447          #define  ISP_ReadByte  0x01     //字节读指令
 448          #define  ISP_WeiteByte 0x02     //字节写指令
 449          #define  ISP_Erase     0x03     //扇区擦除指令
 450          
 451          
 452          /*ISP读DS18B20 ID程序                                */
 453          /*入口参数:1,DS18b20编号(0-4)                     */
 454          /*全局变量:DS18B20的ID号存储区:ID[5][8]            */
 455          /*功    能:读出某个扇区内的8字节DS18B20的ID载入RAM  */
 456          void ISP_Read8(unsigned char Num)
 457          {
 458   1        unsigned char i;
 459   1        ISP_CONTR=0x81;                   //允许ISP功能,并配制等待时间
 460   1        ISP_CMD=ISP_ReadByte;     //送ISP字节读指令
 461   1        ISP_ADDRH=0x20+Num*0x02;  //送地址高字节
 462   1        for(i=0;i<8;i++)                      //读8字节
 463   1         {
 464   2          ISP_ADDRL=0x00+i;           //送地址低字节,均从每个扇区的起始地址开始
 465   2              ISP_TRIG=0x46;
 466   2              ISP_TRIG=0xB9;                  //触发ISP指令
 467   2              Delay_short(1);                 //短暂延时

⌨️ 快捷键说明

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