DS18B20温度传感器STC8代码
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}