📄 13-18b20
字号:
171 2 dat|=0x80; //如果读到的数据是1,则将1存入dat
172 2 DelayXus(60);
173 2 }
174 1 return(dat); //返回读出的十进制数据
175 1 }
176 /*****************************************************
177 函数功能:向DS18B20写入一个字节数据
178 入口参数:dat
179 ***************************************************/
C51 COMPILER V9.01 EX90 10/13/2012 12:28:23 PAGE 4
180 void WriteOneChar(unsigned char dat)
181 { unsigned char i=0;
182 1 for (i=0; i<8; i++)
183 1 { DQ = 0; //开始时间片
184 2 DelayXus(1); //延时等待
185 2 dat >>= 1; //送出数据
186 2 DQ = CY;
187 2 DelayXus(60); //等待时间片结束
188 2 DQ = 1; //恢复数据线
189 2 DelayXus(1);
190 2 }
191 1 for(time=0;time<4;time++); //稍作延时,给硬件一点反应时间
192 1 }
193 /******************************************************************************
194 以下是与温度有关的显示设置
195 函数功能:显示没有检测到DS18B20
196 ***************************************************/
197 void display_error(void)
198 { unsigned char i;
199 1 WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示
200 1 i = 0; //从第一个字符开始显示
201 1 while(Error[i] != '\0') //只要没有写到结束标志,就继续写
202 1 { WriteData(Error[i]); //将字符常量写入LCD
203 2 i++;//指向下一个字符
204 2 delaynms(100); //延时100ms较长时间,以看清关于显示的说明
205 2 }
206 1 while(1); //进入死循环,等待查明原因
207 1 }
208 /*****************************************************
209 函数功能:显示说明信息
210 ***************************************************/
211 void display_explain(void)
212 { unsigned char i;
213 1 WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示
214 1 i = 0; //从第一个字符开始显示
215 1 while(Str[i] != '\0') //只要没有写到结束标志,就继续写
216 1 { WriteData(Str[i]); //将字符常量写入LCD
217 2 i++; //指向下一个字符
218 2 delaynms(100); //延时100ms较长时间,以看清关于显示的说明
219 2 }
220 1 }
221 /*****************************************************
222 函数功能:显示温度符号
223 ***************************************************/
224 void display_symbol(void)
225 { unsigned char i;
226 1 WriteAddress(0x40); //写显示地址,将在第2行第1列开始显示
227 1 i = 0; //从第一个字符开始显示
228 1 while(Temp[i] != '\0') //只要没有写到结束标志,就继续写
229 1 { WriteData(Temp[i]); //将字符常量写入LCD
230 2 i++; //指向下一个字符
231 2 delaynms(50); //延时1ms给硬件一点反应时间
232 2 }
233 1 }
234
235 /*****************************************************
236 函数功能:显示温度的小数点
237 ***************************************************/
238 void display_dot(void)
239 { WriteAddress(0x49); //写显示地址,将在第2行第10列开始显示
240 1 WriteData('.'); //将小数点的字符常量写入LCD
241 1 delaynms(50); //延时1ms给硬件一点反应时间
C51 COMPILER V9.01 EX90 10/13/2012 12:28:23 PAGE 5
242 1 }
243 /*****************************************************
244 函数功能:显示温度的单位(Cent)
245 ***************************************************/
246 void display_cent(void)
247 { unsigned char i;
248 1 WriteAddress(0x4c); //写显示地址,将在第2行第13列开始显示
249 1 i = 0; //从第一个字符开始显示
250 1 while(Cent[i] != '\0') //只要没有写到结束标志,就继续写
251 1 { WriteData(Cent[i]); //将字符常量写入LCD
252 2 i++; //指向下一个字符
253 2 delaynms(50); //延时1ms给硬件一点反应时间
254 2 }
255 1 }
256 /*****************************************************
257 函数功能:显示温度的整数部分
258 入口参数:x
259 ***************************************************/
260 void display_temp1(unsigned char x)
261 { unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位
262 1 j=x/100; //取百位
263 1 k=(x%100)/10; //取十位
264 1 l=x%10; //取个位
265 1 WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示
266 1 WriteData(digit[j]); //将百位数字的字符常量写入LCD
267 1 WriteAddress(0x47);
268 1 WriteData(digit[k]); //将十位数字的字符常量写入LCD
269 1 WriteAddress(0x48);
270 1 WriteData(digit[l]); //将个位数字的字符常量写入LCD
271 1 delaynms(50); //延时1ms给硬件一点反应时间
272 1 }
273 /*****************************************************
274 函数功能:显示温度的小数数部分
275 入口参数:x
276 ***************************************************/
277 void display_temp2(unsigned char x)
278 { WriteAddress(0x4a); //写显示地址,将在第2行第11列开始显示
279 1 WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD
280 1 delaynms(50); //延时1ms给硬件一点反应时间
281 1 }
282 /*****************************************************
283 函数功能:做好读温度的准备
284 ***************************************************/
285 void ReadyReadTemp(void)
286 { Init_DS18B20(); //将DS18B20初始化
287 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
288 1 WriteOneChar(0x44); // 启动温度转换
289 1 for(time=0;time<100;time++); //温度转换需要一点时间
290 1 Init_DS18B20(); //将DS18B20初始化
291 1 WriteOneChar(0xCC); //跳过读序号列号的操作
292 1 WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
293 1 }
294
295
296 /*****************************************************
297 函数功能:主函数
298 ***************************************************/
299
300 void main(void)
301 { unsigned char TL; //储存暂存器的温度低位
302 1 unsigned char TH; //储存暂存器的温度高位
303 1 unsigned char TN; //储存温度的整数部分
C51 COMPILER V9.01 EX90 10/13/2012 12:28:23 PAGE 6
304 1 unsigned char TD; //储存温度的小数部分
305 1 LcdInitiate(); //将液晶初始化
306 1 delaynms(5); //延时5ms给硬件一点反应时间
307 1 if(Init_DS18B20()==1)
308 1 display_error();
309 1 display_explain();
310 1 display_symbol(); //显示温度说明
311 1 display_dot(); //显示温度的小数点
312 1 display_cent(); //显示温度的单位
313 1 while(1) //不断检测并显示温度
314 1 { ReadyReadTemp(); //读温度准备
315 2 TL=ReadOneChar(); //先读的是温度值低位
316 2 TH=ReadOneChar(); //接着读的是温度值高位
317 2 TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
318 2 //这样得出的是温度的整数部分,小数部分被丢弃了
319 2 TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
320 2 //这样得到的是温度小数部分的第一位数字(保留1位小数)
321 2 display_temp1(TN); //显示温度的整数部分
322 2 display_temp2(TD); //显示温度的小数部分
323 2 delaynms(10);
324 2 }
325 1
326 1 }
327
328
329
330
331
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 627 ----
CONSTANT SIZE = 50 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 1
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 + -