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