《匠人手记》推荐网上购书渠道:
  互动出版网(china-pub)   >>>
  当当网(dangdang)   >>>
  卓越亚马逊网    >>>
  淘宝网(taobao)   >>>
  更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

调试时钟芯片DS1302有感
程序匠人 发表于 2006-8-14 15:22:00  阅读全文 | 回复(0) | 引用通告 | 编辑

转自老古开发网
      
经过几天的劳累终于可以把时间显示出来啦!真是好兴奋。总结一下吧!

       由于本人手中和网上的源程序实在是太多,“看上去也挺完美,就是因为这个看上去完美让我花费了好长时间。来读别人的代码,程序怎么条就是不通,后来看了一位网友的文章写的是关于DS1302调试过程中应注意的事项,指出了ds1302datasheet中的一些错误,这才使我恍然大悟,原来读数据的时间要求是非常严格的。要求在命令字之后的第一个下降沿就要读数据,否则读出的数据就是错误的,也不能说完全错误,那就必须作必要的调整。本来读数据手册时已经注意到这个问题,但就是再看别人的程序时没引起注意。害得我浪费了几天的时间。

    下次一定要注意:别人程序很可能有缺陷,能参考,但不能够完全照抄,数据手册一定要细读。时间是浪费了,但也值,这几天告诉我,自己的c语言功夫还不够,具体地说差得好远。提醒自己要努力。一定要学会应用汇编,汇编与c的相互调用。

  下面是我的原程序,写得不好,如果有哪位高手看见了一定要指教,小弟不胜感激。其中最想改的就是write()和read()函数,每个函数大概编译后都是63字节,肯定能再少,就是不用ACC而用变量移位来完成。试了几次调不通呀!

/******************************************************************/
/*
文件名:DS1302.c
/*
  名:DS1302.h
/*
  能:此文件中的函数可用于对DS1302的时间进行设置和读取DS1302内部的时间
/*
  点:此文件中的函数没有用到DS1302的所有功能,如:连续的读写操作、RAM的应用,充电部分的应用,写保护、抗干扰等
/*        
但是可以根据DS1302datasheet和此文件中的部分函数组合可以实现上述功能
/******************************************************************/

#i nclude <at89x51.h>
#define uchar unsigned char
/******************************************************************/

uchar code time_set[7]={0x15,0x30,0x13,0x04,0x12,0x07,0x05};  file://设置时间初始值数组
                     // 
            星期 

uchar data timercur[7];  file://用于存放从DS1302读回的时间数据  
uchar data timerint[14]; file://
用于存放将BCD码型数据转换成INT型后的数据
uchar data *pTimerInt;   file://
指向存放转换后时间数据的指针
/******************************************************************/
sbit CLK=P1^0;         file://
与硬件相关的连线  clkDS1302的时钟信号线
sbit DAT=P1^1;         file://DAT
DS1302I/O数据线
sbit RST=P1^2;         file://RST
DS1302RST信号线

sbit ACC0=ACC^0;
sbit ACC1=ACC^1;
sbit ACC2=ACC^2;
sbit ACC3=ACC^3;
sbit ACC4=ACC^4;
sbit ACC5=ACC^5;
sbit ACC6=ACC^6;
sbit ACC7=ACC^7;
/****************************
函数定义**************************************/

/******************************************************************/
/*
函数名:writeaddress;
/*
  数:地址/数据字节
/*
  能:用于向DS1302输入地址或数据信息
/******************************************************************/
void write(uchar address)
{
   ACC=address;
   CLK=0;
   DAT=ACC0;
   CLK=1;CLK=0;
   DAT=ACC1;
   CLK=1;CLK=0;
   DAT=ACC2;
   CLK=1;CLK=0;
   DAT=ACC3;
   CLK=1;CLK=0;
   DAT=ACC4;
   CLK=1;CLK=0;
   DAT=ACC5;
   CLK=1;CLK=0;
   DAT=ACC6;
   CLK=1;CLK=0;
   DAT=ACC7;
   CLK=1;
}

/******************************************************************/
/*
函数名:read();
/*
  数:无
/*
  能:用于从DS1302读出时间数据信息
/******************************************************************/
void read()
{
 // DAT=1;            /*
注意在进行读操作之前DAT应置1*/
  CLK=0;
  ACC0=DAT;
  CLK=1;CLK=0;
  ACC1=DAT;
  CLK=1;CLK=0;
  ACC2=DAT;
  CLK=1;CLK=0;
  ACC3=DAT;
  CLK=1;CLK=0;
  ACC4=DAT;
  CLK=1;CLK=0;
  ACC5=DAT;
  CLK=1;CLK=0;
  ACC6=DAT;
  CLK=1;CLK=0;
  ACC7=DAT;
  CLK=1

  return(ACC);
}

/******************************************************************/
/*
函数名:W_Byte(address, byte);
/*
  数:地址,数据
/*
  能:用于向DS1302指定的地址address输入数据byte
/******************************************************************/
void W_Byte(uchar address,uchar byte)
{
  RST=0;
  CLK=0;
  RST=1;
  write(address);
  write(byte);
  RST=0;         
}
/******************************************************************/
/*
函数名:R_Byte(address);
/*
  数:地址
/*
  能:用于从DS1302指定地址address处读出数据,并将数据存放到ACC
/******************************************************************/
uchar R_Byte(uchar address)
{
  RST=0;
  CLK=0;
  RST=1;
  write(address);
  DAT=1;
  read();
  RST=0;
  return(ACC);
}

/******************************************************************/
/*
函数名:timeset() ;
/*
  数:无
/*
  能:用于设置DS1302的时间,具体时间值存放在time_set[7]数组中
/******************************************************************/
void timeset()  
{ uchar i;
  W_Byte(0x8e,0x00);
  for(i=0;i<7;i++)
  W_Byte(0x80+i+i,time_set[i]);
}
/******************************************************************/
/*
函数名:readtime() ;
/*
  数:无
/*
  能:用于读取DS1302的当前时间,具体时间值存放在timecur[7]数组中
/******************************************************************/
void readtime()
{ uchar i;
  for(i=0;i<7;i++)
  timercur[i]=R_Byte(0x81+i+i);
}
/******************************************************************/
/*
函数名:unsigned char * bcd_int(unsigned char i)
/*
  数:BCD型数据
/*
  能:因为从DS1302读回的数据是BCD,所以要将其转换为十进制整形数据
/******************************************************************/
unsigned char * bcd_int(unsigned char i)
{
   uchar j;
  
   *(pTimerInt++)=(i&0x0f);
  
  j=i>>4;
   *(pTimerInt++)= j&0x0f;
 
   return(*pTimerInt);
}

/******************************************************************/
/*
函数名:BCD_to_INT();
/*
  数:无
/*
  能:用于将时间BCD码转换为十进制码
/******************************************************************/
void BCD_to_INT()
{ uchar i;
  for(i=0;i<7;i++)
 bcd_int(timercur[i]);
}
 
供大家参考,如果有问题请联系原作者,谢谢!
liyang477
发表于 2005-12-4 15:14:00

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    推荐阅读

    往日酷贴

     

    友情连接

     [更多酷站连接]

     

     

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [hotpower 的水潭]

    [八楼的呼吸]

    [柔月阁]

    [PIC论坛]

    [SMARTCODE电子书斋]

    [阿摆手记]

    [电子伙伴]

    [xwj的文君阁]

    [