📄 ds18b20.lst
字号:
C51 COMPILER V7.06 DS18B20 05/11/2008 18:49:26 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.obj
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE DS18B20驱动\DS18B20.C BROWSE DEBUG OBJECTEXTEND PRINT(.\DS18B
-20.lst) OBJECT(DS18B20.obj)
stmt level source
1 //这是一个温度采集模块的驱动程序。
2 /*
3 |----|
4 | DS | DS18B20管脚排列
5 +----+
6 | | |
7 | | |
8 | | |----------Vdd
9 | |------------DQ-->P0.0
10 |---------------GND
11 */
12 #include <config.h>
13
14 //外部函数
15 //--------------delay.c--------------------
16 extern void delay(unsigned int delay_time); //延时子程序
17 //----------------------------------------
18
19 //------------DS18B20控制命令-----------------------------
20 #define T_CONVER 0x44 //开始温度转换
21 #define T_CONFIG 0x5f //11位转换
22 #define T_READ 0xbe //读暂存器
23 #define T_WRITE 0x4e //写暂存器
24 #define T_ROM_JMP 0xcc //忽略64ROM地址
25 #define T_COPY_E2 0x48 //将温度上下限数值写到E2ROM
26 #define T_RECALL_E2 0xb8 //将E2中存储的温度上下限数值复制到上下限寄存器中。
27 #define T_cont 0.0625 //温度转换常数
28 //------------------------------------------------------
29 sbit DQ=P0^0; //DS18B20数据输出端
30 sbit LED=P1^5; //LED
31 bit REC_suc=0; //DS18B20成功复位标志位
32 bit T_sign; //温度正负符号
33 float temp=0; //转换好的温度数值
34 signed char temp_TH=25,temp_TL=10; //温度上下限
35 unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位
36 void DS18B20_init(); //DS18B20初始化函数
37 void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
38 unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
39 void ReadTemperature(); //读取温度数值
40 void temp_data_turn(float in_data); //温度转换
41 //--------------------------------------------------------
42
43
44 /****************************DS18B20初始化函数**************************/
45 /*函数原型:void DS18B20_init()
46 /*函数功能:DS18B20初始化
47 /*输入参数:无
48 /*输出参数:无
49 /*调用模块:delay()
50 /*建立时间:2005/11/14
51 /*作者:丁霄
52 /**********************************************************************/
53 void DS18B20_init()
54 {
C51 COMPILER V7.06 DS18B20 05/11/2008 18:49:26 PAGE 2
55 1 unsigned char i=1;
56 1 DQ=0;
57 1 DQ=1;
58 1 delay(20); //延时227us
59 1 while(REC_suc==0)
60 1 {
61 2 DQ=0;
62 2 delay(45); //延时502us
63 2 DQ=1;
64 2 delay(3); //等待DS18B20作出相应 延时40us
65 2 while(1)
66 2 { i=DQ;
67 3 if(i==0)
68 3 {
69 4 REC_suc=1;
70 4 delay(20); //延时227us
71 4 break;
72 4 }
73 3 }
74 2 }
75 1 REC_suc=0;
76 1 }
77
78 /****************************DS18B20发送函数**************************/
79 /*函数原型:void DS18B20_send(unsigned char in_data)
80 /*函数功能:DS18B20发送数据
81 /*输入参数:要发送的数据
82 /*输出参数:无
83 /*调用模块:_cror_()
84 /*建立时间:2005/11/14
85 /*作者:丁霄
86 /**********************************************************************/
87 void DS18B20_send(unsigned char in_data)
88 {
89 1 unsigned char i,out_data,k;
90 1 out_data=in_data;
91 1 for(i=1;i<9;i++) //串行发送数据
92 1 {
93 2 DQ=0;
94 2 DQ=1;
95 2 _nop_();
96 2 _nop_();
97 2 k=out_data&0x01;
98 2 if(k==0x01) //判断数据 写1
99 2 {
100 3 DQ=1;
101 3 }
102 2 else //写0
103 2 {
104 3 DQ=0;
105 3 }
106 2 delay(5); //延时62us
107 2 DQ=1;
108 2 out_data=_cror_(out_data,1); //循环左移1位
109 2 }
110 1 }
111
112
113 /**************************DS18B20读函数**************************/
114 /*函数原型:void DS18B20_read()
115 /*函数功能:DS18B20读数据
116 /*输入参数:无
C51 COMPILER V7.06 DS18B20 05/11/2008 18:49:26 PAGE 3
117 /*输出参数:读到的一字节内容
118 /*调用模块:delay()
119 /*建立时间:2005/11/14
120 /*作者:丁霄
121 /******************************************************************/
122 unsigned char DS18B20_read()
123 {
124 1 unsigned char i,in_data,k;
125 1 in_data=0;
126 1 for(i=1;i<9;i++) //串行发送数据
127 1 {
128 2 DQ=0;
129 2 DQ=1;
130 2 _nop_();
131 2 _nop_();
132 2 k=DQ; //读DQ端
133 2 if(k==1) //读到的数据是1
134 2 {
135 3 in_data=in_data|0x01;
136 3 }
137 2 else
138 2 {
139 3 in_data=in_data|0x00;
140 3 }
141 2 delay(4); //延时51us
142 2 DQ=1;
143 2 in_data=_cror_(in_data,1); //循环左移1位
144 2 }
145 1 return(in_data);
146 1 }
147
148 /**************************DS18B20读取温度函数**************************/
149 /*函数原型:void ReadTemperature()
150 /*函数功能:DS18B20读取温度转换好的数据
151 /*输入参数:无
152 /*输出参数:无
153 /*调用模块:DS18B20_send(),DS18B20_send(),DS18B20_init(),DS18B20_send(),DS18B20_send(),
154 T_L=DS18B20_read(),T_H=DS18B20_read()
155 /*建立时间:2005/11/15
156 /*作者:丁霄
157 /******************************************************************/
158 void ReadTemperature()
159 {
160 1 unsigned char T_L=0;
161 1 unsigned char T_H=0;
162 1 unsigned char k;
163 1 DS18B20_init();
164 1 DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
165 1 DS18B20_send(T_CONVER); // 启动温度转换
166 1 DS18B20_init();
167 1 DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
168 1 DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
169 1
170 1 T_L=DS18B20_read();
171 1 T_H=DS18B20_read();
172 1
173 1 k=T_H&0xf8;
174 1 if(k==0xf8)
175 1 T_sign=1; //温度是负数
176 1 else
177 1 T_sign=0; //温度是正数
178 1
C51 COMPILER V7.06 DS18B20 05/11/2008 18:49:26 PAGE 4
179 1 T_H=T_H&0x07;
180 1 temp=(T_H*256+T_L)*T_cont;
181 1 }
182
183 /**************************DS18B20温度转换函数**************************/
184 /*函数原型:void temp_data_turn(float in_data)
185 /*函数功能:DS18B20读取温度转换
186 /*输入参数:无
187 /*输出参数:无
188 /*调用模块:无
189 /*建立时间:2005/11/16
190 /*作者:丁霄
191 /******************************************************************/
192 void temp_data_turn(float in_data)
193 {
194 1 unsigned int y;
195 1 in_data=in_data*10; //数值扩大10倍,精度到0.1
196 1 t_bai=in_data/1000;
197 1 y=(unsigned int)in_data%1000;
198 1 t_shi=y/100;
199 1 y=y%100;
200 1 t_ge=y/10;
201 1 t_feng=y%10;
202 1 }
203
204
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 380 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 10
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -