⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 MSP430 DS1302程序库
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
             DS1302.c
                    
             MSP430F149开发板DS1302时钟芯片主程序
                    
        说明:调试中,还需检测写日期函数的日期自检部分的正确性
             还没有检测RAM能否断电保护
             此函数库功能不包含突发状态下多字节写读的功能
             对一个寄存器写时,要先禁止写保护
                
             Copyright(c)2008, 323实验室 罗佳芳
             
             All rights reserved.
    
*/
#include <msp430x14x.h>
#include "DS1302.h"

//根据硬件电路进行修改
#define DS1302_DIR   P2DIR
#define DS1302_IN    P2IN
#define DS1302_OUT   P2OUT

#define DS1302_RST   BIT3
#define DS1302_SCLK  BIT2
#define DS1302_SDA   BIT4

#define DS1302_RST0  DS1302_OUT &=~DS1302_RST
#define DS1302_RST1  DS1302_OUT |= DS1302_RST
#define DS1302_SCLK0 DS1302_OUT &=~DS1302_SCLK
#define DS1302_SCLK1 DS1302_OUT |= DS1302_SCLK
#define DS1302_SDA0  DS1302_OUT &=~DS1302_SDA
#define DS1302_SDA1  DS1302_OUT |= DS1302_SDA


/****************************************************************************
* 名    称:DS1302_Delay()
* 功    能:延时函数
* 入口参数:无
* 出口参数:无
* 范    例: 
* 说    明: 
****************************************************************************/
void DS1302_Delay(unsigned int delayTime)
{
	unsigned int i;
	for(i=0;i<delayTime;i++);
        }

/****************************************************************************
* 名    称:DS1302_Init()
* 功    能:DS1302初始化程序
* 入口参数:无
* 出口参数:无
* 范    例: 
* 说    明: 初始化为00年00星期00月00日00时00分00秒
****************************************************************************/
void DS1302_Init(void)
{
	unsigned char initDay[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //初始化时间
	
	DS1302_DIR |=(DS1302_RST + DS1302_SCLK);  //定义RST和SCLK口为输出口

	DS1302_SCLK0;  //起始时钟信号电平为低
	DS1302_RST0;
	DS1302_Delay(10);
	DS1302_SCLK1;
	
	DS1302_WriteDayData(initDay,HOUR_24,HOUR_AM);
	}

/****************************************************************************
* 名    称:DS1302_WriteOneByte()
* 功    能:向DS1302写入一个字节
* 入口参数:wData : 待写入的数据
* 出口参数:无
* 范    例: 
* 说    明: 
****************************************************************************/
void DS1302_WriteOneByte(unsigned char wData)
{
	unsigned char i;
	DS1302_DIR |= DS1302_SDA;  //数据I0口定义为输出
	
	DS1302_RST1;    //the reset signal must be aaserted high during read and write
	for(i=0;i<8;i++)
	{
		DS1302_SDA0;
		if(wData & BIT0) DS1302_SDA1;  //如果需输出数据的当前的最后一位为1,刚输出高电平
		DS1302_SCLK0;
		DS1302_Delay(10);
		DS1302_SCLK1;     //上升沿写入DS1302
		DS1302_Delay(10);
		wData >>=1;
		}
	}

/****************************************************************************
* 名    称:DS1302_ReadOneByte()
* 功    能:从DS1302读出一个字节
* 入口参数:无
* 出口参数:rData : 读出的一个字节
* 范    例: 
* 说    明: 
****************************************************************************/
unsigned char DS1302_ReadOneByte(void)
{
	unsigned char i,rData;
	rData=0x00;
	DS1302_DIR &= ~DS1302_SDA;   //IO口为输入
	
	DS1302_RST1;   //进行读写时,RST信号必须保持为高电平
	for(i=0;i<8;i++)
	{
		rData >>=1;
		DS1302_SCLK1;
		DS1302_Delay(10);
		DS1302_SCLK0;      //下降沿读取数据
		DS1302_Delay(10);
		if(DS1302_IN & DS1302_SDA) rData |= BIT7;
	}
	
	return(rData);
	}

/****************************************************************************
* 名    称:DS1302_WriteRegByte()
* 功    能:向DS1302的某一个寄存器写入一个字节
* 入口参数:addr : DS1302寄存器的地址
           wData : 待写入的数据
* 出口参数:无
* 范    例: 
* 说    明: 给非控制寄存器写入数年据之前,一定要向控制寄存器写入命令0X00,禁用写保护
            写完之后要禁用写保护,写入命令字0X80
            可调用头文件中的宏定义 DS1302_WriteEnable;  //禁用写保护
                                  DS1302_WriteNEnable; //启用写保护
****************************************************************************/
void DS1302_WriteRegByte(unsigned char addr,unsigned char wData)
{
	DS1302_RST0;   //初始化部分
	DS1302_SCLK0;
	DS1302_RST1;
	
	DS1302_WriteOneByte(addr);    //先写入地址
	DS1302_WriteOneByte(wData);   //再写入数据
	
	DS1302_SCLK1;
	DS1302_RST0;
        }

/****************************************************************************
* 名    称:DS1302_ReadRegByte()
* 功    能:从DS1302的某一个寄存器读出一个字节
* 入口参数:addr  : DS1302寄存器的地址
* 出口参数:rData : 读出的一个字节
* 范    例: 
* 说    明: 
****************************************************************************/
unsigned char DS1302_ReadRegByte(unsigned char addr)
{
	unsigned char rData = 0x00;
	
	DS1302_RST0;    //初始化部分
	DS1302_SCLK0;
	DS1302_RST1;
	
	DS1302_WriteOneByte(addr);        //写入地址
	rData = DS1302_ReadOneByte();     //读出数据
	
	DS1302_SCLK0;
	DS1302_RST0;
	
	return(rData);
	}

/****************************************************************************
* 名    称:DS1302_WriteDayData()
* 功    能:向DS1302写入日期数据
* 入口参数:*dayData  : 秒,分,时,日,月,星期,年  从低到高排列-->BCD码存储
                        此数据中不要写入格式信息,只写入纯日期
                        注意日期数据不能越界,越界数据将返回错误码0
            hourType : HOUR_24/HOUR_12  24小时制/12小时制
            AM_PM    : HOUR_AM/HOUR_PM  上午/下午  
* 出口参数:0 : 错误, 1  正确
* 范    例: 
* 说    明: 此函数用来设置DS1302的日期,若要DS1302能够工作,还需要使振荡器允许工作,
            振荡器的允许与禁止位在秒寄存器上,本次操作默认就打开了振荡器
            此函数内部已经对写保护进行了操作,写保护位不对此函数产生影响,调用些函数后,
            DS1302启动写保护
****************************************************************************/
unsigned char DS1302_WriteDayData(unsigned char *dayData,unsigned char hourType,unsigned char AM_PM)
{
        unsigned char i,temp0,temp1;
        unsigned char addr = DS1302_DataRegW;

        //日期越界判断
        //秒
        temp0 = dayData[0] & 0x0f;  //低四位
        temp1 = dayData[0] & 0xf0;  //高四位
        temp1 >>=4; //移位至低四位进行判断
        if(temp0>9 || temp1>5) return(0);  //秒的范围是:00~59
        //分
        temp0 = dayData[1] & 0x0f;
        temp1 = dayData[1] & 0xf0;
        temp1 >>=4;
        if(temp0>9 || temp1>5) return(0);
        //时
        temp0 = dayData[2] & 0x0f;
        temp1 = dayData[2] & 0xf0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -