历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2021年01月10日 | MSP430 DS1302 驱动

2021-01-10 来源:eefocus

sys.h里面需要一些延时函数。


ds1302.h



#ifndef __DS1302_H

#define __DS1302_H


#include "msp430.h"

#include "sys.h"


struct ds1302time

{

int year;

unsigned char mouth;

unsigned char day;

unsigned char week;

unsigned char hour;

unsigned char minute;

unsigned char second;

};


void DS1302_read_time( struct ds1302time *p );//获取时间

void DS1302_write_time( struct ds1302time *p );//写入时间

int getWeekdayByYearday( int iY, int iM, int iD );//获取星期几



#endif


ds1302.c


#include "DS1302.h"



/**************宏定义***************/

#define DS_RST BIT7    /* DS_RST = P2.7 */

#define DS_SCL BIT5    /* DS_SCL = P2.5 */

#define DS_SDA BIT6    /* DS_SDA = P2.6 */

#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 P2DIR &= ~DS_SCL

#define DS_SCL_OUT P2DIR |= DS_SCL

#define DS_SCL0 P2OUT &= ~DS_SCL

#define DS_SCL1 P2OUT |= DS_SCL

#define DS_SDA_IN P2DIR &= ~DS_SDA

#define DS_SDA_OUT P2DIR |= DS_SDA

#define DS_SDA0 P2OUT &= ~DS_SDA

#define DS_SDA1 P2OUT |= DS_SDA

#define DS_SDA_BIT (P2IN & DS_SDA)



/* DS1302地址定义 */

#define ds1302_sec_add 0x80    /* 秒数据地址 */

#define ds1302_min_add 0x82    /* 分数据地址 */

#define ds1302_hr_add 0x84    /* 时数据地址 */

#define ds1302_date_add 0x86    /* 日数据地址 */

#define ds1302_month_add 0x88    /* 月数据地址 */

#define ds1302_day_add 0x8a    /* 星期数据地址 */

#define ds1302_year_add 0x8c    /* 年数据地址 */

#define ds1302_control_add 0x8e    /* 控制数据地址 */

#define ds1302_charger_add 0x90

#define ds1302_clkburst_add 0xbe



/* 向DS1302写入一个字节数据 */

void W_Data( unsigned char addr, unsigned char data )

{

unsigned char i;

        DS_RST_OUT;DS_SCL_OUT;DS_SDA_OUT;

        

DS_RST0;            /* 停止DS1302总线 */

DS_SCL0;            /* 清零时钟线 */

delay_us( 10 );

DS_RST1;            /* 启动DS1302总线 */

addr = addr & 0xFE;  /* 最低位置零,写数据 */

DS_SDA_OUT;

for ( i = 0; i < 8; i++ )       /* 写地址 */

{

DS_SCL0;

if ( addr & 0x01 )

DS_SDA1;

else

DS_SDA0;


addr = addr >> 1;

DS_SCL1;    /* 产生时钟在上升沿输出数据到DS1302 */

delay_us( 9 );

}

for ( i = 0; i < 8; i++ )       /* 写数据 */

{

DS_SCL0;

if ( data & 0x01 )

DS_SDA1;

else

DS_SDA0;

data = data >> 1;

DS_SCL1;    /* 产生时钟在上升沿输出数据到DS1302 */

delay_us( 9 );

}

DS_RST0;                 /* 停止DS1302总线 */

}



/* 从DS1302读出一个字节数据 */

unsigned char R_Data( unsigned char addr )

{

unsigned char i, temp;

        DS_RST_OUT;DS_SCL_OUT;DS_SDA_OUT;

        

DS_RST0;            /* 停止DS1302总线 */

DS_SCL0;            /* 清零时钟线 */

delay_us( 10 );

DS_RST1;            /* 启动DS1302总线 */

addr = addr | 0x01;  /* 最低位置高,读数据 */

DS_SDA_OUT;

for ( i = 0; i < 8; i++ )       /* 写地址 */

{

DS_SCL0;

if ( addr & 0x01 )

DS_SDA1;

else

DS_SDA0;

addr = addr >> 1;

DS_SCL1;    /* 产生时钟在上升沿输出数据到DS1302 */

delay_us( 9 );

}

DS_SDA_IN;

for ( i = 0; i < 8; i++ )       /* 读数据 */

{

if ( DS_SDA_BIT )

temp |= 0x80;

else

temp &= 0x7F;

DS_SCL1;    /* 产生时钟在下升沿输出数据到DS1302 */

temp = temp >> 1;

DS_SCL0;

delay_us( 9 );

}

DS_RST0;                 /* 停止DS1302总线 */

return(temp);

}



