📄 text1.lst
字号:
174 1 bit btmp;
175 1 for(j=1;j<=8;j++)
176 1 {
177 2 btmp = b&0x01;
178 2 b = b>>1; // 取下一位(由低位向高位)
179 2 if (btmp)
C51 COMPILER V7.20 TEXT1 07/17/2007 22:47:27 PAGE 4
180 2 {
181 3 /* 写1 */
182 3 DQ = 0;
183 3 i++;i++; // 延时,使得15us以内拉高
184 3 DQ = 1;
185 3 i = 8;
186 3 while(i>0) i--; // 整个写1时隙不低于60us
187 3 }
188 2 else
189 2 {
190 3 /* 写0 */
191 3 DQ = 0;
192 3 i = 8;
193 3 while(i>0) i--; // 保持低在60us到120us之间
194 3 DQ = 1;
195 3 i++;
196 3 i++;
197 3 }
198 2 }
199 1 }
200
201 /* 启动温度转换 */
202 void convert(void)
203 {
204 1 TxReset(); // 产生复位脉冲,初始化DS18B20
205 1 RxWait(); // 等待DS18B20给出应答脉冲
206 1 delay(1); // 延时
207 1 WrByte(0xcc); // skip rom 命令
208 1 WrByte(0x44); // convert T 命令
209 1 }
210
211 /* 读取温度值 */
212 void RdTemp(void)
213 {
214 1 TxReset(); // 产生复位脉冲,初始化DS18B20
215 1 RxWait(); // 等待DS18B20给出应答脉冲
216 1 delay(1); // 延时
217 1 WrByte(0xcc); // skip rom 命令
218 1 WrByte(0xbe); // read scratchpad 命令
219 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
220 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
221 1 }
222
223
224 /************键盘扫描*************/
225 uchar keyscan(void)
226 {
227 1 uchar scancode,tmpcode;
228 1 P1 = 0xf0;
229 1 if ((P1&0xf0)!=0xf0)
230 1 {
231 2 delay(125);
232 2 if ((P1&0xf0)!=0xf0)
233 2 {
234 3 scancode = 0xfe;
235 3 while((scancode&0x10)!=0)
236 3 {
237 4 P1 = scancode;
238 4 if ((P1&0xf0)!=0xf0)
239 4 {
240 5 tmpcode = (P1&0xf0)|0x0f;
241 5 return((~scancode)+(~tmpcode));
C51 COMPILER V7.20 TEXT1 07/17/2007 22:47:27 PAGE 5
242 5 }
243 4 else scancode = (scancode<<1)|0x01;
244 4 }
245 3 }
246 2 }
247 1 return(0);
248 1 }
249
250 void gettemp()
251 {
252 1 delay(1); // 延时1ms
253 1 convert(); // 启动温度转换,需要750ms
254 1 delay(1000); // 延时1s
255 1 RdTemp();
256 1 temp=(tpmsb&0x07)*16+((tplsb&0xf0)>>4);
257 1 tempx=tplsb&0x0f;
258 1 }
259
260 void xianshi(unsigned long a)
261 { unsigned long c,p=0;
262 1 if (a!=0)
263 1 { c=a/100000000;
264 2 if(c!=0)
265 2 {lcd1602_wrdata(c+0x30);
266 3 p=1;
267 3 }
268 2 delay(10);
269 2 c=(a%100000000)/10000000;
270 2 if(c!=0)
271 2 {lcd1602_wrdata(c+0x30);
272 3 p=1;
273 3 }
274 2 delay(10);
275 2 c=(a%10000000)/1000000;
276 2 if(c!=0)
277 2 {lcd1602_wrdata(c+0x30);
278 3 p=1;
279 3 }
280 2 delay(10);
281 2 c=(a%1000000)/100000;
282 2 if(c!=0)
283 2 {lcd1602_wrdata(c+0x30);
284 3 p=1;
285 3 }
286 2 delay(10);
287 2 c=(a%100000)/10000;
288 2 if(c!=0)
289 2 {lcd1602_wrdata(c+0x30);
290 3 p=1;
291 3 }
292 2 delay(10);
293 2 c=(a%10000)/1000;
294 2 if(c!=0 || p==1)
295 2 {lcd1602_wrdata(c+0x30);
296 3 }
297 2 delay(10);
298 2 c=(a%1000)/100;
299 2 if(c!=0 || p==1)
300 2 {lcd1602_wrdata(c+0x30);
301 3 }
302 2 delay(10);
303 2 c=(a%100)/10;
C51 COMPILER V7.20 TEXT1 07/17/2007 22:47:27 PAGE 6
304 2 if(c!=0 || p==1)
305 2 {lcd1602_wrdata(c+0x30);
306 3 }
307 2 delay(10);
308 2 c=a%10+0x30;
309 2 lcd1602_wrdata(c);
310 2 delay(10);
311 2 }
312 1 }
313 /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
314 tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
315 5位为符号位。真正通过数码管输出时,需要进行到十进
316 制有符号实数(包括小数部分)的转换。 */
317 void main(void)
318 {
319 1
320 1 delay(2);
321 1 lcd1602_bus=0xff;
322 1 lcd1602_init();
323 1 lcd1602_clear();
324 1 while(1)
325 1 {
326 2 gettemp();
327 2 xianshi(temp);
328 2 tempx=tempx*1000/16;
329 2
330 2
331 2 lcd1602_wrdata('.');
332 2 xianshi(tempx);
333 2 lcd1602_bus=0xff;
334 2 lcd1602_init();
335 2 lcd1602_clear();
336 2 }
337 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1323 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 12
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 + -