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