📄 ds18b20.lst
字号:
C51 COMPILER V7.50 DS18B20 04/09/2007 18:39:44 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS18B20
OBJECT MODULE PLACED IN DS18B20.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DS18B20.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************************************************************
2
3
4
5 File Name: DS18b20.h
6 Author: liao xu ming
7 Created: 2007/03/23
8 Modified: 2007/04/09
9 Revision: 1.0
10
11 ***************************************************************************/
12
13
14 #include"ds18b20.h"
15 sbit DQ=P2^1;
16 sbit x=P3^6;
17 bit Calculator_To_DS18B20;
18 void delay(unsigned char i)
19 {
20 1 while(i--);
21 1
22 1 }
23
24 void Init_DS18B20(void) //初始化函数
25 {
26 1
27 1 DQ = 1; //DQ复位
28 1 //delay(8); //稍做延时
29 1 _nop_();
30 1 DQ = 0; //单片机将DQ拉低
31 1 delay(86); //精确延时 大于 480us
32 1 _nop_();
33 1 DQ = 1; //拉高总线
34 1 delay(14);
35 1 _nop_();
36 1 _nop_();
37 1 _nop_();
38 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
39 1 delay(20);
40 1 _nop_();
41 1 _nop_();
42 1 DQ = 1;
43 1 }
44
45 unsigned char ReadOneChar(void) //读一个字节
46 {
47 1 unsigned char i=0;
48 1 unsigned char dat = 0;
49 1 for (i=8;i>0;i--)
50 1 {
51 2 DQ = 0; // 给脉冲信号
52 2 dat>>=1;
53 2 DQ = 1; // 给脉冲信号
54 2 if(DQ==1)
55 2 dat|=0x80;
C51 COMPILER V7.50 DS18B20 04/09/2007 18:39:44 PAGE 2
56 2 delay(4);
57 2 _nop_();
58 2 }
59 1 return(dat);
60 1 }
61
62 void WriteOneChar(unsigned char dat) //写一个字节
63 {
64 1 unsigned char i=0;
65 1 for (i=8; i>0; i--)
66 1 {
67 2 DQ = 0;
68 2 _nop_();
69 2 DQ = dat&0x01;
70 2 _nop_();
71 2 _nop_();
72 2 delay(5);
73 2 DQ = 1;
74 2 dat>>=1;
75 2 }
76 1 delay(4);
77 1 }
78
79 unsigned int ReadTemperature(void) //读取温度
80 {
81 1 unsigned char a=0;
82 1 unsigned char b=0;
83 1 unsigned int t=0;
84 1 Init_DS18B20();
85 1 WriteOneChar(0xCC); // 跳过读序号列号的操作
86 1 WriteOneChar(0x44); // 启动温度转换
87 1
88 1
89 1
90 1 Init_DS18B20();
91 1 WriteOneChar(0xCC); //跳过读序号列号的操作
92 1 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
93 1 a=ReadOneChar(); //读取温度值低位
94 1 b=ReadOneChar(); //读取温度值高位
95 1 //a=a>>4; //低位右移4位,舍弃小数部分
96 1 t=b<<8; //高位左移4位,舍弃符号位
97 1 t=t|a;
98 1 return(t);
99 1 }
100
101
102 void DS18B20(void)
103 {unsigned char T_L;
104 1 unsigned int T,T_H,T_L_int;
105 1 float T_L_float;
106 1 if(Calculator_To_DS18B20==1) //功能切换,从计算器切换到温度计时要处理的一些事情
107 1 { LCD_send_command(LCD_DISPLAY_ON|LCD_CURSOR_OFF);//不显示光标
108 2 Calculator_To_DS18B20=0;
109 2 State_Switch_Flag=1;
110 2 EA=0; //关中断
111 2 LCD_send_command(LCD_CLEAR_SCREEN); //清屏
112 2 State_Switch_Flag=1;
113 2 GotoXY(0,0);
114 2 Print(" Temperature : ");
115 2 GotoXY(13,1);
116 2 LCD_send_data(0XDF); //显示温度的符号
117 2 LCD_send_data('C'); //显示字符 C
C51 COMPILER V7.50 DS18B20 04/09/2007 18:39:44 PAGE 3
118 2 GotoXY(8,1);
119 2 LCD_send_data('.'); //
120 2
121 2 }
122 1
123 1 T=ReadTemperature(); //启动温度转换,而且读取温度
124 1 if(T<=0X07D0) //如果温度是正的!!大于0!!
125 1 {
126 2 GotoXY(4,1);
127 2 LCD_send_data('+'); //显示正温度
128 2 T_H=T>>4;
129 2 T_L=(unsigned char )T&0X000F;
130 2 if(T_H>=100)
131 2 {
132 3 GotoXY(5,1);
133 3 LCD_send_data(T_H/100+0X30);
134 3 }
135 2 if(T_H>=10)
136 2 {
137 3 GotoXY(6,1);
138 3 LCD_send_data((T_H%100)/10+0X30);
139 3 }
140 2 GotoXY(7,1);
141 2 LCD_send_data((T_H%100)%10+0X30);
142 2 T_L_float=0.0625*T_L;
143 2 T_L_int=T_L_float*10000;
144 2 GotoXY(9,1);
145 2 LCD_send_data((T_L_int/1000)+0X30);
146 2 GotoXY(10,1);
147 2 LCD_send_data((T_L_int%1000)/100+0X30);
148 2 GotoXY(11,1);
149 2 LCD_send_data(((T_L_int%1000)%100)/10+0X30);
150 2 GotoXY(12,1);
151 2 LCD_send_data(((T_L_int%1000)%100)%10+0X30);
152 2
153 2
154 2 }
155 1 else
156 1 {
157 2 GotoXY(4,1);
158 2 LCD_send_data('-');
159 2
160 2 }
161 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 620 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 11
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -