历史上的今天
返回首页

历史上的今天

今天是:2025年10月11日(星期六)

正在发生

2022年10月11日 | 51单片机基础之DS1302

2022-10-11 来源:csdn

代码:


main.c 文件

 

/*

DS1302时钟

*/

#include "smg.h"

#include "ds1302.h"

 

void main()

{

u8 time_buf[8]; //这个数组用来存储需要现实的内容

ds1302_init();//初始化DS1302

 

while(1)

{

ds1302_read_time();

//虽然不知道这个是干嘛的,但是知道怎么改。

time_buf[0]=gsmg_code[gDS1302_TIME[2]/16];

time_buf[1]=gsmg_code[gDS1302_TIME[2]&0x0f];

time_buf[2]=0x40; //显示一杠

time_buf[3]=gsmg_code[gDS1302_TIME[1]/16];

time_buf[4]=gsmg_code[gDS1302_TIME[1]&0x0f];

time_buf[5]=0x40; //显示一杠

time_buf[6]=gsmg_code[gDS1302_TIME[0]/16];

time_buf[7]=gsmg_code[gDS1302_TIME[0]&0x0f];

smg_display(time_buf,1); //数码管显示函数

}

}


#include "ds1302.h"

#include "intrins.h"

 

//DS1302写入和读取时分秒的地址命令

//秒分时日月周年 最低位读写位

u8 gREAD_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d}; 

u8 gWRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};

 

//DS1302时钟初始化2021年5月20日星期四13点51分47秒

//存储顺序是秒分时日月周年,存储格式是用BCD码

//在这里改起始日期

u8 gDS1302_TIME[7] = {0x11, 0x11, 0x11, 0x20, 0x04, 0x05, 0x21};

 

 

/*

* 函 数 名       : ds1302_write_byte

* 函数功能 : DS1302写单字节

* 输    入       : addr:地址/命令

   dat:数据

* 输    出    : 无

*/

void ds1302_write_byte(u8 addr,u8 dat)

{

u8 i=0;

DS1302_RST=0;

_nop_();

DS1302_CLK=0;//CLK低电平

_nop_();

DS1302_RST=1;//RST由低到高变化

_nop_();

 

for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位

{

DS1302_IO=addr&0x01;

addr>>=1;

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据

_nop_();

}

for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位

{

DS1302_IO=dat&0x01;

dat>>=1;

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;

_nop_();

}

DS1302_RST=0;//RST拉低

_nop_();

}

 

/*

* 函 数 名       : ds1302_read_byte

* 函数功能 : DS1302读单字节

* 输    入       : addr:地址/命令

* 输    出    : 读取的数据

*/

u8 ds1302_read_byte(u8 addr)

{

u8 i=0;

u8 temp=0;

u8 value=0;

 

DS1302_RST=0;

_nop_();

DS1302_CLK=0;//CLK低电平

_nop_();

DS1302_RST=1;//RST由低到高变化

_nop_();

for(i=0;i<8;i++)//循环8次,每次写1位,先写低位再写高位

{

DS1302_IO=addr&0x01;

addr>>=1;

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;//CLK由低到高产生一个上升沿,从而写入数据

_nop_();

}

for(i=0;i<8;i++)//循环8次,每次读1位,先读低位再读高位

{

temp=DS1302_IO;

value=(temp<<7)|(value>>1);//先将value右移1位,然后temp左移7位,最后或运算

DS1302_CLK=1;

_nop_();

DS1302_CLK=0;

_nop_();

}

DS1302_RST=0;//RST拉低

_nop_();

DS1302_CLK=1;//对于实物中,P3.4口没有外接上拉电阻的,此处代码需要添加,使数据口有一个上升沿脉冲。

_nop_();

DS1302_IO = 0;

_nop_();

DS1302_IO = 1;

_nop_();

return value;

}

 

/*

* 函 数 名       : ds1302_init

* 函数功能 : DS1302初始化时间

* 输    入       : 无

* 输    出    : 无

*/

void ds1302_init(void)

{

u8 i=0;

ds1302_write_byte(0x8E,0X00);

for(i=0;i<7;i++)

{

ds1302_write_byte(gWRITE_RTC_ADDR[i],gDS1302_TIME[i]);

}

ds1302_write_byte(0x8E,0X80);

}

 

/*

* 函 数 名       : ds1302_read_time

* 函数功能 : DS1302读取时间

* 输    入       : 无

* 输    出    : 无

*/

void ds1302_read_time(void)

{

u8 i=0;

for(i=0;i<7;i++)

{

gDS1302_TIME[i]=ds1302_read_byte(gREAD_RTC_ADDR[i]);

}

}


ds1302.h文件

 

#ifndef _ds1302_H

#define _ds1302_H

 

#include "smg.h"

 

//管脚定义

sbit DS1302_RST=P3^5;//复位管脚

sbit DS1302_CLK=P3^6;//时钟管脚

sbit DS1302_IO=P3^4;//数据管脚

 

//变量声明

extern u8 gDS1302_TIME[7];//存储时间

 

//函数声明

void ds1302_init(void);

void ds1302_read_time(void);

 

 

#endif


smg.c文件

 

#include "smg.h"

 

//共阴极数码管显示0~F的段码数据

u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

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

* 函 数 名       : smg_display

* 函数功能 : 动态数码管显示

* 输    入       : dat:要显示的数据

   pos:从左开始第几个位置开始显示,范围1-8

* 输    出    : 无

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

void smg_display(u8 dat[],u8 pos)

{

u8 i=0;

u8 pos_temp=pos-1;

for(i=pos_temp;i<8;i++)

{

    switch(i)//位选

{

case 0: LSC=1;LSB=1;LSA=1;break;

case 1: LSC=1;LSB=1;LSA=0;break;

case 2: LSC=1;LSB=0;LSA=1;break;

case 3: LSC=1;LSB=0;LSA=0;break;

case 4: LSC=0;LSB=1;LSA=1;break;

case 5: LSC=0;LSB=1;LSA=0;break;

case 6: LSC=0;LSB=0;LSA=1;break;

case 7: LSC=0;LSB=0;LSA=0;break;

}

SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据

delay_10us(100);//延时一段时间,等待显示稳定

SMG_A_DP_PORT=0x00;//消音

}

}

//延时函数

void delay_10us(u16 ten_us)

{

while(ten_us--);

}


smg.h文件

 

#ifndef _smg_H

#define _smg_H

 

#include

 

typedef unsigned int u16; //对系统默认数据类型进行重定义

typedef unsigned char u8;

 

#define SMG_A_DP_PORT P0 //使用宏定义数码管段码口

 

//定义数码管位选信号控制脚

sbit LSA=P2^2;

sbit LSB=P2^3;

sbit LSC=P2^4;

 

extern u8 gsmg_code[17];

void smg_display(u8 dat[],u8 pos);

void delay_10us(u16 ten_us);

#endif

 


运行结果:


从十一时十一分十一秒开始的。

推荐阅读

史海拾趣

HiRel Connectors Inc公司的发展小趣事
避免频繁开关摄像头和电源设备以减少对电路的冲击和损耗。
Amerace Electronic Components公司的发展小趣事

Amerace Electronic Components公司自成立以来,一直致力于电子元件的技术创新。在早期的发展阶段,公司投入大量资源进行研发,成功推出了一系列具有创新性的电子元件产品,如高精度电阻器和电容器。这些产品在市场上获得了广泛的认可,为公司赢得了良好的声誉。随着技术的不断进步,Amerace持续引领行业创新,为电子行业带来了更多高性能、高可靠性的元件产品。

Bipolar Integrated Technology Inc公司的发展小趣事

在市场竞争日益激烈的情况下,BIT意识到只有不断创新才能在行业中立足。于是,他们加大了在研发方面的投入,不断推出具有创新性的产品。其中,一款高性能、低功耗的双极型处理器成为了市场上的热销产品,引领了行业潮流。

BK Precision公司的发展小趣事

为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。

HDP_Power公司的发展小趣事

BK Precision公司的历史可以追溯到1951年,当时它由创始人Carl Korn在美国加利福尼亚州的约巴琳达创立。起初,公司主要关注于电视维修服务,很快就因在电视配件测试设备方面的创新而获得了市场认可。Korn先生对于简易测试电视配件设备的追求,使得映像管再生器和真空管测试器等产品迅速在电子服务行业中赢得了口碑。这一阶段的成功为BK Precision日后的发展奠定了坚实的基础。

Galaxy Semi-Conductor Co Ltd公司的发展小趣事

山西飞虹激光科技有限公司于2010年在中国山西成立,并迅速在北京设立分公司,将北京作为战略重心,拓展全国市场。仅两个月后,飞虹激光的研发&生产中心便设立并投入生产,展现了公司的强大执行力和决心。2012年,飞虹激光积极参与国际展会,如慕尼黑上海光博会,展示了其F3015激光切割机、激光熔覆系统等高端产品,不仅提升了公司知名度,也彰显了其在激光技术领域的专业水平和创新能力。

问答坊 | AI 解惑

S 1131 系列

本问将很详细的介绍S 1131 系列的单片机的内容是一本很详细的参考资料…

查看全部问答>

毕业设计分享【一起学习吧】

发几个毕业设计上来,大家一起学习一下吧 [ 本帖最后由 open82977352 于 2010-1-14 11:10 编辑 ]     …

查看全部问答>

请问,三极管参数里的“耐压”和“功率”是什么意思?

前几天做实验,想买个三极管,但是看到这参数,不知道什么意思,有谁能告诉我的,详细一点的,还有,那个功率,是不是说三极管本身会耗功率啊?谢谢! 型 号 耐压(V) 电流(A) 功率(W) 型 号 耐压(V) 电流(A) 功率(W) B857 70V 4A 40W BU2508A 150 ...…

查看全部问答>

如何让单片机通过互联网控制???请高手指点.

今天做了一个东东...使用了周立功的ZNE10T串口转以太网模块..(该模块有IP协议栈) 实现了局域网的控制.... 但能不能实现外网的控制呢?(就是在远程通过别的PC机利用以太网控制) 请高手指点.... 上位机该怎样写呢?…

查看全部问答>

如何用c#实现wince4.2窗口最大化(隐藏任务栏),谢谢大家!!!

如何用c#实现wince4.2窗口最大化(隐藏任务栏),谢谢大家!!!…

查看全部问答>

LED光源技术在DLP拼接墙中应用的现状和前景深入分析

国内数字背投影显示墙市场已经经历了长达10年的高速增长。目前市场规模已攀升到40亿元人民币每年以上。而据预测,未来五年内该产业依然能保持年均30%以上的增长速率,并逐步实现市场规模化、品牌集中化。     数字背投影显示墙产品市场 ...…

查看全部问答>

在IAR中怎样看程序的运行时间

怎样在IAR调试环境中看程序的运行时间呢?比如我想看一段程序的花费时间,在IAR中怎样设置呢?请各位指教,谢谢。…

查看全部问答>

新设计的MP3开发板

在LPC11U14没有出现之前用LPC1114设计的MP3开发板,在LPC11U14出现后感觉没有必要使用LPC1114,所以一直没有大样,现在秀秀图吧。。。。。。。。。。。。。。                     & ...…

查看全部问答>

苛刻环境下的产品系列-高温产品 2

设计考虑因素德州仪器高可靠性(HiRel)开发小组提供了许多不同的用于恶劣环境下的半导体产品。许多应用都要求电子器件能够在户外使用,工作在典型的工业温度范围内,甚至有时会超出了-55℃至+125℃的军用温度标准范围。这些应用都具有限定条件及封装 ...…

查看全部问答>

大家帮忙翻译一下ADI实验室电路下载资料的标题,感谢哈

1、Broadband, Low Error Vector Magnitude (EVM) Direct Conversion Transmitter Using LO Divide-by-2 Modulator (CN0311) 2、High Accuracy Multichannel Thermocouple Measurement Solution (CN0172) …

查看全部问答>