/*******************************************

 * 函数名称:Set_DS1302

 * 功    能:设置DS1302内部的时间

 * 参    数:ptr--指向存放数据地址的指针

 * 返回值  :无

 * 说明    :写入数据的格式:

 *          秒 分 时 日 月 星期 年  【共7个字节】

 ********************************************/

void Set_DS1302( unsigned char *ptr )

{

unsigned char i;

unsigned char addr = 0x80;


W_Data( 0x8e, 0x00 );                           /* 允许写入 */


for ( i = 7; i > 0; i-- )

{

W_Data( addr, *ptr++ );

addr += 2;

}

W_Data( 0x8e, 0x80 );                           /* 禁止 */

}



/* 从DS302读出时钟数据 */

void DS1302_Read_Time( unsigned char *ptr )

{

ptr[1] = R_Data( ds1302_year_add );            /* 年 */

ptr[2] = R_Data( ds1302_month_add );           /* 月 */

ptr[3] = R_Data( ds1302_date_add );            /* 日 */

ptr[4] = R_Data( ds1302_hr_add );              /* 时 */

ptr[5] = R_Data( ds1302_min_add );             /* 分 */

ptr[6] = (R_Data( ds1302_sec_add ) ) & 0x7f;   /* 秒,屏蔽秒的第7位,避免超出59 */

ptr[7] = R_Data( ds1302_day_add );             /* 周 */

}



/* 获取时间 */

void DS1302_read_time( struct ds1302time *p )

{

/* 年月日 时分秒 星期 */

unsigned char time_buf[8] = { 0x20, 0x20, 0x03, 0x03, 0x23, 0x59, 0x55, 0x02 };



DS1302_Read_Time( time_buf ); /* 读取 */


p->year = 2000 + (time_buf[1] >> 4) * 10 + (time_buf[1] & 0x0f);

p->mouth = (time_buf[2] >> 4) * 10 + (time_buf[2] & 0x0f);

p->day = (time_buf[3] >> 4) * 10 + (time_buf[3] & 0x0f);


p->hour = (time_buf[4] >> 4) * 10 + (time_buf[4] & 0x0f);

p->minute = (time_buf[5] >> 4) * 10 + (time_buf[5] & 0x0f);

p->second = (time_buf[6] >> 4) * 10 + (time_buf[6] & 0x0f);


p->week = (time_buf[7] >> 4) * 10 + (time_buf[7] & 0x0f);

}



/* 写入时间 */

void DS1302_write_time( struct ds1302time *p )

{

/* 年月日 时分秒 星期 */

unsigned char time_buf[8] = { 0x20, 0x20, 0x03, 0x03, 0x23, 0x59, 0x55, 0x02 };


time_buf[1] = p->year % 100 / 10 * 16 + p->year % 100 % 10;

time_buf[2] = p->mouth % 100 / 10 * 16 + p->mouth % 100 % 10;

time_buf[3] = p->day % 100 / 10 * 16 + p->day % 100 % 10;

time_buf[4] = p->hour % 100 / 10 * 16 + p->hour % 100 % 10;

time_buf[5] = p->minute % 100 / 10 * 16 + p->minute % 100 % 10;

time_buf[6] = p->second % 100 / 10 * 16 + p->second % 100 % 10;

time_buf[7] = p->week % 100 / 10 * 16 + p->week % 100 % 10;


W_Data( ds1302_control_add, 0x00 );             /* 关闭写保护 */

W_Data( ds1302_sec_add, 0x80 );                 /* 暂停时钟 */

/* DS1302_Write_Byte(ds1302_charger_add, 0xA9);      //涓流充电 */

W_Data( ds1302_year_add, time_buf[1] );         /* 年 */

W_Data( ds1302_month_add, time_buf[2] );        /* 月 */

W_Data( ds1302_date_add, time_buf[3] );         /* 日 */

W_Data( ds1302_hr_add, time_buf[4] );           /* 时 */

W_Data( ds1302_min_add, time_buf[5] );          /* 分 */

W_Data( ds1302_sec_add, time_buf[6] );          /* 秒 */

W_Data( ds1302_day_add, time_buf[7] );          /* 周 */

W_Data( ds1302_control_add, 0x80 );             /* 打开写保护 */

}



/*

 * 由年月日获取星期 https://www.cnblogs.com/fengbohello/p/3264300.html

 * 返回1到7 代表星期一到星期天

 */

int getWeekdayByYearday( int iY, int iM, int iD )

{

int iWeekDay = -1;

if ( 1 == iM || 2 == iM )

{

iM += 12;

iY--;

}

iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7;

if ( iWeekDay == 0 )

iWeekDay = 7;

return(iWeekDay);

}


使用:

定义时间变量结构体:


struct ds1302time time;           /* DS1302时间 */


写入时间:


    time.year = 2020;

time.mouth = 3;

time.day = 13;

time.hour = 12;

time.minute = 55;

time.second = 55;

time.week = getWeekdayByYearday( time.year, time.mouth, time.day );

DS1302_write_time( &time );                                             /* 写入时间 */


更新时间time:


DS1302_read_time( &time );//读取时间

time.week = getWeekdayByYearday( time.year, time.mouth, time.day );//


推荐阅读

史海拾趣

FCI [First Components International]公司的发展小趣事

在电子行业中,FCI(First Components International)公司作为一家知名的连接器和互联系统制造商,其发展历程中确实有许多值得分享的故事。以下是关于FCI公司的五个发展故事:

  1. FCI的气体流量计与传感器技术突破

FCI作为一家全球性的气体流量计、气体和液体流量开关以及液位开关的制造商,其产品广泛应用于各种工业领域。为了满足不断增长的市场需求,FCI投入大量研发资源,成功开发出高精度、高可靠性的气体流量计和传感器。这些产品在化工、能源、环保等多个领域得到了广泛应用,为FCI赢得了良好的市场口碑。随着技术的不断创新和产品质量的持续提升,FCI逐渐成为了行业内的佼佼者。

  1. FCI中国分公司的成立与服务升级

随着中国市场的快速发展,FCI看到了在中国市场发展的巨大潜力。为了更好地服务中国客户,FCI决定在中国成立分公司。分公司的成立,不仅为FCI提供了更贴近本地市场的服务平台,还为其在中国市场的业务拓展提供了有力支持。分公司雇佣了一批在过程仪表和测量控制方面经验丰富的员工,并新增了数条经过认证的高精度流体标定台,以提供专业的服务和技术支持。这一举措显著提升了FCI在中国市场的竞争力和品牌影响力。

  1. FCI的AirMax VS高速背板连接器技术革新

为了满足未来高速数据传输的需求,FCI投入巨资研发新一代的高速背板连接器技术。经过多年的努力,FCI成功开发出了先进的AirMax VS高速背板连接器技术,为未来传输速率达到40Gb/s的设计奠定了基础。这一技术的推出,不仅巩固了FCI在连接器行业的领先地位,还为其在高速数据传输领域的发展打开了新的市场空间。

  1. FCI与航空领域的深度合作

随着航空技术的不断发展,对高精度传感器和流量计的需求也日益增长。FCI凭借其在气体流量计和传感器方面的技术优势,成功打入了航空领域市场。公司与多家知名航空企业建立了深度合作关系,为其提供定制化的产品和解决方案。这些产品在航空器的燃油系统、液压系统以及环境控制系统中发挥着重要作用,为航空安全提供了有力保障。

  1. FCI的全球化战略布局

为了适应全球化的市场趋势,FCI积极拓展其国际业务。公司通过并购、合资等方式,在全球范围内建立了多个生产基地和销售网络。这些举措不仅提高了FCI的生产效率和响应速度,还使其能够更好地服务全球客户。同时,FCI也加大了对新兴市场的投入,通过与当地合作伙伴的紧密合作,成功打入了多个具有潜力的市场领域。

以上五个故事展示了FCI在电子行业发展中的关键里程碑和重大成就。从技术创新到市场拓展,再到全球化布局,FCI始终保持着敏锐的市场洞察力和强大的竞争力,不断推动着电子行业的发展进步。

Altus Technology Inc公司的发展小趣事

在激烈的市场竞争中,Altus始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的控制和把关。此外,Altus还注重客户反馈和需求,不断优化产品和服务,以满足客户的个性化需求。这些举措使得Altus的产品在市场上赢得了良好的口碑和客户信赖,为公司的长期发展奠定了坚实基础。

倍思特(BEST)公司的发展小趣事

在激烈的市场竞争中,Altus始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的控制和把关。此外,Altus还注重客户反馈和需求,不断优化产品和服务,以满足客户的个性化需求。这些举措使得Altus的产品在市场上赢得了良好的口碑和客户信赖,为公司的长期发展奠定了坚实基础。

Hamamatsu公司的发展小趣事

Altus深知人才是企业发展的根本。因此,公司一直注重人才培养和引进工作。通过建立完善的培训体系和激励机制,Altus吸引了大量优秀人才加入公司,并为他们提供了广阔的发展空间和职业晋升机会。这些人才在公司的各个岗位上发挥着重要作用,推动了公司的技术创新和市场拓展。同时,Altus还注重员工的福利待遇和文化建设,营造了积极向上、团结和谐的工作氛围。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司注重企业文化建设和团队建设,通过营造积极向上的工作氛围和提供广阔的发展平台,吸引了大量优秀人才的加入。公司注重员工的培训和成长,为员工提供多样化的职业发展路径。同时,公司还积极开展团队建设活动,增强员工的归属感和凝聚力。这种企业文化和团队建设为公司的发展提供了有力的保障。


请注意,这些故事是基于一般性的电子行业和公司发展情况进行构想的,可能与Aerotronics Marketing Inc公司的实际情况存在差异。如果需要更具体、准确的故事,建议您直接查阅该公司的官方网站、新闻报道或相关资料。

百蓉(ECE)公司的发展小趣事

百蓉公司不满足于仅在国内市场发展,开始积极拓展国际市场。他们参加了多个国际电子展览,与多家国际知名企业建立了合作关系。通过深入了解不同国家和地区的市场需求,百蓉针对性地推出了符合当地消费者需求的产品,逐渐在国际市场上占据了一席之地。

问答坊 | AI 解惑

51上面也能跑操作系统了啊

呵呵 现在我找到的ucos移植到51单片机的例子 给大家看看 以后我会整理一个培训的计划 呵呵 共同学习吧 都是在网上找的…

查看全部问答>

基于软开关的电子辐照高压电源

0 引言 在食品加工过程中采用电子辐照技术,可以改善食品的品质,提高食品的安全性。加速管作为离子束加速器件,在电子辐照工程装置中是关键设备。加速管的电子枪高压电源电压的高低可直接影响加速管的辐照计量。为了满足不同辐照物体的辐照计量要 ...…

查看全部问答>

对模拟电路的理解

大家都看看感触挺深…

查看全部问答>

寻解高频的几道判断题和填空题

判断题 1. 振荡器具有稳定输出的原因是振荡系统中具有选频网络() 2. 改变放大器的输出负载就可以改变动态负载线的斜率,所以只要改变RL就可以有甲、乙、丙三种不同的工作状态() 3. 大信号二极管包洛检波器原来无失真,但当输入已调 ...…

查看全部问答>

常用键盘方案设计[通用外围专题

大多电子产品中都需要使用到按键作为操作的界面,无论是电子消费品还是专业设备,几乎都不可避免的需要使用键盘。而键盘的实现有很多种方案,这里就目前常用的几种键盘方案进行一下对比。     就笔者所知,常用的方案有:IO键、阵列键 ...…

查看全部问答>

无线上网卡写固件!!求助

本人无线上网卡刷固件刷的,电脑读不出网卡不,硬件没有坏,软件坏了,怎样才能恢复正常,想自己来写该网卡固件,求助各位帮忙解决,华为eg162g…

查看全部问答>

谁有WINCE远程调试的几个工具

哪位有WINCE远程调试的工具: 远程调用评测程序(Remote Call Profiler) 远程内核跟踪程序(Remote Kernel Tracker) 远程系统信息(Remote System Information) 远程性能监视程序(Remote Performance Monitor) 麻烦您发到我的邮箱 xia ...…

查看全部问答>

无线串口模块

Moreway-wirelesstransmitter是UART接口半双工无线传输模块,可以工作在433MHz公用频段。符合欧洲ETSI(EN300-220-1和EN301-439-3),满足无线管制要求,无需申请频率使用许可证。使用简单,即插既用,直接替换串口线,无需编程!1.开阔地300米传输距离 ...…

查看全部问答>

刚刚收到得的奖品

早上收到论坛活动的奖品,充电充了3个小时还在显示充电,不敢充了,不知道其他人的是不是也要充这么久?用的君正4725方案,这个方案应该是蛮适合diy的,有空拆开来看看,当开发板玩玩屏幕是2.8的液晶,感觉背光亮度有点低上几张图给大家看看旁边是6 ...…

查看全部问答>

TFT 驱动的移植

#include \"tft_driver.h\" void delay_SYS(unsigned int count) {         for(count=0;count>8);                 WR_L;              ...…

查看全部问答>