📄 digthermo.lst
字号:
C51 COMPILER V7.02b DIGTHERMO 09/03/2005 09:44:34 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE DIGTHERMO
OBJECT MODULE PLACED IN DigThermo.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DigThermo.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************/
2 /* Copyright (c) 2005, 通信工程学院 */
3 /* All rights reserved. */
4 /* 作 者:戴 佳 */
5 /*****************************************/
6
7 #include "DigThermo.h"
8
9 /* 延时t毫秒 */
10 void delay(uint t)
11 {
12 1 uint i;
13 1 while(t--)
14 1 {
15 2 /* 对于11.0592M时钟,约延时1ms */
16 2 for (i=0;i<125;i++)
17 2 {}
18 2 }
19 1 }
20
21 /* 产生复位脉冲初始化DS18B20 */
22 void TxReset(void)
23 {
24 1 uint i;
25 1 DQ = 0;
26 1
27 1 /* 拉低约900us */
28 1 i = 100;
29 1 while (i>0) i--;
30 1
31 1 DQ = 1; // 产生上升沿
32 1 i = 4;
33 1 while (i>0) i--;
34 1 }
35
36 /* 等待应答脉冲 */
37 void RxWait(void)
38 {
39 1 uint i;
40 1 while(DQ);
41 1 while(~DQ); // 检测到应答脉冲
42 1 i = 4;
43 1 while (i>0) i--;
44 1 }
45
46 /* 读取数据的一位,满足读时隙要求 */
47 bit RdBit(void)
48 {
49 1 uint i;
50 1 bit b;
51 1 DQ = 0;
52 1 i++;
53 1 DQ = 1;
54 1 i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
55 1 b = DQ;
C51 COMPILER V7.02b DIGTHERMO 09/03/2005 09:44:34 PAGE 2
56 1 i = 8;
57 1 while(i>0) i--;
58 1 return (b);
59 1 }
60
61 /* 读取数据的一个字节 */
62 uchar RdByte(void)
63 {
64 1 uchar i,j,b;
65 1 b = 0;
66 1 for (i=1;i<=8;i++)
67 1 {
68 2 j = RdBit();
69 2 b = (j<<7)|(b>>1);
70 2 }
71 1 return(b);
72 1 }
73
74 /* 写数据的一个字节,满足写1和写0的时隙要求 */
75 void WrByte(uchar b)
76 {
77 1 uint i;
78 1 uchar j;
79 1 bit btmp;
80 1 for(j=1;j<=8;j++)
81 1 {
82 2 btmp = b&0x01;
83 2 b = b>>1; // 取下一位(由低位向高位)
84 2 if (btmp)
85 2 {
86 3 /* 写1 */
87 3 DQ = 0;
88 3 i++;i++; // 延时,使得15us以内拉高
89 3 DQ = 1;
90 3 i = 8;
91 3 while(i>0) i--; // 整个写1时隙不低于60us
92 3 }
93 2 else
94 2 {
95 3 /* 写0 */
96 3 DQ = 0;
97 3 i = 8;
98 3 while(i>0) i--; // 保持低在60us到120us之间
99 3 DQ = 1;
100 3 i++;
101 3 i++;
102 3 }
103 2 }
104 1 }
105
106 /* 启动温度转换 */
107 void convert(void)
108 {
109 1 TxReset(); // 产生复位脉冲,初始化DS18B20
110 1 RxWait(); // 等待DS18B20给出应答脉冲
111 1 delay(1); // 延时
112 1 WrByte(0xcc); // skip rom 命令
113 1 WrByte(0x44); // convert T 命令
114 1 }
115
116 /* 读取温度值 */
117 void RdTemp(void)
C51 COMPILER V7.02b DIGTHERMO 09/03/2005 09:44:34 PAGE 3
118 {
119 1 TxReset(); // 产生复位脉冲,初始化DS18B20
120 1 RxWait(); // 等待DS18B20给出应答脉冲
121 1 delay(1); // 延时
122 1 WrByte(0xcc); // skip rom 命令
123 1 WrByte(0xbe); // read scratchpad 命令
124 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
125 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
126 1 }
127
128 /* 主程序,读取的温度值最终存放在tplsb和tpmsb变量中。
129 tplsb其中低4位为二进制的“小数”部分;tpmsb其中高
130 5位为符号位。真正通过数码管输出时,需要进行到十进
131 制有符号实数(包括小数部分)的转换。 */
132 void main(void)
133 {
134 1 do
135 1 {
136 2 delay(1); // 延时1ms
137 2 convert(); // 启动温度转换,需要750ms
138 2 delay(1000); // 延时1s
139 2 RdTemp(); // 读取温度
140 2 }
141 1 while(1);
142 1 }
143
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 284 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
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 + -