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