📄 2402test.lst
字号:
256 2 if((I2C_data<<i)&0x80)
257 2 {
258 3 I2C_Send_Bit_1();
259 3 }
260 2 else
261 2 {
262 3 I2C_Send_Bit_0();
263 3 }
264 2 }
265 1 }
266 /********************************************************************************************
267 * 函数名称:I2C_Read8Bit()
268 * 功 能:从I2C总线接收8bit数据
269 * 入口参数:无
270 * 出口参数:返回值为从I2C总线上接收到的8bit数据
271 ********************************************************************************************/
272 uint8 I2C_Read8Bit(void)reentrant
273 {
274 1 uint8 I2C_data=0,i;
275 1 for(i=0;i<8;i++)
276 1 {
277 2 SDA=1;
278 2 SCL=1;
279 2 I2C_Delay(10);
280 2 F0=SDA;
281 2 I2C_Delay(10);
282 2 SCL=0;
283 2 if(F0==1)
284 2 {
285 3 I2C_data=I2C_data<<1;
286 3 I2C_data=I2C_data|0x01;
287 3 }
288 2 else
289 2 {
290 3 I2C_data=I2C_data<<1;
291 3 }
292 2 }
293 1 return I2C_data;
294 1 }
295 /********************************************************************************************
296 * 函数名称:AT24C02_Write1Byte()
297 * 功 能:向AT24C02指定地址上写入1字节数据
298 * 入口参数:AT24C02_Address AT24C02内的地址
299 * AT24C02_1Byte 将要写入AT24C02的1字节数据
300 * 出口参数:无
301 ********************************************************************************************/
302 void AT24C02_Write1Byte(uint8 AT24C02_Address,uint8 AT24C02_1Byte)
303 {
C51 COMPILER V8.05a 2402TEST 07/02/2008 20:45:43 PAGE 6
304 1 bit AckTemp=1;
305 1 I2C_Start();
306 1 I2C_Write8Bit(AT24C02_WriteDeviceAddress);
307 1 AckTemp=I2C_Check_Ack();
308 1 I2C_Write8Bit(AT24C02_Address);
309 1 AckTemp=I2C_Check_Ack();
310 1 I2C_Write8Bit(AT24C02_1Byte);
311 1 AckTemp=I2C_Check_Ack();
312 1 I2C_Stop();
313 1 }
314 /********************************************************************************************
315 * 函数名称:AT24C02_Read1Byte()
316 * 功 能:从AT24C02指定地址上读出1字节数据
317 * 入口参数:AT24C02_Address AT24C02内的地址
318 * 出口参数:从AT24C02指定地址上读出的1字节数据
319 ********************************************************************************************/
320 uint8 AT24C02_Read1Byte(uint8 AT24C02_Address)
321 {
322 1 bit AckTemp=1;
323 1 uint8 AT24C02_1Byte;
324 1 I2C_Start();
325 1 I2C_Write8Bit(AT24C02_WriteDeviceAddress);
326 1 AckTemp=I2C_Check_Ack();
327 1 I2C_Write8Bit(AT24C02_Address);
328 1 AckTemp=I2C_Check_Ack();
329 1 I2C_Start();
330 1 I2C_Write8Bit(AT24C02_ReadDeviceAddress);
331 1 AckTemp=I2C_Check_Ack();
332 1 AT24C02_1Byte=I2C_Read8Bit();
333 1 AckTemp=I2C_Check_Ack();
334 1 I2C_Stop();
335 1 return AT24C02_1Byte;
336 1 }
337 /*******************设置定时值程序*********************************************************/
338 void Set_alarm(unsigned char m,unsigned char sel,bit a) //根据选择调整的相应项目加1并写入DS1302
339 {
340 1 signed char address,item,item2;
341 1 signed char max,mini;
342 1 if(sel==7){address=0x0B;max=59;mini=0;} //秒7
343 1 if(sel==6){address=0x0A;max=59;mini=0;} //分钟6
344 1 if(sel==5){address=0x09;max=23;mini=0;} //小时5
345 1 if(sel==4){address=0x08;max=7;mini=1;} //星期4
346 1 if(sel==3){address=0x07;max=31;mini=0;} //日3
347 1 if(sel==2){address=0x06;max=12;mini=0;} //月2
348 1 if(sel==1){address=0x05;max=99;mini=0;} //年1
349 1 if(sel==8){address=0x04;max=99;mini=0;} //键号值
350 1 address=address+(m*10); //选择定时项组
351 1 if(a==0) //如果a是0则表示现在键入的是十位数据
352 1 {
353 2 AT24C02_Write1Byte(address,0x00); //将个位的数据清0防止数值范围计算有错
354 2 item=DT; //键值数给十位
355 2 item2=0; //个位填入0
356 2 }
357 1 else //否则是个位数据
358 1 {
359 2 if(sel==4)
360 2 {
361 3 item=0;
362 3 }
363 2 else
364 2 {
365 3 item=(AT24C02_Read1Byte(address))/16; //先读出 十位 数据
C51 COMPILER V8.05a 2402TEST 07/02/2008 20:45:43 PAGE 7
366 3 }
367 2 item2=DT; //键值放入 个位
368 2 }
369 1 item=(item)*10+(item2); //将 十位 和 个位 数据合成
370 1 if(item>max)
371 1 item=mini; //查看数值有效范围
372 1 if(item<mini)
373 1 item=max;
374 1 AT24C02_Write1Byte(address,(item/10)*16+item%10);//转换成16进制写入24C00
375 1 if(DT==0x12)
376 1 {
377 2 AT24C02_Write1Byte(address,0xff);
378 2 }
379 1 }
380 //===================================DS18B20驱动===========================================
381 sbit DQ=P2^0; // 定义DS18B20数据线
382 /*******************延时函数***********************************************************/
383 void Delay(int num)
384 {
385 1 while(num--) ;
386 1 }
387 /*******************初始化ds1820***********************************************************/
388 void Init_DS18B20(void)
389 {
390 1 unsigned char x=0;
391 1 DQ=1; //DQ复位
392 1 Delay(8); //稍做延时
393 1 DQ=0; //单片机将DQ拉低
394 1 Delay(80); //精确延时大于480us
395 1 DQ=1; //拉高总线
396 1 Delay(14);
397 1 x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
398 1 Delay(20);
399 1 }
400 /*******************读一个字节***********************************************************/
401 unsigned char ReadOneChar(void)
402 {
403 1 unsigned char i=0;
404 1 unsigned char dat=0;
405 1 for(i=8;i>0;i--)
406 1 {
407 2 DQ=0; // 给脉冲信号
408 2 dat>>=1;
409 2 DQ=1; // 给脉冲信号
410 2 if(DQ)
411 2 dat|=0x80;
412 2 Delay(4);
413 2 }
414 1 return(dat);
415 1 }
416 /*******************写一个字节***********************************************************/
417 void WriteOneChar(unsigned char dat)
418 {
419 1 unsigned char i=0;
420 1 for(i=8;i>0;i--)
421 1 {
422 2 DQ=0;
423 2 DQ=dat&0x01;
424 2 Delay(5);
425 2 DQ=1;
426 2 dat>>=1;
427 2 }
C51 COMPILER V8.05a 2402TEST 07/02/2008 20:45:43 PAGE 8
428 1 }
429 /*******************读取温度***********************************************************/
430 unsigned int ReadTemperature(void)
431 {
432 1 unsigned char a=0;
433 1 unsigned char b=0;
434 1 unsigned int t=0;
435 1 float tt=0;
436 1 Init_DS18B20();
437 1 WriteOneChar(0xCC); //跳过读序号列号的操作
438 1 WriteOneChar(0x44); //启动温度转换
439 1 Init_DS18B20();
440 1 WriteOneChar(0xCC); //跳过读序号列号的操作
441 1 WriteOneChar(0xBE); //读取温度寄存器
442 1 a=ReadOneChar(); //读低8位
443 1 b=ReadOneChar(); //读高8位
444 1 t=b;
445 1 t<<=8;
446 1 t=t|a;
447 1 tt=t*0.0625;
448 1 t=tt*10+0.5; //放大10倍输出并四舍五入
449 1 return(t);
450 1 }
451 /*******************写一个字节***********************************************************/
452 void printTemperature(void)
453 {
454 1 unsigned int i=0;
455 1 unsigned char a=0,b=0,c=0;
456 1 i=ReadTemperature(); //读温度并送显
457 1 a=i/100;
458 1 if(a>0x06)
459 1 {
460 2 print(0xc0,"--.-");
461 2 }
462 1 else
463 1 {
464 2 print2(0xc1,a+0x30); //显示温度十位
465 2 b=i/10-a*10;
466 2 print2(0xc2,b+0x30); //个位
467 2 print(0xc3,"."); //"."
468 2 c=i-a*100-b*10;
469 2 print2(0xc4,c+0x30); //小位1位
470 2 }
471 1 print2(0xc5,0x00);
472 1 print(0xc6,"C"); //度C
473 1 }
474 //=================================DS1302时钟驱动===========================================//
475 //注释DS1302寄存器
476 // DS1302内部RAM分址:00 = 0xc0(写) = 0xc1(读) 奇数是读,偶数是写
477 /*******************定义DS1302时钟接口******************************************************/
478 sbit clock_clk=P3^5; //ds1302_clk(时钟线)
479 sbit clock_dat=P3^6; //ds1302_dat(数据线)
480 sbit clock_Rst=P3^7; //ds1302_Rst(复位线)
481 /*******************定义累加器A中的各位*****************************************************/
482
483 sbit a0=ACC^0;
484 sbit a1=ACC^1;
485 sbit a2=ACC^2;
486 sbit a3=ACC^3;
487 sbit a4=ACC^4;
488 sbit a5=ACC^5;
489 sbit a6=ACC^6;
C51 COMPILER V8.05a 2402TEST 07/02/2008 20:45:43 PAGE 9
490 sbit a7=ACC^7;
491 /*******************定义全局变量*********************************************************/
492 //unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
493
494 bit w=0; //调时标志位
495 /*******************1302驱动程序(底层协议)***********************************************/
496 void clock_out(unsigned char dd)
497 {
498 1 ACC=dd;
499 1 clock_dat=a0;clock_clk=1;clock_clk=0;
500 1 clock_dat=a1;clock_clk=1;clock_clk=0;
501 1 clock_dat=a2;clock_clk=1;clock_clk=0;
502 1 clock_dat=a3;clock_clk=1;clock_clk=0;
503 1 clock_dat=a4;clock_clk=1;clock_clk=0;
504 1 clock_dat=a5;clock_clk=1;clock_clk=0;
505 1 clock_dat=a6;clock_clk=1;clock_clk=0;
506 1 clock_dat=a7;clock_clk=1;clock_clk=0;
507 1 }
508 /*******************DS1302写入字节(底层协议)**********************************************/
509 unsigned char clock_in(void)
510 {
511 1 clock_dat=1;
512 1 a0=clock_dat;
513 1 clock_clk=1;clock_clk=0;a1=clock_dat;
514 1 clock_clk=1;clock_clk=0;a2=clock_dat;
515 1 clock_clk=1;clock_clk=0;a3=clock_dat;
516 1 clock_clk=1;clock_clk=0;a4=clock_dat;
517 1 clock_clk=1;clock_clk=0;a5=clock_dat;
518 1 clock_clk=1;clock_clk=0;a6=clock_dat;
519 1 clock_clk=1;clock_clk=0;a7=clock_dat;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -