新闻  |   论坛  |   博客  |   在线研讨会
DS1302驱动程序
bpshui | 2013-04-09 19:54:49    阅读:17740   发布文章

本程序在Freescale的8位单片机上调试通过,如果MCU用其它的品牌型号,只需要把下面的宏定义改改就行了。

#define CLR_CE() (PTDD_PTDD3 = 0)
#define SET_CE() (PTDD_PTDD3 = 1)
#define CLR_CLK() (PTDD_PTDD1 = 0)
#define SET_CLK() (PTDD_PTDD1 = 1)
#define CLR_IO() (PTDD_PTDD2 = 0)
#define SET_IO() (PTDD_PTDD2 = 1)
#define INPUT_IO() (PTDDD_PTDDD2 = 0)
#define OUTPUT_IO() (PTDDD_PTDDD2 = 1)
#define READ_IO() (PTDD_PTDD2)
#define NOP()  { __asm NOP; __asm NOP; }

 

下面是程序全文:

//*****************************************************************************

#define CLR_CE() (PTDD_PTDD3 = 0)
#define SET_CE() (PTDD_PTDD3 = 1)
#define CLR_CLK() (PTDD_PTDD1 = 0)
#define SET_CLK() (PTDD_PTDD1 = 1)
#define CLR_IO() (PTDD_PTDD2 = 0)
#define SET_IO() (PTDD_PTDD2 = 1)
#define INPUT_IO() (PTDDD_PTDDD2 = 0)
#define OUTPUT_IO() (PTDDD_PTDDD2 = 1)
#define READ_IO() (PTDD_PTDD2)
#define NOP()  { __asm NOP; __asm NOP; }

#define SETBIT(x,y) (x |= (1 << y))      //set bit y in byte x
#define CLRBIT(x,y) (x &= (~(1 << y)))   //clear bit y in byte x
#define GETBIT(x,y) (x & (1 << y))       //check bit y in byte x

#define BCD2HEX(x) ((10 * (x >> 4)) + (x & 0x0f))
#define HEX2BCD(x) (((x / 10) << 4) + (x % 10))

//*****************************************************************************

void Ds1302_Write(u8 Data)
{
 u8 i;

 for(i = 0; i < 8; i++)
 {
  CLR_CLK();
  NOP();
  if(GETBIT(Data , i))
   SET_IO();
  else
   CLR_IO();
  NOP();
  SET_CLK();    //上升沿,发送数据
 }
}

//*****************************************************************************

u8 Ds1302_Read(void)
{
 u8 RecvData = 0;
 u8 i;
 
 INPUT_IO();    //设置IO口方向
 for(i = 0; i < 8; i++)
 {
  SET_CLK();
  NOP();
  CLR_CLK();   //下降沿接收数据
  NOP();
  if(READ_IO())
   SETBIT(RecvData , i);
 }
 OUTPUT_IO();
 return RecvData;
}

//*****************************************************************************

void Ds1302_Write_Byte(u8 Addr, u8 Data)
{       
 SET_CE();
 Ds1302_Write(Addr);
 Ds1302_Write(Data);
 CLR_CE();
}

//*****************************************************************************

u8 Ds1302_Read_Byte(u8 Addr)
{
 u8 RecvData = 0;
 
 SET_CE();
 Ds1302_Write(Addr);
 RecvData = Ds1302_Read();
 CLR_CE();
 return RecvData;
}

//*****************************************************************************

void DS1302_Init(void)
{
 u8 i;
 
 i = Ds1302_Read_Byte(0x81);

 if(i & 0x10)
 {
  Ds1302_Write_Byte(0x8e, 0x00);  //取消写保护
  Ds1302_Write_Byte(0x80, 0x00);  //启动时钟
 }
}

//*****************************************************************************

void RTC_Get(u8 *RecvBuff)
{
 u8 i;
 u8 Addr = 0x81;

 for (i = 0; i < 7; i++)
 {
//  *RecvBuff++ = BCD2HEX(Ds1302_Read_Byte(Addr));
  
  *RecvBuff++ = Ds1302_Read_Byte(Addr);
  Addr += 2;
 }
}

//*****************************************************************************

void RTC_Set(u8 *SentBuff)
{
    u8 i;
    u8 Addr = 0x80;

 Ds1302_Write_Byte(0x8e, 0x00);  //取消写保护

 for(i = 0; i < 7; i++)
 {
  Ds1302_Write_Byte(Addr, HEX2BCD(*SentBuff));
  SentBuff++;
  Addr += 2;
 }

 Ds1302_Write_Byte(0x8e, 0x80);  //设置写保护

这个程序可以直接用的,用之前最好把DS1302的数据手册仔细研究研究。

全文完(原创)!

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
ywg100  2015-12-12 14:39:01 

刚到,学习一下,

sunshiny2  2014-12-22 17:09:25 

正在看

c312996746  2014-09-12 16:31:51 

mark

huxiao1976  2014-09-12 09:09:35 

不懂,需要慢慢细琢

xqh518  2013-07-30 22:02:58 

DS1302是一个存储IC,一般就是读和写、高电平和低电平的,怎么也要这么复杂的驱动?

mappthy132  2013-05-23 11:07:02 

MaRK

电子设计应用群(181263624)
推荐文章
最近访客