专栏中心

EEPW首页 > 专栏 > DS1302驱动程序

DS1302驱动程序

发布人:bpshui 时间:2013-04-09 来源:工程师 发布文章

本程序在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的数据手册仔细研究研究。

全文完(原创)!

 

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

MPLAB® X IDE 编译调试(上)

学子专区论坛 - ADALM2000实验:可变增益放大器

2025-03-27

万年厉

三星加速QD-OLED面板生产:目标2025年出货量增长50%

车辆到电网通信接口国际标准ISO 15118

基于PIC32的低成本图形解决方案

基于PIC32的蜂窝网机器到机器(M2M)通信解决方案

4月1日,台积电正式接受2nm订单

EDA/PCB 2025-03-27

汽车诊断通信接口国际标准ISO 14229

电动汽车(EV)和充电站之间通信协议国际标准ISO 15118

MPLAB® X IDE 编译调试(下)

跟我来作EZ编程器

如何在嵌入式开发中使用DeepSeek

如何使用dsPIC® DSC 实现两路电机控制?

Valens Semiconductor携手RGo Robotics与CHERRY Embedded Solutions 推动AI机器人系统连接技术革新

跟我来作ep51编程器

万年历原码

zsMCU实验板

泰克助力MIPI总线技术的测试与多场景应用

利用测量运算放大器的输入电容来降低噪声

更多 培训课堂
更多 焦点
更多 视频

技术专区