📄 yl-10-ds18b20
字号:
182 2 }
183 1 return(dat); //返回读出的十进制数据
184 1 }
185 /*****************************************************
186 函数功能:向DS18B20写入一个字节数据
187 入口参数:dat
188 ***************************************************/
189 WriteOneChar(unsigned char dat)
190 {
191 1 unsigned char i=0;
192 1 for (i=0; i<8; i++)
193 1 {
194 2 DQ =1; // 先将数据线拉高
195 2 _nop_(); //等待一个机器周期
196 2 DQ=0; //将数据线从高拉低时即启动写时序
197 2 DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
198 2 //并将其送到数据线上等待DS18B20采样
199 2 for(time=0;time<10;time++)
200 2 ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
201 2 DQ=1; //释放数据线
202 2 for(time=0;time<1;time++)
203 2 ;//延时3us,两个写时序间至少需要1us的恢复期
204 2 dat>>=1; //将dat中的各二进制位数据右移1位
205 2 }
206 1 for(time=0;time<4;time++)
207 1 ; //稍作延时,给硬件一点反应时间
208 1 }
209 /******************************************************************************
210 以下是与温度有关的显示设置
211 ******************************************************************************/
212 /*****************************************************
213 函数功能:显示没有检测到DS18B20
214 ***************************************************/
215 void display_error(void)
216 {
217 1 unsigned char i;
218 1 WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示
219 1 i = 0; //从第一个字符开始显示
220 1 while(Error[i] != '\0') //只要没有写到结束标志,就继续写
221 1 {
222 2 WriteData(Error[i]); //将字符常量写入LCD
223 2 i++; //指向下一个字符
224 2 delaynms(100); //延时100ms较长时间,以看清关于显示的说明
225 2 }
226 1 while(1) //进入死循环,等待查明原因
227 1 ;
228 1 }
229 /*****************************************************
230 函数功能:显示说明信息
231 ***************************************************/
232 void display_explain(void)
233 {
234 1 unsigned char i;
235 1 WriteAddress(0x00); //写显示地址,将在第1行第1列开始显示
236 1 i = 0; //从第一个字符开始显示
237 1 while(Str[i] != '\0') //只要没有写到结束标志,就继续写
238 1 {
239 2 WriteData(Str[i]); //将字符常量写入LCD
240 2 i++; //指向下一个字符
241 2 delaynms(100); //延时100ms较长时间,以看清关于显示的说明
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 5
242 2 }
243 1 }
244 /*****************************************************
245 函数功能:显示温度符号
246 ***************************************************/
247 void display_symbol(void)
248 {
249 1 unsigned char i;
250 1 WriteAddress(0x40); //写显示地址,将在第2行第1列开始显示
251 1 i = 0; //从第一个字符开始显示
252 1 while(Temp[i] != '\0') //只要没有写到结束标志,就继续写
253 1 {
254 2 WriteData(Temp[i]); //将字符常量写入LCD
255 2 i++; //指向下一个字符
256 2 delaynms(50); //延时1ms给硬件一点反应时间
257 2 }
258 1 }
259 /*****************************************************
260 函数功能:显示温度的小数点
261 ***************************************************/
262 void display_dot(void)
263 {
264 1 WriteAddress(0x49); //写显示地址,将在第2行第10列开始显示
265 1 WriteData('.'); //将小数点的字符常量写入LCD
266 1 delaynms(50); //延时1ms给硬件一点反应时间
267 1 }
268 /*****************************************************
269 函数功能:显示温度的单位(Cent)
270 ***************************************************/
271 void display_cent(void)
272 {
273 1 unsigned char i;
274 1 WriteAddress(0x4c); //写显示地址,将在第2行第13列开始显示
275 1 i = 0; //从第一个字符开始显示
276 1 while(Cent[i] != '\0') //只要没有写到结束标志,就继续写
277 1 {
278 2 WriteData(Cent[i]); //将字符常量写入LCD
279 2 i++; //指向下一个字符
280 2 delaynms(50); //延时1ms给硬件一点反应时间
281 2 }
282 1 }
283 /*****************************************************
284 函数功能:显示温度的整数部分
285 入口参数:x
286 ***************************************************/
287 void display_temp1(unsigned char x)
288 {
289 1 unsigned char j,k,l; //j,k,l分别储存温度的百位、十位和个位
290 1 j=x/100; //取百位
291 1 k=(x%100)/10; //取十位
292 1 l=x%10; //取个位
293 1 WriteAddress(0x46); //写显示地址,将在第2行第7列开始显示
294 1 WriteData(digit[j]); //将百位数字的字符常量写入LCD
295 1 WriteData(digit[k]); //将十位数字的字符常量写入LCD
296 1 WriteData(digit[l]); //将个位数字的字符常量写入LCD
297 1 delaynms(50); //延时1ms给硬件一点反应时间
298 1 }
299 /*****************************************************
300 函数功能:显示温度的小数数部分
301 入口参数:x
302 ***************************************************/
303 void display_temP3(unsigned char x)
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 6
304 {
305 1 WriteAddress(0x4a); //写显示地址,将在第2行第11列开始显示
306 1 WriteData(digit[x]); //将小数部分的第一位数字字符常量写入LCD
307 1 delaynms(50); //延时1ms给硬件一点反应时间
308 1 }
309 /*****************************************************
310 函数功能:做好读温度的准备
311 ***************************************************/
312 void ReadyReadTemp(void)
313 {
314 1 Init_DS18B20(); //将DS18B20初始化
315 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
316 1 WriteOneChar(0x44); // 启动温度转换
317 1 for(time=0;time<100;time++)
318 1 ; //温度转换需要一点时间
319 1 Init_DS18B20(); //将DS18B20初始化
320 1 WriteOneChar(0xCC); //跳过读序号列号的操作
321 1 WriteOneChar(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
322 1 }
323
324 /*****************************************************
325 函数功能:主函数
326 ***************************************************/
327 void main(void)
328 {
329 1 unsigned char TL; //储存暂存器的温度低位
330 1 unsigned char TH; //储存暂存器的温度高位
331 1 unsigned char TN; //储存温度的整数部分
332 1 unsigned char TD; //储存温度的小数部分
333 1 LcdInitiate(); //将液晶初始化
334 1 delaynms(5); //延时5ms给硬件一点反应时间
335 1 if(Init_DS18B20()==1)
336 1 display_error();
337 1 display_explain();
338 1 display_symbol(); //显示温度说明
339 1 display_dot(); //显示温度的小数点
340 1 display_cent(); //显示温度的单位
341 1 while(1) //不断检测并显示温度
342 1 {
343 2 ReadyReadTemp(); //读温度准备
344 2 TL=ReadOneChar(); //先读的是温度值低位
345 2 TH=ReadOneChar(); //接着读的是温度值高位
346 2 TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
347 2 //这样得出的是温度的整数部分,小数部分被丢弃了
348 2 TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
349 2 //这样得到的是温度小数部分的第一位数字(保留1位小数)
350 2 display_temp1(TN); //显示温度的整数部分
351 2 display_temP3(TD); //显示温度的小数部分
352 2 delaynms(10);
353 2 }
354 1
355 1 }
*** WARNING C290 IN LINE 208 OF 18B20测温.C: missing return value
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 635 ----
CONSTANT SIZE = 50 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 1
IDATA SIZE = ---- ----
C51 COMPILER V9.00 18B20瞋蝊 06/01/2011 15:05:58 PAGE 7
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -