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