📄 ds1820.lst
字号:
C51 COMPILER V7.01 DS1820 05/09/2003 11:49:38 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE DS1820
OBJECT MODULE PLACED IN .\ds1820.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE .\ds1820.c LARGE DEBUG OBJECTEXTEND
stmt level source
1 #include"w77e58.h"
2 #include"intrins.h"
3
4 #define uchar unsigned char
5 #define uint unsigned int
6 extern void clp_dog();
7
8 sbit DQ =P1^7;//根据实际情况定义端口
9 uchar bdata afc;
10 uchar bdata afd;
11 sbit ac0=afc^0; /*定义ACC的位,利用ACC操作速度最快*/
12 sbit ac1=afc^1;
13 sbit ac2=afc^2;
14 sbit ac3=afc^3;
15 sbit ac4=afc^4;
16 sbit ac5=afc^5;
17 sbit ac6=afc^6;
18 sbit ac7=afc^7;
19
20 sbit cc0=afd^0; /*定义ACC的位,利用ACC操作速度最快*/
21 sbit cc1=afd^1;
22 sbit cc2=afd^2;
23 sbit cc3=afd^3;
24 sbit cc4=afd^4;
25 sbit cc5=afd^5;
26 sbit cc6=afd^6;
27 sbit cc7=afd^7;
28
29
30 extern bit wdcgaq;//温度传感器正确标志0=正?
31
32 void delaya(unsigned long useconds);
33 void delaye(uint useconds);
34 void delayb(uchar useconds);
35 bit ow_reset(void);
36 uchar read_byte(void);
37
38 void write_byte(uchar val);
39 int Read_Temperature(void);
40 void writ0();
41 void writ1();
42 bit read();
43 //延时
44 void delaya(unsigned long useconds)
45 {
46 1 unsigned long i;
47 1 for(i=0;i<=useconds;i++)
48 1 _nop_();
49 1 }
50 void delaye(uint useconds)
51 {
52 1 uint i;
53 1 for(i=0;i<=useconds;i++)
54 1 _nop_();
55 1 }
C51 COMPILER V7.01 DS1820 05/09/2003 11:49:38 PAGE 2
56 void delayb(uchar useconds)
57 {
58 1 uchar i;
59 1 for(i=0;i<=useconds;i++)
60 1 _nop_();
61 1 }
62
63 //读取温度
64 int Read_Temperature(void)
65 {
66 1 union{
67 1 uchar c[2];
68 1 int x;
69 1 }temp;
70 1 if(ow_reset())
71 1 return(0);
72 1 clp_dog();
73 1 write_byte(0xCC); //Skip ROM
74 1 delaye(60);
75 1 write_byte(0x44); // Start Conversion
76 1 delaya(39000);
77 1 if(ow_reset())
78 1 return(0);
79 1 clp_dog();
80 1 write_byte(0xCC); // Skip ROM
81 1 delaye(60);
82 1 write_byte(0xBE); // Read Scratch Pad
83 1 delaye(60);
84 1 temp.c[0]=read_byte();
85 1 delaye(60);
86 1 temp.c[1]=read_byte();
87 1
88 1 return(temp.x);
89 1 }
90
91
92 //复位
93 bit ow_reset(void)
94 {
95 1 DQ = 0; //pull DQ line low
96 1 delaya(25); // leave it low for 480us
97 1 DQ = 1; // allow line to return high
98 1 delaye(40); // wait for presence
99 1 //presence = DQ; // get presence signal
100 1 wdcgaq=DQ;//无传感器或错误
101 1 delaya(10); // wait for end of timeslot
102 1 return(wdcgaq); // presence signal returned
103 1 } // 0=presence, 1 = no part
104
105 //从 1-wire 总线上读取一个字节
106 uchar read_byte(void)
107 {
108 1 uchar value = 0;
109 1 ac0=read();
110 1 delaye(80); // wait for rest of timeslot
111 1 ac1=read();
112 1 delaye(80); // wait for rest of timeslot
113 1 ac2=read();
114 1 delaye(80); // wait for rest of timeslot
115 1 ac3=read();
116 1 delaye(80); // wait for rest of timeslot
117 1 ac4=read();
C51 COMPILER V7.01 DS1820 05/09/2003 11:49:38 PAGE 3
118 1 delaye(80); // wait for rest of timeslot
119 1 ac5=read();
120 1 delaye(80); // wait for rest of timeslot
121 1 ac6=read();
122 1 delaye(80); // wait for rest of timeslot
123 1 ac7=read();
124 1 delaye(80); // wait for rest of timeslot
125 1 return(value=afc);
126 1 }
127
128
129
130 //向 1-WIRE 总线上写一个字节
131 void write_byte(uchar val)
132 {
133 1 afc=val;
134 1
135 1 if(ac0)
136 1 writ1();
137 1 else writ0();
138 1
139 1 if(ac1)
140 1 writ1();
141 1 else writ0();
142 1
143 1 if(ac2)
144 1 writ1();
145 1 else writ0();
146 1
147 1 if(ac3)
148 1 writ1();
149 1 else writ0();
150 1
151 1 if(ac4)
152 1 writ1();
153 1 else writ0();
154 1
155 1 if(ac5)
156 1 writ1();
157 1 else writ0();
158 1
159 1 if(ac6)
160 1 writ1();
161 1 else writ0();
162 1
163 1 if(ac7)
164 1 writ1();
165 1 else writ0();
166 1
167 1 }
168
169 void writ0()
170 {
171 1 DQ = 0; // pull DQ low to start timeslot
172 1 delaye(100);
173 1 DQ = 1;
174 1 delaye(60);
175 1 }
176 void writ1()
177 {
178 1 DQ = 0; // pull DQ low to start timeslot
179 1 delayb(20);
C51 COMPILER V7.01 DS1820 05/09/2003 11:49:38 PAGE 4
180 1 DQ =1;
181 1 delaye(160); // hold value for remainder of timeslot
182 1
183 1 }
184
185 bit read()
186 {
187 1
188 1 DQ = 0; // pull DQ low to start timeslot
189 1 delayb(8);
190 1 DQ = 1; // then return high
191 1 _nop_();
192 1 cc0=DQ;
193 1 delayb(2); //for (i=0; i<3; i++);
194 1 cc1=DQ;
195 1 delayb(2); //for (i=0; i<3; i++);
196 1 cc2=DQ;
197 1 delayb(2); //for (i=0; i<3; i++);
198 1 cc3=DQ;
199 1 delayb(2); //for (i=0; i<3; i++);
200 1 cc4=DQ;
201 1 delayb(2); //for (i=0; i<3; i++);
202 1 cc5=DQ;
203 1 delayb(2); //for (i=0; i<3; i++);
204 1 cc6=DQ;
205 1 delayb(2); //for (i=0; i<3; i++);
206 1 cc7=DQ;
207 1 if(afd==0xff)
208 1 return(1);
209 1 else return(0);
210 1 }
211
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 494 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- 10
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -