"); //-->
本程序在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实验:可变增益放大器
万年厉
三星加速QD-OLED面板生产:目标2025年出货量增长50%
LED38粒高亮节能灯制作电路图
车辆到电网通信接口国际标准ISO 15118
由CW1524组成的单端反激式集成开关稳压电源电路
基于PIC32的低成本图形解决方案
基于PIC32的蜂窝网机器到机器(M2M)通信解决方案
4月1日,台积电正式接受2nm订单
汽车诊断通信接口国际标准ISO 14229
电动汽车(EV)和充电站之间通信协议国际标准ISO 15118
MPLAB® X IDE 编译调试(下)
跟我来作EZ编程器
如何在嵌入式开发中使用DeepSeek
如何使用dsPIC® DSC 实现两路电机控制?
Valens Semiconductor携手RGo Robotics与CHERRY Embedded Solutions 推动AI机器人系统连接技术革新
跟我来作ep51编程器
万年历原码
程控开关电源用于片心逻辑—Pentium Pro处理器
54x dsp最小用户系统电路图
如何使用ARM RealView开发arm啊
由MC33364构成的8.2V/3A开关直流稳压电源电路
zsMCU实验板
泰克助力MIPI总线技术的测试与多场景应用
利用测量运算放大器的输入电容来降低噪声
由MC33363构成的6V/2A隔离式开关稳压电源电路
ARM小程序请教?
[求助]这个运算如何用vhdl实现啊?