📄 2402shiyan.lst
字号:
159 1 for (i = 0; i < bytes; i++)
160 1 {
161 2 *date= Read_I2c();
162 2
163 2 Ack();
164 2 date++;
165 2 }
166 1
167 1 NoAck();
168 1 Stop();
169 1 DelayMs(10);
170 1 }
171 void delay(void)
172 { unsigned char i,j;
C51 COMPILER V8.02 2402SHIYAN 06/01/2007 22:56:05 PAGE 4
173 1 for(i=0;i<15;i++){ for(j=0;j<50;j++) ; }
174 1 }
175
176 unsigned char displaycount,x;
177 unsigned char displaybuf[8]={0,0,0,0,0,0,0,0};
178 unsigned char timecount;
179 unsigned char readdata[8];
180 unsigned long a,aa,bb;
181 sbit DQ=P2^6; //选P3.7口与DS18B20的数字信号输出端DQ相连
182 bit sflag;
183
184 bit resetpulse(void) //DS18B20初始化实现对DS18B20的复位
185 { unsigned char pre;
186 1 unsigned char i;
187 1 DQ=0; //发出复位脉冲,将数据线下拉480μS-960μS
188 1 for(i=220;i>0;i--); //(改!!!!!!!!!!!!!!!!!!!!)
189 1 DQ=1; //DS18B20等待15μS-60μS
190 1 for(i=60;i>0;i--);
191 1 pre=DQ;
192 1 for(i=150;i>0;i--);
193 1 return(pre); // DS18B20返回60μS-240μS存在低脉冲,判断是否准备好接受或发送数据
194 1 }
195
196 void writecommandtods18b20(unsigned char command) //写时序
197 {
198 1 unsigned char i;
199 1 unsigned char j;
200 1
201 1 for(i=0;i<8;i++)
202 1 {
203 2 if((command & 0x01)==0) //写0时序
204 2 {
205 3 DQ=0; //拉低单总线至少60μS,保证DS18B20在15μS-45μS时可以正确地采样I/O总线上的低电平
206 3 for(j=35;j>0;j--);
207 3 DQ=1;
208 3 }
209 2 else //写1时序
210 2 {
211 3 DQ=0; //拉低单总线后,在15us之内就得释放
212 3 for(j=2;j>0;j--);
213 3 DQ=1;
214 3 for(j=33;j>0;j--);
215 3 }
216 2 command=_cror_(command,1);
217 2 }
218 1 }
219
220 unsigned char readdatafromds18b20(void) //读时序
221 {
222 1 unsigned char i;
223 1 unsigned char j;
224 1 unsigned char temp;
225 1
226 1 temp=0;
227 1 for(i=0;i<8;i++)
228 1 {
229 2 temp=_cror_(temp,1);
230 2 DQ=0; //单总线拉低后,读时序开始
231 2 _nop_();
232 2 _nop_();
233 2 DQ=1; //停止将数据线拉低,以读取数据
234 2 for(j=10;j>0;j--);
C51 COMPILER V8.02 2402SHIYAN 06/01/2007 22:56:05 PAGE 5
235 2 if(DQ==1)
236 2 {
237 3 temp=temp | 0x80;
238 3 }
239 2 else
240 2 {
241 3 temp=temp | 0x00;
242 3 }
243 2 for(j=20;j>0;j--); ////////////////////(改!!!!!!!!!!!!)
244 2 }
245 1 return(temp);
246 1 }
247
248
249
250 void main(void)
251 { SCON=0; P1=0;
252 1 Write_Date(0,date_txd,8);
253 1 Read_Date(0,date_rxd,8);
254 1 //while(resetpulse()); //写前调用初始化程序对DS18B20复位
255 1 //writecommandtods18b20(0xcc); //单片DS18B20工作,跳过读ROM中64位地址的过程
256 1 //writecommandtods18b20(0x44); //启动DS18B20进行温度转化,将结果存入内部RAM中
257 1 while(1)
258 1 {
259 2 for(m=0;m<16;m++)
260 2 { SBUF=codedisplay[date_rxd[0]*16+m]; while(!TI) ; TI=0;
261 3 SBUF=codedisplay[date_rxd[1]*16+m]; while(!TI) ; TI=0;
262 3 SBUF=codedisplay[date_rxd[2]*16+m]; while(!TI) ; TI=0;
263 3 SBUF=codedisplay[date_rxd[3]*16+m]; while(!TI) ; TI=0;
264 3 SBUF=codedisplay[date_rxd[4]*16+m]; while(!TI) ; TI=0;
265 3 SBUF=codedisplay[date_rxd[5]*16+m]; while(!TI) ; TI=0;
266 3 SBUF=codedisplay[date_rxd[6]*16+m]; while(!TI) ; TI=0;
267 3 SBUF=codedisplay[date_rxd[7]*16+m]; while(!TI) ; TI=0;
268 3 //P2_0=0;P2_1=0;P2_1=1;P2_1=0;P2_0=1;
269 3 SBUF=Tab[2*m]; while(!TI) ; TI=0;
270 3 SBUF=Tab[2*m+1];while(!TI) ; TI=0;
271 3
272 3 P3_4=0;P3_4=1; P3_4=0;
273 3 delay();
274 3 /* count++;
275 3 if(count==600)
276 3 { count=0;
277 3 while(resetpulse()); //写前调用初始化程序对DS18B20复位
278 3 writecommandtods18b20(0xcc); //单片DS18B20工作,跳过读ROM中64位地址的过程
279 3 writecommandtods18b20(0xbe); // 读DS18B20RAM中温度数据
280 3 readdata[0]=readdatafromds18b20(); //温度数据低8位赋值
281 3 readdata[1]=readdatafromds18b20(); //温度数据高8位赋值
282 3 sflag=0;
283 3 if((readdata[1] & 0xf8)!=0x00) //温度数据高5位为1时,温度为负值
284 3 {
285 3 sflag=1;
286 3 readdata[1]=~readdata[1]; //对负温度值进行取反加1操作
287 3 readdata[0]=~readdata[0];
288 3 result=readdata[0]+1;
289 3 readdata[0]=result;
290 3 if(result>255)
291 3 {
292 3 readdata[1]++;
293 3 }
294 3 }
295 3 readdata[1]=readdata[1]&0x07; //将代表符号的高5位数屏蔽
296 3 aa=625;bb=(readdata[1]*256+readdata[0]);
C51 COMPILER V8.02 2402SHIYAN 06/01/2007 22:56:05 PAGE 6
297 3 a=bb*aa; //计算实际温度值
298 3
299 3
300 3
301 3 displaybuf[0]=a/100000; //给各显示位赋温度值
302 3 displaybuf[1]=a%100000/10000;
303 3 displaybuf[2]=a%10000/1000;
304 3 displaybuf[3]=a%1000/100;
305 3 displaybuf[4]=a%100/10;
306 3 displaybuf[5]=a%10;
307 3 while(resetpulse());
308 3 writecommandtods18b20(0xcc);
309 3 writecommandtods18b20(0x44);
310 3 }*/
311 3 }}}
312
313
314
315
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 749 ----
CONSTANT SIZE = 192 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 75 10
IDATA SIZE = 1 ----
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 + -