📄 ds18b20的应用.lst
字号:
C51 COMPILER V8.02 DS18B20的应用 05/12/2008 14:59:02 PAGE 1
C51 COMPILER V8.02, 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 #include<reg51.h>
2 #include<intrins.h>
3 #include<absacc.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6 sbit DQ = P2^0; //定义DS18B20端口DQ
7 sbit RS = P3^5;
8 sbit RW = P3^6;
9 sbit E = P3^7;
10 uchar temp_data_l,temp_data_h;
11 uchar code LCDData[10]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
12 uchar code ditab[16] = {0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39}
-;
13 uchar code table2[16] = {0x74,0x65,0x6d,0x70,0x65,0x72,0x61,0x74,0x75,0x72,0x65,0x20,0x69,0x53,0x20,0x3a}
-;
14 uchar display[7] = {0x00,0x00,0x00,0x2e,0x00,0xdf,0x43};
15 //*********************************
16 // 延时程序
17 //*********************************
18 void delay(uint N)
19 {
20 1 uint i;
21 1 for(i=0;i<N;i++);
22 1 }
23 //**********************************
24 // 初始化ds18B20程序
25 //**********************************
26
27 bit resetpulse(void)
28 {
29 1
30 1 DQ=0;
31 1 //delay600us(); //延时500us
32 1 delay(40); //延时500us
33 1 DQ=1;
34 1 //delay60us(); // 延时60us
35 1 delay(4); // 延时60us
36 1 return(DQ); //读取P1.0的状态
37 1 }
38 /*************************************************************
39 **功能:ds18b20的初始化 **
40 **参数:无 **
41 *************************************************************/
42 void ds18b20_init(void)
43 {
44 1 while(1)
45 1 {
46 2 if(!resetpulse()) //收到ds18b20的应答信号
47 2 {
48 3 DQ=1;
49 3 //delay600us(); //延时240us
50 3 delay(40); //延时240us
51 3 break;
52 3 }
53 2 else
C51 COMPILER V8.02 DS18B20的应用 05/12/2008 14:59:02 PAGE 2
54 2 resetpulse(); //否则再发复位信号
55 2 }
56 1 }
57
58 //************************************
59 // 读一位程序
60 //************************************
61 uchar read_bit(void)
62 {
63 1 // uchar i;
64 1 DQ=0;
65 1 _nop_();
66 1 _nop_();
67 1 //_nop_();
68 1 //_nop_();
69 1 DQ=1;
70 1 delay(2);
71 1 //for(i=0;i<5;i++);
72 1 return(DQ);
73 1 }
74 //*************************************
75 // 读一个字节程序
76 //*************************************
77 uchar read_byte(void)
78 {
79 1 uchar i,m,receive_data;
80 1 m=1;
81 1 receive_data=0;
82 1 for(i=0;i<8;i++)
83 1 {
84 2 if(read_bit())
85 2 {
86 3 receive_data=receive_data+(m<<i);
87 3 }
88 2 delay(7);
89 2 }
90 1 return(receive_data);
91 1 }
92 //**************************************
93 // 写一位程序
94 //**************************************
95 void write_bit(uchar bitval)
96 {
97 1 DQ=0;
98 1 if(bitval==1)
99 1 DQ=1;
100 1 delay(5);
101 1 DQ=1;
102 1 }
103 //***************************************
104 // 向DS18B20写一个字节命令程序
105 //***************************************
106 void write_byte(uchar val)
107 {
108 1 uchar i,temp;
109 1 for(i=0;i<8;i++)
110 1 {
111 2 temp=val>>i;
112 2 temp=temp&0x01;
113 2 write_bit(temp);
114 2 delay(5);
115 2 }
C51 COMPILER V8.02 DS18B20的应用 05/12/2008 14:59:02 PAGE 3
116 1 }
117 //*****************************************
118 // 启动温度转换及读出温度值
119 //*****************************************
120 void read_T(void)
121 {
122 1 ds18b20_init();
123 1 write_byte(0xCC); // 跳过读序号列号的操作
124 1 write_byte(0x44); // 启动温度转换
125 1 delay(500);
126 1 ds18b20_init();
127 1 write_byte(0xCC); //跳过读序号列号的操作
128 1 write_byte(0xBE); //读取温度寄存器
129 1 temp_data_l= read_byte(); //温度低8位
130 1 temp_data_h = read_byte(); //温度高8位
131 1 }
132
133 /*************************************************************
134 **功能:判断LCD忙 **
135 **参数:无 **
136 *************************************************************/
137
138 void check_busy(void)
139 {
140 1
141 1 while(1)
142 1 {
143 2 P1=0xff;
144 2 E=0;
145 2 _nop_();
146 2 RS=0;
147 2 _nop_();
148 2 _nop_();
149 2 RW=1;
150 2 _nop_();
151 2 _nop_();
152 2 E=1;
153 2 _nop_();
154 2 _nop_();
155 2
156 2 _nop_();
157 2 _nop_();
158 2 if((P1&0x80)==0)
159 2 {
160 3 break;
161 3
162 3 }
163 2 E=0;
164 2 }
165 1 }
166
167
168 //******************************************
169 // 将数据码写入LCD数据寄存器
170 //******************************************
171 void write_command(uchar tempdata)
172 {
173 1 E=0;
174 1 _nop_();
175 1 _nop_();
176 1 RS=0;
177 1 _nop_();
C51 COMPILER V8.02 DS18B20的应用 05/12/2008 14:59:02 PAGE 4
178 1 _nop_();
179 1 RW=0;
180 1 P1=tempdata;
181 1 _nop_();
182 1 _nop_();
183 1 E=1;
184 1 _nop_();
185 1 _nop_();
186 1 E=0;
187 1 _nop_();
188 1 check_busy();
189 1
190 1 }
191 //*******************************************
192 // 写LCD1602使能程序
193 //*******************************************
194 void write_data(uchar tempdata)
195 {
196 1 E=0;
197 1 _nop_();
198 1 _nop_();
199 1 RS=1;
200 1 _nop_();
201 1 _nop_();
202 1 RW=0;
203 1 P1=tempdata;
204 1 _nop_();
205 1 _nop_();
206 1 E=1;
207 1 _nop_();
208 1 _nop_();
209 1 E=0;
210 1 _nop_();
211 1 check_busy();
212 1
213 1 }
214 //*******************************************
215 // 温度处理及显示
216 //*******************************************
217 void convert_T()//显示温度
218 {
219 1 uchar temp;
220 1 if((temp_data_h&0xf0)==0xf0)
221 1 {
222 2 temp_data_l=~temp_data_l;
223 2 if(temp_data_l==0xff)
224 2 {
225 3 temp_data_l=temp_data_l+0x01;
226 3 temp_data_h=~temp_data_h;
227 3 temp_data_h=temp_data_h+0x01;
228 3 }
229 2 else
230 2 {
231 3 temp_data_l=temp_data_l+0x01;
232 3 temp_data_h=~temp_data_h;
233 3 }
234 2 display[4]=ditab[temp_data_l&0x0f]; //查表得小数位的值
235 2 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
236 2 display[0]=0x2d;
237 2 display[1]=LCDData[(temp%100)/10];
238 2 display[2]=LCDData[(temp%100)%10];
239 2 }
C51 COMPILER V8.02 DS18B20的应用 05/12/2008 14:59:02 PAGE 5
240 1 else
241 1 {
242 2 display[4]=ditab[temp_data_l&0x0f]; //查表得小数位的值
243 2 temp=((temp_data_l&0xf0)>>4)|((temp_data_h&0x0f)<<4);
244 2 display[0]=LCDData[temp/100];
245 2 display[1]=LCDData[(temp%100)/10];
246 2 display[2]=LCDData[(temp%100)%10];
247 2
248 2 }
249 1 }
250 //********************************************
251 // 初始化LCD1602
252 //********************************************
253 void init()
254 {
255 1 write_command(0x01);
256 1 write_command(0x38);
257 1 write_command(0x0C);
258 1 write_command(0x06);
259 1 }
260
261 //********************************************
262 // 显示子程序
263 //********************************************
264 void display_T(void)
265 {
266 1 uchar i;
267 1 write_command(0x80);
268 1 for(i=0;i<16;i++)
269 1 {
270 2 write_data(table2[i]);
271 2 }
272 1 write_command(0xc0);
273 1 for(i=0;i<7;i++)
274 1 {
275 2 write_data(display[i]);
276 2 }
277 1 }
278 //********************************************
279 // 主函数
280 //********************************************
281 void main(void)
282 {
283 1 init();
284 1 while(1)
285 1 {
286 2 read_T();
287 2 convert_T();
288 2 display_T();
289 2 }
290 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 499 ----
CONSTANT SIZE = 42 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V8.02 DS18B20的应用 05/12/2008 14:59:02 PAGE 6
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -