|
|
|
|
C51 COMPILER V9.56.0.0 DS18B20 05/01/2022 13:15:20 PAGE 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C51 COMPILER V9.56.0.0, COMPILATION OF MODULE DS18B20
|
|
|
|
|
OBJECT MODULE PLACED IN DS18B20.OBJ
|
|
|
|
|
COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE DS18B20.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND TABS(2)
|
|
|
|
|
|
|
|
|
|
line level source
|
|
|
|
|
|
|
|
|
|
1 #include "DS18B20.h"
|
|
|
|
|
2
|
|
|
|
|
3 sbit DS18B20=P3^2; //定义数据线
|
|
|
|
|
4
|
|
|
|
|
5 void delay_ms(unsigned int x)//延时1ms
|
|
|
|
|
6 {
|
|
|
|
|
7 1 unsigned int y,z;
|
|
|
|
|
8 1 for(y=x;y>0;y--)
|
|
|
|
|
9 1 for(z=110;z>0;z--);
|
|
|
|
|
10 1 }
|
|
|
|
|
11
|
|
|
|
|
12 uchar DS18B20_Init() //初始化。成功返回1,不成功返回0.
|
|
|
|
|
13 {
|
|
|
|
|
14 1 uchar i;
|
|
|
|
|
15 1 DS18B20 = 0; //将总线拉低480微秒~960微秒
|
|
|
|
|
16 1 i = 70;
|
|
|
|
|
17 1 while(i--); //延时642微秒
|
|
|
|
|
18 1 DS18B20 = 1; //拉高总线,等待后续反馈
|
|
|
|
|
19 1 i = 0;
|
|
|
|
|
20 1 while(DS18B20) //等待DS18B20拉低总线
|
|
|
|
|
21 1 {
|
|
|
|
|
22 2 delay_ms(1); //定义的延迟1ms的延迟函数
|
|
|
|
|
23 2 i++;
|
|
|
|
|
24 2 if(i>5) //等待5ms以上
|
|
|
|
|
25 2 {
|
|
|
|
|
26 3 return 0; //初始化失败
|
|
|
|
|
27 3 }
|
|
|
|
|
28 2 }
|
|
|
|
|
29 1 return 1; //初始化成功
|
|
|
|
|
30 1 }
|
|
|
|
|
31
|
|
|
|
|
32 uchar DS18B20_ReadByte() //通过读取8次状态位达到读取字节的目的
|
|
|
|
|
33 {
|
|
|
|
|
34 1 uchar byte, bi;
|
|
|
|
|
35 1 uint i, j;
|
|
|
|
|
36 1 for(j=8; j>0; j--)
|
|
|
|
|
37 1 {
|
|
|
|
|
38 2 DS18B20 = 0; //先将总线拉低
|
|
|
|
|
39 2 i++;
|
|
|
|
|
40 2 DS18B20 = 1; //然后释放总线
|
|
|
|
|
41 2 i++;
|
|
|
|
|
42 2 i++; //延时6微秒等待数据稳定
|
|
|
|
|
43 2 bi = DS18B20; //读取数据,从最低位开始读取
|
|
|
|
|
44 2 byte = (byte >> 1) | (bi << 7); //从最低位开始记录,将byte依次右移
|
|
|
|
|
45 2 i = 4; //读取完之后等待48微秒再接着读取下一个数
|
|
|
|
|
46 2 while(i--);
|
|
|
|
|
47 2 }
|
|
|
|
|
48 1 return byte; //将读取完的字节保存
|
|
|
|
|
49 1 }
|
|
|
|
|
50
|
|
|
|
|
51 void DS18B20_WriteByte(uchar dat)//函数通过循环写8个位实现写一个字节
|
|
|
|
|
52 {
|
|
|
|
|
53 1 uint i, j;
|
|
|
|
|
54 1 for(j=0; j<8; j++)
|
|
|
|
|
55 1 {
|
|
|
|
|
C51 COMPILER V9.56.0.0 DS18B20 05/01/2022 13:15:20 PAGE 2
|
|
|
|
|
|
|
|
|
|
56 2 DS18B20 = 0; //每写入一位数据之前先把总线拉低
|
|
|
|
|
57 2 i++;
|
|
|
|
|
58 2 DS18B20 = dat & 0x01; //然后写入一个数据,从最低位开始
|
|
|
|
|
59 2 i=6;
|
|
|
|
|
60 2 while(i--); //延时68微秒
|
|
|
|
|
61 2 DS18B20 = 1; //释放总线,给总线1微秒恢复时间才能接着写入下一位
|
|
|
|
|
62 2 dat >>= 1;
|
|
|
|
|
63 2 }
|
|
|
|
|
64 1 }
|
|
|
|
|
65
|
|
|
|
|
66 int DS18B20_ReadTemp() //读取的温度有两个字节,分别用tml和tmh存储两个字节
|
|
|
|
|
67 {
|
|
|
|
|
68 1 int temp = 0;
|
|
|
|
|
69 1 uchar tmh, tml;
|
|
|
|
|
70 1 DS18B20_Init(); //传感器初始化
|
|
|
|
|
71 1 delay_ms(1); //延时1微秒
|
|
|
|
|
72 1 DS18B20_WriteByte(0xcc); //跳过读取序列号操作
|
|
|
|
|
73 1 DS18B20_WriteByte(0x44); //温度转换指令
|
|
|
|
|
74 1 //完成温度转换功能
|
|
|
|
|
75 1 DS18B20_Init(); //传感器初始化
|
|
|
|
|
76 1 delay_ms(1);
|
|
|
|
|
77 1 DS18B20_WriteByte(0xcc); //跳过读取序列号操作
|
|
|
|
|
78 1 DS18B20_WriteByte(0xbe); //发送读取温度指令
|
|
|
|
|
79 1 //然后等待转换完后发送读取温度命令
|
|
|
|
|
80 1 tml = DS18B20_ReadByte(); //读取温度值共16位,先读低字节
|
|
|
|
|
81 1 tmh = DS18B20_ReadByte(); //再读高字节
|
|
|
|
|
82 1 temp = tmh; //先存高字节,后面通过移位存储低字节
|
|
|
|
|
83 1 temp <<= 8;
|
|
|
|
|
84 1 temp |= tml;
|
|
|
|
|
85 1 return temp;
|
|
|
|
|
86 1 }
|
|
|
|
|
87
|
|
|
|
|
88
|
|
|
|
|
89 uint Temper_change()
|
|
|
|
|
90 {
|
|
|
|
|
91 1 uint temper;
|
|
|
|
|
92 1 float tp;
|
|
|
|
|
93 1 //temper=read_temper();
|
|
|
|
|
94 1 temper=DS18B20_ReadTemp();
|
|
|
|
|
95 1 if(temper<0) //考虑负温度的情况
|
|
|
|
|
96 1 {
|
|
|
|
|
97 2 temper=temper-1;
|
|
|
|
|
98 2 temper=~temper;
|
|
|
|
|
99 2 tp=temper*0.0625; //16位温度转换成10进制的温度
|
|
|
|
|
100 2 temper=tp*100+0.5; //留两个小数点,并四舍五入
|
|
|
|
|
101 2 }
|
|
|
|
|
102 1 else
|
|
|
|
|
103 1 {
|
|
|
|
|
104 2 tp=temper*0.0625; //16位温度转换成10进制的温度
|
|
|
|
|
105 2 temper=tp*100+0.5; //留两个小数点,并四舍五入
|
|
|
|
|
106 2 }
|
|
|
|
|
107 1 return temper;
|
|
|
|
|
108 1 }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MODULE INFORMATION: STATIC OVERLAYABLE
|
|
|
|
|
CODE SIZE = 307 ----
|
|
|
|
|
CONSTANT SIZE = ---- ----
|
|
|
|
|
XDATA SIZE = ---- ----
|
|
|
|
|
PDATA SIZE = ---- ----
|
|
|
|
|
DATA SIZE = ---- 7
|
|
|
|
|
IDATA SIZE = ---- ----
|
|
|
|
|
C51 COMPILER V9.56.0.0 DS18B20 05/01/2022 13:15:20 PAGE 3
|
|
|
|
|
|
|
|
|
|
BIT SIZE = ---- ----
|
|
|
|
|
END OF MODULE INFORMATION.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
|