"); //-->
本程序在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的数据手册仔细研究研究。
全文完(原创)!
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。