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