DS18B20温度传感器STC8代码

DS18B20封装与指令集

 1#define DS18B20 P36
 2void DS18B20_Init(void)
 3{
 4}
 5// DS18B20复位(初始化)
 6u8 DS18B20_Write_Reset(void)
 7{
 8   u8 dat;
 9   DS18B20 = 1;
10   DelayXus(6);
11   DS18B20 = 0;
12   Delay480us();
13   DS18B20 = 1;
14   Delay60us();
15   dat = DS18B20; // 0复位成功 1复位失败
16   Delay420us();
17   return dat;
18}
19//写数据
20void DS18B20_Write_Byte(u8 cmd)
21{
22    u8 i;
23   for (i = 0; i < 8; i++)
24   {
25       DS18B20 = 0;
26       DelayXus(2);
27       if (cmd & 0x01) // 1位1位的写数据
28           DS18B20 = 1;
29       else
30           DS18B20 = 0;
31       Delay60us();
32       DS18B20 = 1;
33       cmd >>= 1; //右移1位
34   }
35}
36//读数据
37u8 DS18B20_Read_Byte(void)
38{
39   u8 i;
40   u8 dat = 0;
41   for (i = 0; i < 8; i++)
42   {
43       dat >>= 1;
44       DS18B20 = 0;
45       DelayXus(2);
46       DS18B20 = 1;
47       if (DS18B20) // 1位1位的写数据
48           dat |= 0x80;
49       Delay60us();
50   }
51   return dat;
52}
53float DS18B20_Read_Temp(void)
54{
55   u8 MSB = 0, MSL = 0; u16 Temp=0;
56   float FTemp = 0;
57   if (DS18B20_Write_Reset() == 0)
58   {
59       DS18B20_Write_Reset();
60       DS18B20_Write_Byte(0xcc); //不匹配rom
61       DS18B20_Write_Byte(0x44); //温度转换
62       DelayXms(250);
63       DelayXms(250);
64       DelayXms(250);
65       DS18B20_Write_Reset();
66       DS18B20_Write_Byte(0xcc); //不匹配rom
67       DS18B20_Write_Byte(0xBE); //读温度
68       MSL=DS18B20_Read_Byte();  //温度低位
69       MSB=DS18B20_Read_Byte(); //温度高位
70       Temp=MSB;
71       Temp=Temp<<8|MSL;//合并高位数据
72       if (Temp&0xf800==0xf800) //判断是否为负温度 零下。前5位是1表示是负温度  1111 1000 0000 0000
73       {
74           Temp=((~Temp)+0x01)*-0.0625; //先取反,然后补码:加1, 0.0625是分辨率
75       }else
76       {
77           FTemp=(float)Temp*0.0625;
78       }
79   }else
80   {
81           printf("DS18B20_err\r\n");
82   }
83   
84    return FTemp;
85}