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