共2条
1/1 1 跳转至页
msp403,ds1302 msp403如何读取ds1302时钟芯片?
问
谁能贴一段C的读取ds1302时钟芯片的源代码。最好是能调试通过的,不是网上其他地方copy的。
答 1:
430用3V,那么和1302之间要不用注意电平??还是之间连接就可以了啊??
答 2:
430用3V,1302的VCC接+5V ,口线加上拉电阻,共地!
答 3:
直接连就行,1302有3v的
答 4:
不觉得很浪费吗?DS1302需要32K晶体,430也需要,DS1302需要电池维持以防止掉电数据丢失,你把这电池加在430上不也可以让430持续工作吗?
说白了就是使用430的一部分资源来代替ds1302,不但节省了成本,降低了功耗,而且还可以解决楼主你这个最要命的难题:ds1302的读写程序问题 答 5: 确实浪费呀! 答 6: 时间的精确性 答 7: #include "MSP430x41x.h"
#include "constant.h"
#include "function.h"
#include "variables.h"
//***********************************************
//实时时钟模块 时钟芯片型号:DS1302
#define DS_RST BIT4 //DS_RST = P2.4 实时时钟复位线引脚
#define DS_SCL BIT6 //DS_SCL = P6.6 实时时钟时钟线引脚
#define DS_SDA BIT7 //DS_SDA = P6.7 实时时钟数据线引脚
//***********************************************
#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P6DIR &= ~DS_SCL
#define DS_SCL_OUT P6DIR |= DS_SCL
#define DS_SCL0 P6OUT &= ~DS_SCL
#define DS_SCL1 P6OUT |= DS_SCL
#define DS_SDA_IN P6DIR &= ~DS_SDA
#define DS_SDA_OUT P6DIR |= DS_SDA
#define DS_SDA0 P6OUT &= ~DS_SDA
#define DS_SDA1 P6OUT |= DS_SDA
#define DS_SDA_BIT P6IN & DS_SDA
//***********************************************
void Open1302(void);//打开DS1302
void Close1302(void);//关闭DS1302
void DS1302InputByte(unsigned char);//往DS1302写入1Byte数据
unsigned char DS1302OutputByte(void);//从DS1302读取1Byte数据
void Write1302(unsigned char, unsigned char);//往DS1302写入数据
unsigned char Read1302(unsigned char);//读取DS1302某地址的数据
/************************************************
函 数 名: Open1302()
功 能:打开DS1302
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
void Open1302(void)
{
DS_RST_OUT;
DS_SCL_OUT;
DS_RST0; //first rst set 0
DS_SCL0; //sclk set 0
_NOP();
_NOP();
DS_RST1; //then rst set 1, enable operate 1302
_NOP();
_NOP();
}
/************************************************
函 数 名: Close1302()
功 能:关闭DS1302
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
void Close1302(void)
{
DS_SCL1; //sclk set 1
DS_RST0;
}
/************************************************
函 数 名: DS1302InputByte()
功 能:往DS1302写入1Byte数据
说 明:
调 用:
全局变量:
入口参数:WriteData: 写入的数据
出口参数:无
返 回 值:无
************************************************/
void DS1302InputByte(unsigned char WriteData)
{
unsigned char i;
DS_SDA_OUT;
DS_SCL_OUT;
for(i = 8;i > 0;i--)
{
if(WriteData & BIT0)
DS_SDA1;
else
DS_SDA0;
DS_SCL0; //data input as sclk rising
_NOP();
DS_SCL1;
WriteData >>= 1;
}
}
/************************************************
函 数 名: DS1302OutputByte()
功 能:从DS1302读取1Byte数据
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:ReadData
************************************************/
unsigned char DS1302OutputByte(void)
{
unsigned char i,ReadData;
DS_SCL_OUT;
DS_SDA_OUT;
DS_SDA1;
DS_SDA_IN;
for(i = 0;i < 8;i++)
{
DS_SCL1; //read from 1302 as sclk falling down
_NOP();
DS_SCL0;
ReadData >>= 1;
if(DS_SDA_BIT)
ReadData |= BIT7;
}
return(ReadData);
}
/************************************************
函 数 名: Write1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据
调 用:DS1302InputByte()
全局变量:
入口参数:Address: DS1302地址, WriteData: 要写的数据
出口参数:无
返 回 值:无
************************************************/
void Write1302(unsigned char Address, unsigned char WriteData)
{
Address = ((Address & 0xFE)| 0x80); //write address: bit0 is 0, bit7 is 1
Open1302();
DS1302InputByte(Address); //firt write address
DS1302InputByte(WriteData); //then write data
Close1302();
}
/************************************************
函 数 名: Read1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据
调 用:DS1302InputByte(),DS1302OutputByte()
全局变量:
入口参数:Address: DS1302地址
出口参数:无
返 回 值:ReadData: 读取的数据
************************************************/
unsigned char Read1302(unsigned char Address)
{
unsigned char ReadData;
Address |= BIT0 + BIT7; //read address: bit0 is 1, bit7 is 1
Open1302();
DS1302InputByte(Address); //write address
ReadData = DS1302OutputByte(); //read 1 Byte
Close1302();
return(ReadData);
}
/************************************************
函 数 名: DS1302BurstWrite()
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写数据(时钟多字节方式)
调 用:DS1302InputByte(),Write1302()
全局变量:
入口参数:ptrSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
/*void DS1302BurstWrite(unsigned char *ptrSecDa)
{
unsigned char i;
Write1302(0x8E,0x00); //control register = 0,enable write
Open1302();
DS1302InputByte(0xBE);
for(i = 8;i > 0;i--)
DS1302InputByte(*ptrSecDa++);
Close1302();
}*/
/************************************************
函 数 名: DS1302BurstRread()
功 能:读取DS1302时钟数据
说 明:先写地址,后读命令/数据(时钟多字节方式)
调 用:DS1302InputByte(),DS1302OutputByte()
全局变量:
入口参数:ptrSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
/*void DS1302BurstRread(unsigned char *ptrSecDa)
{
unsigned char i;
Open1302();
DS1302InputByte(0xBF); //clock burst address
for(i = 8;i > 0;i--)
*ptrSecDa++ = DS1302OutputByte();
Close1302();
}*/
/************************************************
函 数 名: BurstW1302R()
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
调 用:DS1302InputByte()
全局变量:
入口参数:ptrReDa:寄存器数据地址
出口参数:无
返 回 值:无
************************************************/
/*void BurstW1302R(unsigned char *ptrReDa)
{
unsigned char i;
Write1302(0x8E,0x00); //WP = 0,enable write
Open1302();
DS1302InputByte(0xFE); //0xfe ram burst address
for(i = 31;i > 0;i--)
DS1302InputByte(*ptrReDa++);
Close1302();
}*/
/************************************************
函 数 名: BurstR1302R()
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:DS1302InputByte(),DS1302OutputByte()
全局变量:
入口参数:ptrReDa: 寄存器数据地址
出口参数:无
返 回 值:无
************************************************/
/*void BurstR1302R(unsigned char *ptrReDa)
{
unsigned char i;
Open1302();
DS1302InputByte(0xFF); //clock busrt
for(i = 31;i > 0;i--)
*ptrReDa++ = DS1302OutputByte(); //read 1 Byte
Close1302();
}*/
/************************************************
函 数 名: Set1302()
功 能:设置初始时间
说 明:
调 用:Write1302()
全局变量:
入口参数:ptrSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
7Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
void Set1302(unsigned char *ptrSecDa)
{
unsigned char i;
unsigned char Address = 0x80;
Write1302(0x8E,0x00); //控制命令,WP = 0,eanble write
for(i = 7;i > 0;i--)
{
Write1302(Address,*ptrSecDa++);
Address += 2;
}
Write1302(0x8E,0x80); //WP = 1,write protec
}
/************************************************
函 数 名: Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:Read1302()
全局变量:
入口参数:CurrentTime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
void Get1302(unsigned char *CurrentTime)
{
unsigned char i;
unsigned char Address = 0x81;
//_DINT();
for(i = 0;i < 7;i++)
{
*CurrentTime++ = Read1302(Address); //格式为: 秒 分 时 日 月 星期 年
Address += 2;
}
//_EINT();
} 答 8: 引用: 答 9: 引用:
说白了就是使用430的一部分资源来代替ds1302,不但节省了成本,降低了功耗,而且还可以解决楼主你这个最要命的难题:ds1302的读写程序问题 答 5: 确实浪费呀! 答 6: 时间的精确性 答 7: #include "MSP430x41x.h"
#include "constant.h"
#include "function.h"
#include "variables.h"
//***********************************************
//实时时钟模块 时钟芯片型号:DS1302
#define DS_RST BIT4 //DS_RST = P2.4 实时时钟复位线引脚
#define DS_SCL BIT6 //DS_SCL = P6.6 实时时钟时钟线引脚
#define DS_SDA BIT7 //DS_SDA = P6.7 实时时钟数据线引脚
//***********************************************
#define DS_RST_IN P2DIR &= ~DS_RST
#define DS_RST_OUT P2DIR |= DS_RST
#define DS_RST0 P2OUT &= ~DS_RST
#define DS_RST1 P2OUT |= DS_RST
#define DS_SCL_IN P6DIR &= ~DS_SCL
#define DS_SCL_OUT P6DIR |= DS_SCL
#define DS_SCL0 P6OUT &= ~DS_SCL
#define DS_SCL1 P6OUT |= DS_SCL
#define DS_SDA_IN P6DIR &= ~DS_SDA
#define DS_SDA_OUT P6DIR |= DS_SDA
#define DS_SDA0 P6OUT &= ~DS_SDA
#define DS_SDA1 P6OUT |= DS_SDA
#define DS_SDA_BIT P6IN & DS_SDA
//***********************************************
void Open1302(void);//打开DS1302
void Close1302(void);//关闭DS1302
void DS1302InputByte(unsigned char);//往DS1302写入1Byte数据
unsigned char DS1302OutputByte(void);//从DS1302读取1Byte数据
void Write1302(unsigned char, unsigned char);//往DS1302写入数据
unsigned char Read1302(unsigned char);//读取DS1302某地址的数据
/************************************************
函 数 名: Open1302()
功 能:打开DS1302
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
void Open1302(void)
{
DS_RST_OUT;
DS_SCL_OUT;
DS_RST0; //first rst set 0
DS_SCL0; //sclk set 0
_NOP();
_NOP();
DS_RST1; //then rst set 1, enable operate 1302
_NOP();
_NOP();
}
/************************************************
函 数 名: Close1302()
功 能:关闭DS1302
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:无
************************************************/
void Close1302(void)
{
DS_SCL1; //sclk set 1
DS_RST0;
}
/************************************************
函 数 名: DS1302InputByte()
功 能:往DS1302写入1Byte数据
说 明:
调 用:
全局变量:
入口参数:WriteData: 写入的数据
出口参数:无
返 回 值:无
************************************************/
void DS1302InputByte(unsigned char WriteData)
{
unsigned char i;
DS_SDA_OUT;
DS_SCL_OUT;
for(i = 8;i > 0;i--)
{
if(WriteData & BIT0)
DS_SDA1;
else
DS_SDA0;
DS_SCL0; //data input as sclk rising
_NOP();
DS_SCL1;
WriteData >>= 1;
}
}
/************************************************
函 数 名: DS1302OutputByte()
功 能:从DS1302读取1Byte数据
说 明:
调 用:
全局变量:
入口参数:无
出口参数:无
返 回 值:ReadData
************************************************/
unsigned char DS1302OutputByte(void)
{
unsigned char i,ReadData;
DS_SCL_OUT;
DS_SDA_OUT;
DS_SDA1;
DS_SDA_IN;
for(i = 0;i < 8;i++)
{
DS_SCL1; //read from 1302 as sclk falling down
_NOP();
DS_SCL0;
ReadData >>= 1;
if(DS_SDA_BIT)
ReadData |= BIT7;
}
return(ReadData);
}
/************************************************
函 数 名: Write1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据
调 用:DS1302InputByte()
全局变量:
入口参数:Address: DS1302地址, WriteData: 要写的数据
出口参数:无
返 回 值:无
************************************************/
void Write1302(unsigned char Address, unsigned char WriteData)
{
Address = ((Address & 0xFE)| 0x80); //write address: bit0 is 0, bit7 is 1
Open1302();
DS1302InputByte(Address); //firt write address
DS1302InputByte(WriteData); //then write data
Close1302();
}
/************************************************
函 数 名: Read1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据
调 用:DS1302InputByte(),DS1302OutputByte()
全局变量:
入口参数:Address: DS1302地址
出口参数:无
返 回 值:ReadData: 读取的数据
************************************************/
unsigned char Read1302(unsigned char Address)
{
unsigned char ReadData;
Address |= BIT0 + BIT7; //read address: bit0 is 1, bit7 is 1
Open1302();
DS1302InputByte(Address); //write address
ReadData = DS1302OutputByte(); //read 1 Byte
Close1302();
return(ReadData);
}
/************************************************
函 数 名: DS1302BurstWrite()
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写数据(时钟多字节方式)
调 用:DS1302InputByte(),Write1302()
全局变量:
入口参数:ptrSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
/*void DS1302BurstWrite(unsigned char *ptrSecDa)
{
unsigned char i;
Write1302(0x8E,0x00); //control register = 0,enable write
Open1302();
DS1302InputByte(0xBE);
for(i = 8;i > 0;i--)
DS1302InputByte(*ptrSecDa++);
Close1302();
}*/
/************************************************
函 数 名: DS1302BurstRread()
功 能:读取DS1302时钟数据
说 明:先写地址,后读命令/数据(时钟多字节方式)
调 用:DS1302InputByte(),DS1302OutputByte()
全局变量:
入口参数:ptrSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
/*void DS1302BurstRread(unsigned char *ptrSecDa)
{
unsigned char i;
Open1302();
DS1302InputByte(0xBF); //clock burst address
for(i = 8;i > 0;i--)
*ptrSecDa++ = DS1302OutputByte();
Close1302();
}*/
/************************************************
函 数 名: BurstW1302R()
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
调 用:DS1302InputByte()
全局变量:
入口参数:ptrReDa:寄存器数据地址
出口参数:无
返 回 值:无
************************************************/
/*void BurstW1302R(unsigned char *ptrReDa)
{
unsigned char i;
Write1302(0x8E,0x00); //WP = 0,enable write
Open1302();
DS1302InputByte(0xFE); //0xfe ram burst address
for(i = 31;i > 0;i--)
DS1302InputByte(*ptrReDa++);
Close1302();
}*/
/************************************************
函 数 名: BurstR1302R()
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:DS1302InputByte(),DS1302OutputByte()
全局变量:
入口参数:ptrReDa: 寄存器数据地址
出口参数:无
返 回 值:无
************************************************/
/*void BurstR1302R(unsigned char *ptrReDa)
{
unsigned char i;
Open1302();
DS1302InputByte(0xFF); //clock busrt
for(i = 31;i > 0;i--)
*ptrReDa++ = DS1302OutputByte(); //read 1 Byte
Close1302();
}*/
/************************************************
函 数 名: Set1302()
功 能:设置初始时间
说 明:
调 用:Write1302()
全局变量:
入口参数:ptrSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
7Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
void Set1302(unsigned char *ptrSecDa)
{
unsigned char i;
unsigned char Address = 0x80;
Write1302(0x8E,0x00); //控制命令,WP = 0,eanble write
for(i = 7;i > 0;i--)
{
Write1302(Address,*ptrSecDa++);
Address += 2;
}
Write1302(0x8E,0x80); //WP = 1,write protec
}
/************************************************
函 数 名: Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:Read1302()
全局变量:
入口参数:CurrentTime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte(BCD码) 1B 1B 1B 1B 1B 1B 1B
出口参数:无
返 回 值:无
************************************************/
void Get1302(unsigned char *CurrentTime)
{
unsigned char i;
unsigned char Address = 0x81;
//_DINT();
for(i = 0;i < 7;i++)
{
*CurrentTime++ = Read1302(Address); //格式为: 秒 分 时 日 月 星期 年
Address += 2;
}
//_EINT();
} 答 8: 引用: 答 9: 引用:
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |