DS1302n25q128读不出数据据

k2 为减 1 键、k3 为切换时间与闹钟键、k4 为 ...//读写信号线 //DS1302 时钟芯片与 C51 之间的引脚...8 位数据 write_1602com(0x0c);//开显示不显示...
{ unsigned char i, CE=0; //CE引脚为低,数据传送中止 SCLK=0; //...先读时间,只要时间不是00 00和85 85那就读RAM //DS1302初始化,开启时钟 ...
从 1302 读一个字节数据 入口参数:x ***/ unsigned char Read1302(void) {...(0x8E,0x80); } //如果不想每次都初始化时间,也就是掉电后还想让时钟...
补充,写一个字节函数,和读一个字节函数是最基础和最重要的函数,不允许有错误出现,不然的话,一切的设定都徒劳无功。 //模拟BURST函数,读取数据|时间 voidDS1302...
DS1302 读取数据 _nop_(); SCLK = 0; _nop_(); } for (n=0; n&8..._nop_(); } RST = 0; _nop_(); //以下为 DS1302 复位的稳定时间,...
DS1302 时钟|日期|控制|爆发寄存器 在介绍 DS1302 的时序图中不都是,先地址...} //返回数据 这是读一个字节的函数,带 unsigned char 返回型,但仅有一个参数...
时间的寄存器共有12个, 其中有7个寄存器 (读时81h...是逻辑1,如果它为0,则不能把 数据写入到 DS1302...
void StopTime() { second = BCD2HEX(Time[0]=ReadDS)); Write...时间、日期数据写入这几个寄存器,然后再不断地读取这几个寄存器来获取实时时间和...
对长时间的连续测控系统结果的分析以及对异常数据出现...则不能把数据写入到 DS1302 中位 6 如果为 0,...当 供电. 下面给出读 DS1302 时的 MCS51 汇编...
时间的寄存器共有12个, 其中有7个寄存器 (读时81h...是逻辑1,如果它为0,则不能把 数据写入到 DS1302...2017年6月 VC/MFC大版内专家分月排行榜第二2017年5月 VC/MFC大版内专家分月排行榜第二2017年1月 VC/MFC大版内专家分月排行榜第二2016年11月 VC/MFC大版内专家分月排行榜第二2016年4月 VC/MFC大版内专家分月排行榜第二2014年11月 VC/MFC大版内专家分月排行榜第二2014年1月 VC/MFC大版内专家分月排行榜第二2013年10月 VC/MFC大版内专家分月排行榜第二2013年9月 VC/MFC大版内专家分月排行榜第二2013年6月 VC/MFC大版内专家分月排行榜第二2013年4月 VC/MFC大版内专家分月排行榜第二2012年6月 VC/MFC大版内专家分月排行榜第二
2017年4月 VC/MFC大版内专家分月排行榜第三2016年12月 VC/MFC大版内专家分月排行榜第三2016年10月 VC/MFC大版内专家分月排行榜第三2016年2月 VC/MFC大版内专家分月排行榜第三2015年10月 VC/MFC大版内专家分月排行榜第三2015年7月 VC/MFC大版内专家分月排行榜第三2012年10月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。DS1302数据读写时序图
在电子工程世界为您找到如下关于“DS1302数据读写时序图”的新闻
DS1302数据读写时序图资料下载
DS1302数据读写时序图...
实验板介绍.pdf
第三篇 基于Mini51板和ADC0809的多路数据采集系统设计.pdf
第二篇 Mini51板CPLD接口设计及数码管编程驱动.pdf
第四篇 Mini51板RTC设计.pdf
├─Mini51板测试程序
├─DS1302+LCD实时时钟...
4、 编写程序在6个数码管上滚动显示数字
5、 重点讲解动态显示,保持时间,以及扫描频率对闪烁和亮暗程度的影响。
第五讲:键盘检测原理(比较复杂)
1、 键盘作用,检测原理,如何消抖,独立键盘检测程序编写。
2、 矩阵键盘检测程序编写,涉及到返回值函数调用。
第六讲:1602液晶的使用
1、 看手册,管脚、写指令和数据、时序图。
2、 编写程序...
DS1302数据读写时序图相关帖子
”还是“数据字节”,都是在SCLK的上升沿被采集的。(数据都是从最低位开始发送至最高位结束)
& & 接下来是读操作时序图
读操作基本上和写操作的时序图差不多,区别的地方就是在第二个字节时 “读的数据” 的动作。 第二字节读数据开始时, SCLK 信号都是 “下降沿有效” 。
& & 并且CE信号都是处于高电平状态的,所以在对DS1302进行读写...
—5-354.9STC15F2K60S24.5-5.560K通道—2有主—1K—5-354.9STC15W408S2.5-5.58K512T0-T2——1—主从有5K——3.0表格说明:1. 型号为IAP开头的单片机可以在程序运行过程中由程序修改或者擦除整个FLASH程序存储区,让传统的只读程序存储器变成了可读写程序存储器,程序运行过程中写入FLASH的数据与程序一样,具有掉电不丢失的功能,表中EEPROM为IAP的表示EEPROM使用FLASH...
DS1302以及数码管如何跟单片机连接,很容易充程序中看出。
谢谢楼主,最近正在搞这个,显示搞定了,就是温度传感器时序要求太小正在头疼!
18B20的读写时序要求比较严格,这个时序在keil里面仿真可以看到,我用的是12M晶振。祝你成功! 回复 4楼 jinkaiuse 的帖子 谢谢 回复 5楼 dige 的帖子 我正在做下位机和PC机的通信,要求将这个温度传到PC机并保存起来,以便以后调用,用什么编...
&& 遇到一个奇怪的事情,开发板上的读取DS1302的时序与datasheet上的不一致,却能正常读写;我按照我的理解改写后,确不能读写。具体如下:
&& 1.& 该图是DS1302的读时序,可以看到数据是下降沿后输出。也就是在SCLK下降沿后,I/O上输出串行数据,该数据需要单片机对其接收。对于这种方式,用一种不太恰当的说法就是...
为编程语言,开发环境为KEIL&uv3。至于为什么选用C语言开发,好处不言而喻,开发速度快,效率高,代码可复用率高,结构清晰,尤其是在大型的程序中,而且随着编译器的不断升级,其编译后的代码大小与汇编语言的差距越来越小。而关于C语言和汇编之争,就像那个啥,每隔一段时间总会有人挑起这个话题,如果你感兴趣,可以到网上搜索相关的帖子自行阅读。不是说汇编不重要,在很多对时序要求非常高的场合,需要...
quartus ii 9.0做仿真时,为什么功能仿真是完全正确的,而时序仿真就乱了呢?是时钟设置出了问题还是其他原因呢…… 求老师指点…… 请教夏老师一个关于quartus仿真的问题! 当我用DSP+CPLD中的CPLD作为扩展外设的译码器时当片选到该外设时可以从数据总线读到外设发来的数据,但是我发下去的却是我刚刚读上来的数据,而不是我要发下去的数据,已排除硬件问题,和DSP的问题,怀疑是读写控制...
); send_data(8,buf); //U8 STCP = 1;_nop_();STCP = 0;_nop_(); //数据锁存} 这段程序调试成功了以后就能够在每个辉光管上显示任意字符了,有模有样的效果出来啦,SHOW一下:
七、编写DS1302时钟芯片读写程序 & DS1302也是很常用的一款时钟芯片,外围元器件非常少,仅一个电池,一颗晶体,一颗电容即可,通过3线与MCU通讯, 具体介绍网上一...
,RST要保持高电平,一次字节读写完毕之后,要注意把RST返回低电平准备下次读写周期;
SINGLE BYTE READ:单字节读,注意读之前还是要先对寄存器写命令,从最低位开始写;大家细心看可以看到,写数据是在SCLK的上升沿实现,而读数据在SCLK的下降沿实现,所以,在单字节读时序中,写命令的第八个上升沿结束后紧接着的第八个下降沿就将要读寄存器的第一位数据读到数据线上了!这个就是DS1302操作...
25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
IIC总线操作方法:
IIC总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。笔者分别配合时序图来说明...
1.29 小间距元件的修理418
1.30 新型器件线性与或门的应用418
1.31 CMOS门电路多余引脚的连接418
1.32《无线电》常用电气图用图形符号及文字符号
1.33 可控硅符号418
1.34 电容器的种类与符号418
1.35 电容器外壳上的文字符号418
1.36 固定电阻的主要参数418
二、数据采集与前向通道接口技术419
2.1 提高计算机...
DS1302数据读写时序图视频
你可能感兴趣的标签
热门资源推荐STM8对DS1302读取的数据总是85,已加10K上拉,求指导 - STM8 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 2923|回复: 6
STM8对DS1302读取的数据总是85,已加10K上拉,求指导
在线时间2 小时
主题帖子好友
新手上路, 积分 31, 距离下一级还需 19 积分
新手上路, 积分 31, 距离下一级还需 19 积分
/* MAIN.C file
* Copyright (c)
STMicroelectronics
#include &stm8s003f3.h&
// - - 定义函数
#define BIAS& &0x52& && && && &//0b10&&1/3duty 4com
#define SYSDIS 0X00& && && &&&//0b00&&关振系统荡器和LCD偏压发生器
#define SYSEN&&0X02& && && &&&//0b10 打开系统振荡器
#define LCDOFF 0X04& && && &&&//0b00&&关LCD偏压
#define LCDON&&0X06& && && &&&//0b10&&打开LCD偏压
#define XTAL& &0x28& && && &&&//0b00 外部接时钟
#define RC256&&0X30& && && &&&//0b00&&内部时钟
#define TONEON&&0X12& && && &&&//0b10&&打开声音输出
#define TONEOFF 0X10& && && &&&//0b00 关闭声音输出
#define WDTDIS&&0X0A& && &&&//0b10&&禁止看门狗
#define WDTDIS&&0X0A
unsigned int b,v,v1,i,miao,fen,shi,e,f,
unsigned char m,n,m1,n1,
unsigned int flag,year,month,day,hour,min,a,keytime,
unsigned char
Ht1621wTab[]={0x0b,0x00,0x07,0x05,0x0c,0x0d,0x0f,0x00,0x0f,0x0d};& & & & //seg 16
unsigned char
Ht1621cTab[]={0x0f,0x07,0x0d,0x0f,0x07,0x0b,0x0b,0x0f,0x0f,0x0f};&&//seg 17
unsigned char
Ht1621dTab[]={0x0e,0x06,0x0c,0x0e,0x06,0x0a,0x0a,0x0e,0x0e,0x0e};&&//seg 17&&
unsigned char
Ht1621eTab[]={0x00,0x0a,0x0d,0x0e};
_Bool CS @PC_ODR:5;
_Bool WR @PC_ODR:6;
_Bool DAT @PC_ODR:7;
_Bool SCLK @PD_ODR:4;
_Bool SDA @PD_ODR:5;
_Bool RST @PD_ODR:6;
_Bool k1 @PB_IDR:4;
_Bool k2 @PC_IDR:3;
_Bool k3 @PC_IDR:4;
//HT1621控制位(液晶模块接口定义,根据自已的需要更改)
#define CLS_HT_WR& && &WR = 0& &//拉低
#define SET_HT_WR& && &WR = 1& &//拉高
#define CLS_HT_CS& && &CS = 0& &//拉低
#define SET_HT_CS& && &CS = 1& &//拉高&&
#define SET_HT_DAT& &&&DAT= 1& &//数据位
#define CLS_HT_DAT& &&&DAT = 0& &//数据位
//GPIO口设置
void port_init(void)
PB_DDR |= 0x20;
PB_CR1 |= 0x20;
PB_CR2 |= 0x00;
PD_DDR |= 0x74;
PD_CR1 |= 0x04;
PD_CR2 |= 0x00;
PC_DDR |= 0xe0;
PC_CR1 |= 0xe0;
PC_CR2 |= 0x00;
void Init(void)
//&&CLK_ICKR |= 0x01;& && && && && &&&//打开内部高速RC
& &//CLK_CKDIVR = 0x10;& && && && && & //HSI--4MHZ
& & & &&&CLK_CKDIVR = 0x00;
//-----------------------------------------------------------------------------------------
//函数名称:Delay()
//功 能:延时子程序
//-----------------------------------------------------------------------------------------
void Delay(char us) //5,7,9
while(--us);
//-----------------------------------------------------------------------------------------
//函数名称:DelayMS()
//功 能:延时子程序
//-----------------------------------------------------------------------------------------
void DelayMS(int iMs)
for(i=0;i&iMs;i++)
for(j=0;j&65;j++)
void writebyb(unsigned char temp)
& & & & & & & &
& & & & & & & & SCLK=0;
& & & & & & & & Delay(20);
& & & & & & & & for(i=0;i&8;i++)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & SDA=temp&0x01;
& & & & & & & & & & & & & & & & Delay(5);
& & & & & & & & & & & & & & & & SCLK=1;
& & & & & & & & & & & & & & & & Delay(5);
& & & & & & & & & & & & & & & & SCLK=0;
& & & & & & & & & & & & & & & & temp&&=1;
& & & & & & & & & & & & }
void write(unsigned char adress,unsigned char dat)
& & & & & & & & RST=0;
& & & & & & & & SCLK=0;
& & & & & & & & RST=1;
& & & & & & & & Delay(20);
& & & & & & & & writebyb(adress);
& & & & & & & & writebyb(dat);
& & & & & & & & SCLK=1;
& & & & & & & & RST=0;
unsigned char readbybe(void)
& & & & unsigned i,
& & & & Delay(2);
& & & & for(i=0;i&8;i++)
& & & & & & & & {
& & & & & & & & & & & & dat&&=1;
& & & & & & & & & & & & if(SDA==1)
& & & & & & & & & & & & {
& & & & & & & & & & & & dat|=0x80;
& & & & & & & & }
& & & & & & & & else
& & & & & & & & dat&=0x7f;
& & & & & & & & & & & & SCLK=1;
& & & & & & & & & & & & Delay(5);
& & & & & & & & & & & & SCLK=0;
& & & & & & & & & & & & Delay(5);
& & & & & & & & }
& & & & & & & &
unsigned char read(unsigned char adress)
& & & & RST=0;
& & & & SCLK=0;
& & & & RST=1;
& & & & Delay(1);
& & & & writebyb(adress);
& & & & temp=readbybe();
& & & & & & & & SCLK=1;
& & & & & & & & RST=0;
& & & & & & & & SDA=0;
& & & & & & & &
void ds1302(void)
& & & & write(0x8e,0x00);
& & & & write(0x80,((0/10)&&4|(0%10)));& &//根据写秒寄存器命令字,写入秒的初始值
& & & & write(0x82,((0/10)&&4|(0%10)));& &//根据写分寄存器命令字,写入分的初始值
& & & & write(0x84,((12/10)&&4|(12%10))); //根据写小时寄存器命令字,写入小时的初始值
& & & & write(0x86,((16/10)&&4|(16%10))); //根据写日寄存器命令字,写入日的初始值
& & & & write(0x88,((11/10)&&4|(11%10))); //根据写月寄存器命令字,写入月的初始值
& & & & write(0x8c,((8/10)&&4|(8%10)));& &//根据写小时寄存器命令字,写入小时的初始值
& & & & write(0x8e,0x80);
void settime(void)
& & & & & & & & unsigned char ReadV
& & & &&&ReadValue = read(0x81);& &//从秒寄存器读数据
& &&&miao=((ReadValue&0x70)&&4)*10 + (ReadValue&0x0F);//将读出数据转化& && &&&
& &ReadValue = read(0x83);&&//从分寄存器读
& &&&min=((ReadValue&0x70)&&4)*10 + (ReadValue&0x0F); //将读出数据转化
& &&&ReadValue = read(0x85);&&//从分寄存器读
& &&&hour=((ReadValue&0x70)&&4)*10 + (ReadValue&0x0F); //将读出数据转化
& &&&ReadValue = read(0x87);&&//从分寄存器读
& &&&day=((ReadValue&0x70)&&4)*10 + (ReadValue&0x0F); //将读出数据转化
& &ReadValue = read(0x89);&&//从分寄存器读
& &&&month=((ReadValue&0x70)&&4)*10 + (ReadValue&0x0F); //将读出数据转化
& &ReadValue = read(0x8d);&&//从分寄存器读
& &&&year=((ReadValue&0x70)&&4)*10 + (ReadValue&0x0F); //将读出数据转化
------------------------------------------------------------------------------------
void Ht1621_Init(void)
SET_HT_CS;//HT1621_CS=1;
SET_HT_WR;//HT1621_WR=1;
SET_HT_DAT;//HT1621_DAT=1;
DelayMS(20); //延时使LCD工作电压稳定
Ht1621WrCmd(BIAS);
Ht1621WrCmd(RC256); //使用内部振荡器
Ht1621WrCmd(SYSDIS);
Ht1621WrCmd(WDTDIS);
Ht1621WrCmd(SYSEN);
Ht1621WrCmd(LCDON);
Ht1621WrCmd(TONEON);
Ht1621WrCmd(TONEOFF);
void dispaytemp(int a)
& & & & int ge,shi,
& & & & bai=a/100;
& & & & shi=(a-bai*100)/10;
& & & & ge=a%10;
& & & & Ht1621WrOneData(0x16,Ht1621wTab[bai]);
& & & & Ht1621WrOneData(0x15,Ht1621cTab[bai]);
& & & & Ht1621WrOneData(0x14,Ht1621wTab[shi]);
& & & & Ht1621WrOneData(0x13,Ht1621cTab[shi]);
& & & & Ht1621WrOneData(0x12,Ht1621wTab[ge]);
& & & & Ht1621WrOneData(0x11,Ht1621cTab[ge]);
void dispaytime(int b)
& & & & int fge,fshi,sge,
& & & & fshi=b/10;
& & & & fge=b%10;
& & & & Ht1621WrOneData(0x08,Ht1621cTab[fge]);
& & & & Ht1621WrOneData(0x09,Ht1621wTab[fge]);
& & & & Ht1621WrOneData(0x0a,Ht1621dTab[fshi]);
& & & & Ht1621WrOneData(0x0b,Ht1621wTab[fshi]);
void dispaytime2(int c,int d)
& & & & int fge,fshi,sge,
& & & & fshi=d/10;
& & & & fge=d%10;
& & & & sshi=c/10;
& & & & sge=c%10;
& & & & Ht1621WrOneData(0x08,Ht1621cTab[fge]);
& & & & Ht1621WrOneData(0x09,Ht1621wTab[fge]);
& & & & Ht1621WrOneData(0x0a,Ht1621cTab[fshi]);
& & & & Ht1621WrOneData(0x0b,Ht1621wTab[fshi]);
& & & & Ht1621WrOneData(0x0c,Ht1621cTab[sge]);
& & & & Ht1621WrOneData(0x0d,Ht1621wTab[sge]);
& & & & Ht1621WrOneData(0x0e,Ht1621eTab[sshi]);
void dispaynian(int nian,int yue,int ri)
& & & & int niange,nianshi,rige,rishi,yueshi,
& & & & nianshi=nian/10;
& & & & niange=nian%10;
& & & & yueshi=yue/10;
& & & & yuege=yue%10;
& & & & rishi=ri/10;
& & & & rige=ri%10;
& & & & Ht1621WrOneData(0x1e,Ht1621cTab[nianshi]);
& & & & Ht1621WrOneData(0x1f,Ht1621wTab[nianshi]);
& & & & Ht1621WrOneData(0x1c,Ht1621cTab[niange]);
& & & & Ht1621WrOneData(0x1d,Ht1621wTab[niange]);
& & & & Ht1621WrOneData(0x19,Ht1621eTab[rishi]);
& & & & Ht1621WrOneData(0x17,Ht1621cTab[rige]);
& & & & Ht1621WrOneData(0x18,Ht1621wTab[rige]);
& & & & if(yueshi==1)
& & & & & & & & & & & & Ht1621WrOneData(0x1a,Ht1621cTab[yuege]);
& & & & & & & & & & & & Ht1621WrOneData(0x1b,Ht1621wTab[yuege]);
& & & & else
& & & & & & & & & & & & Ht1621WrOneData(0x1a,Ht1621dTab[yuege]);
& & & & & & & & & & & & Ht1621WrOneData(0x1b,Ht1621wTab[yuege]);
void CLK_Init(void)
& & & & CLK_CKDIVR = 0x00;
void di(void)//蜂鸣器
& & & & Ht1621WrCmd(TONEON);
& & & & DelayMS(2000);
& & & & Ht1621WrCmd(TONEOFF);
void main( void )
& & & & ADC_Init();
& & & & ADC_CR1|=0x01;
& & & & _asm(&sim&);
& & & & CLK_Init();
& & & & TIM1_Init();
& & & & _asm(&rim&);
Init(); //时钟初始化
port_init();//GPIO初始化
Ht1621_Init(); //上电初始化LCD
DelayMS(50); //延时一段时间
Ht1621WrAllData();
& & & & & & & && &dispaytemp(b);
& & & & & & & & & & & & key();
& & & & & & & & & & & & settime();
在线时间196 小时
主题帖子好友
金牌会员, 积分 2655, 距离下一级还需 2345 积分
金牌会员, 积分 2655, 距离下一级还需 2345 积分
没搞过,帮顶……
在线时间2 小时
主题帖子好友
新手上路, 积分 31, 距离下一级还需 19 积分
新手上路, 积分 31, 距离下一级还需 19 积分
多谢......
在线时间248 小时
ST金币2334
主题帖子好友
金牌会员, 积分 3523, 距离下一级还需 1477 积分
金牌会员, 积分 3523, 距离下一级还需 1477 积分
帮顶!!!
在线时间2 小时
主题帖子好友
新手上路, 积分 31, 距离下一级还需 19 积分
新手上路, 积分 31, 距离下一级还需 19 积分
已经折腾1个多月了,
在线时间680 小时
ST金币4402
主题帖子好友
& && && && &&&for(i=0;i&8;i++)
& && && && && && && && &{
& && && && && && && && &&& if(temp&0x01)
& && && && && && && && && && &SDA=1;
& && && && && && && && &&&else
& && && && && && && && && &&&SDA=0;
& && && && && && && && && && & // SDA=temp&0x01;
& && && && && && && && && && &&&Delay(5);
& && && && && && && && && && &&&SCLK=1;
& && && && && && && && && && &&&Delay(5);
& && && && && && && && && && &&&SCLK=0;
& && && && && && && && && && &&&temp&&=1;
& && && && && && && && &}
这个底层操作改这样看看
在线时间4 小时
主题帖子好友
新手上路, 积分 29, 距离下一级还需 21 积分
新手上路, 积分 29, 距离下一级还需 21 积分
#ifndef __DS1302_CONFIG_H__
#define __DS1302_CONFIG_H__
#include &stm8s.h&
#include &delay.h&
//PB4 -&SCLK; PB5 -&IO; PC3 -&CE;
// 1:自动转换成10进制&&0:BCD格式
#define DS1302_AUTO_TO_DEC& && & 1
// 端口控制命令定义
#define DS1302_IO_0& && && && &&&GPIO_WriteLow(GPIOB,GPIO_PIN_5)
#define DS1302_IO_1& && && && &&&GPIO_WriteHigh(GPIOB,GPIO_PIN_5)
#define DS1302_IO_IN& && && && & GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_IN_PU_NO_IT)
#define DS1302_IO_OUT& && && && &GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_OUT_PP_LOW_FAST)
#define DS1302_IO_VALUE& && && & GPIO_ReadInputPin(GPIOB,GPIO_PIN_5)
#define DS1302_SCLK_0& && && && &GPIO_WriteLow(GPIOB,GPIO_PIN_4)
#define DS1302_SCLK_1& && && && &GPIO_WriteHigh(GPIOB,GPIO_PIN_4)
#define DS1302_SCLK_OUT& && && & GPIO_Init(GPIOB,GPIO_PIN_4,GPIO_MODE_OUT_PP_LOW_FAST)
#define DS1302_CE_0& && && && &&&GPIO_WriteLow(GPIOC,GPIO_PIN_3)
#define DS1302_CE_1& && && && &&&GPIO_WriteHigh(GPIOC,GPIO_PIN_3)
#define DS1302_CE_OUT& && && && &GPIO_Init(GPIOC,GPIO_PIN_3,GPIO_MODE_OUT_PP_LOW_FAST)
// 延时时间定义(参照datasheet)
#define DS1302_DELAY_T_DC& && &&&delay_us(1)
#define DS1302_DELAY_T_CDH& && & delay_us(1)
#define DS1302_DELAY_T_CDD& && & delay_us(1)
#define DS1302_DELAY_T_CL& && &&&delay_us(1)
#define DS1302_DELAY_T_CH& && &&&delay_us(1)
#define DS1302_DELAY_T_CC& && &&&delay_us(4)
#define DS1302_DELAY_T_CCH& && & delay_us(1)
#define DS1302_DELAY_T_CWH& && & delay_us(4)
#endif /* __DS1302_CONFIG_H__ */
#ifndef __DS1302_H__
#define __DS1302_H__
#include &ds1302_config.h&
// 寄存器地址定义
#define DS1302_SECOND_ADDR& && && && &&&0x80
#define DS1302_MINUTE_ADDR& && && && &&&0x82
#define DS1302_HOUR_ADDR& && && && && & 0x84
#define DS1302_DATE_ADDR& && && && && & 0x86
#define DS1302_MONTH_ADDR& && && && && &0x88
#define DS1302_DAY_ADDR& && && && && &&&0x8a
#define DS1302_YEAR_ADDR& && && && && & 0x8c
#define DS1302_WRITE_PROTECT_ADDR& && & 0x8e& &&&// 写保护
#define DS1302_TRICKLE_CHARGE_ADDR& && &0x90& &&&// 涓流充电
#define DS1302_CLOCK_BURST_ADDR& && && &0xbe& &&&// 连续读写
#if DS1302_AUTO_TO_DEC == 1
#define DEC_TO_BCD(d) DecToBcd(d)
#define BCD_TO_DEC(b) BcdToDec(b)
#define DEC_TO_BCD(d) d
#define BCD_TO_DEC(b) b
#endif /* DS1302_AUTO_TO_DEC == 1 */
typedef enum
& & _12_hours, _24_hours
}HourMode_t;
typedef enum
& & am, pm
// DS1302日期时间结构
typedef struct
& & unsigned char Y& && && && && &&&// 年 0 - 99
& & unsigned char M& && && && && & // 月 1 - 12
& & unsigned char D& && && && && &&&// 日 1 - 31
& & unsigned char H& && && && && &&&// 时 1 - 12 或 0 - 23
& & unsigned char M& && && && && &// 分 0 - 59
& & unsigned char S& && && && && &// 秒 0 - 59
& & unsigned char D& && && && && && &// 星期 1 - 7 星期天 = 7
& & HourMode_t& & HourM& && && && & // 小时模式 _12_hours 或 _24_hours
& & AM_PM_t& && & AM_PM;& && && && && & // 上午下午标志 12时制时有效 am 或 pm
}DS1302_DateTime_t;
// 更新标记 1:已更新 0:未更新
// 调用 DS1302_GetDateTime 后自动清零
extern volatile unsigned char DS1302_U
/* 存放日期和时间的变量&&
& &执行 DS1302_GetDateTime 后 时间日期写入到该变量
& &修改此值,并执行 DS1302_SetDateTime, 更新到DS1302& &*/
extern DS1302_DateTime_t DS1302_DateT
extern DS1302_DateTime_t DS1302_DateTime_N
void DS1302_Init(void);
// 读取日期和时间, DS1302 -& DS1302_DateTime& && && &&&
void DS1302_GetDateTime(void);
// 设置日期和时间, DS1302_DateTime -& DS1302
void DS1302_SetDateTime(void);
// 扫描(轮询)函数, 扫描频率应大于1Hz
void DS1302_Scan(void);
void DS1302_SetDataTimeInit(void);
#endif /* __DS1302_H__ */
#include &ds1302.h&
volatile unsigned char DS1302_Update = 0;
DS1302_DateTime_t DS1302_DateT
DS1302_DateTime_t DS1302_DateTime_N
static unsigned char GetDayFromDate(unsigned char year, unsigned char month, unsigned char date);
// 发送一个字节,不操作CE
static void DS1302_TxByte(unsigned char byte)
& & unsigned char i = 0;
& & DS1302_IO_OUT;
& & for (i = 0; i & 8; i++)
& && &&&DS1302_SCLK_0;
& && &&&DS1302_DELAY_T_CL;
& && &&&if (byte & 0x01)
& && && && &DS1302_IO_1;
& && &&&else
& && && && &DS1302_IO_0;
& && &&&DS1302_DELAY_T_DC;
& && &&&DS1302_SCLK_1;
& && &&&DS1302_DELAY_T_CH;
& && &&&byte &&= 1;
// 接收一个字节,不操作CE
static unsigned char DS1302_RxByte(void)
& & unsigned char i = 0;
& & unsigned char byte = 0;
& & DS1302_IO_IN;
& & DS1302_IO_1;
& & for (i = 0; i & 8; i++)
& && &&&DS1302_SCLK_0;
& && &&&DS1302_DELAY_T_CDD;
& && &&&byte &&= 1;
& && &&&if (DS1302_IO_VALUE)
& && && && &byte |= 0x80;
& && &&&DS1302_SCLK_1;
& && &&&DS1302_DELAY_T_CH;
static void DS1302_WriteByte(unsigned char address, unsigned char _data)
& & DS1302_SCLK_0;
& & DS1302_CE_1;
& & DS1302_DELAY_T_CC;
& & DS1302_TxByte(address);
& & DS1302_TxByte(_data);
& & DS1302_SCLK_0;
& & DS1302_DELAY_T_CCH;
& & DS1302_CE_0;
& & DS1302_DELAY_T_CWH;
static unsigned char DS1302_ReadByte(unsigned char address)
& & unsigned char _data = 0;
& & DS1302_SCLK_0;
& & DS1302_CE_1;
& & DS1302_DELAY_T_CC;
& & DS1302_TxByte(address | 0x01);
& & _data = DS1302_RxByte();
& & DS1302_SCLK_0;
& & DS1302_DELAY_T_CCH;
& & DS1302_CE_0;
& & DS1302_DELAY_T_CWH;
& & return _
#if DS1302_AUTO_TO_DEC == 1
static unsigned char DecToBcd(unsigned char d)
& & return ((((d) / 10) && 4) + ((d) % 10));
static unsigned char BcdToDec(unsigned char b)
& & return ((((b) && 4) * 10) + ((b) & 0x0f));
#endif /* DS1302_AUTO_TO_DEC == 1 */
void DS1302_SetDateTime(void)
& & unsigned char temp = 0;
& & DS1302_WriteByte(DS1302_WRITE_PROTECT_ADDR, 0x00);& && && &// 关闭写保护
& & DS1302_WriteByte(DS1302_YEAR_ADDR,& &DEC_TO_BCD(DS1302_DateTime.Year));
& & DS1302_WriteByte(DS1302_MONTH_ADDR,&&DEC_TO_BCD(DS1302_DateTime.Month));
& & DS1302_WriteByte(DS1302_DATE_ADDR,& &DEC_TO_BCD(DS1302_DateTime.Date));
& & DS1302_WriteByte(DS1302_MINUTE_ADDR, DEC_TO_BCD(DS1302_DateTime.Minute));
& & DS1302_WriteByte(DS1302_SECOND_ADDR, DEC_TO_BCD(DS1302_DateTime.Second));
& & DS1302_WriteByte(DS1302_DAY_ADDR,& & DEC_TO_BCD(GetDayFromDate(DS1302_DateTime.Year, DS1302_DateTime.Month, DS1302_DateTime.Date)));
& & temp = DEC_TO_BCD(DS1302_DateTime.Hour);
& & if (DS1302_DateTime.HourMode == _12_hours)
& && &&&temp |= 0x80;
& && &&&temp |= (DS1302_DateTime.AM_PM == pm ? 0x20 : 0);
& & DS1302_WriteByte(DS1302_HOUR_ADDR, temp);
& & DS1302_WriteByte(DS1302_WRITE_PROTECT_ADDR, 0x80);& && && &// 写入完毕后设置写保护
void DS1302_GetDateTime(void)
& & unsigned char temp = 0;
& & DS1302_Update = 0;
& & DS1302_DateTime_Now.Year& &= BCD_TO_DEC(DS1302_ReadByte(DS1302_YEAR_ADDR));
& & DS1302_DateTime_Now.Month&&= BCD_TO_DEC(DS1302_ReadByte(DS1302_MONTH_ADDR));
& & DS1302_DateTime_Now.Date& &= BCD_TO_DEC(DS1302_ReadByte(DS1302_DATE_ADDR));
& & DS1302_DateTime_Now.Hour& &= BCD_TO_DEC(DS1302_ReadByte(DS1302_HOUR_ADDR));
& & DS1302_DateTime_Now.Minute = BCD_TO_DEC(DS1302_ReadByte(DS1302_MINUTE_ADDR));
& & DS1302_DateTime_Now.Second = BCD_TO_DEC(DS1302_ReadByte(DS1302_SECOND_ADDR));
& & DS1302_DateTime_Now.Day& & = BCD_TO_DEC(DS1302_ReadByte(DS1302_DAY_ADDR));
& & temp = DS1302_ReadByte(DS1302_HOUR_ADDR);
& & if (temp & 0x80)
& && &&&DS1302_DateTime_Now.HourMode = _12_
& && &&&DS1302_DateTime_Now.AM_PM = ((temp & 0x20) ? pm : am);
& && &&&temp &= 0x1f;
& & DS1302_DateTime_Now.Hour = BCD_TO_DEC(temp);
void DS1302_Scan(void)
& & static unsigned second_last = 0;
& & DS1302_DateTime.Second = BCD_TO_DEC(DS1302_ReadByte(DS1302_SECOND_ADDR));
& & if (second_last != DS1302_DateTime.Second)
& && &&&second_last = DS1302_DateTime.S
& && &&&DS1302_Update = 1;
void DS1302_Init(void)
& & // 端口初始化
& & DS1302_CE_0;
& & DS1302_CE_OUT;
& & DS1302_SCLK_0;
& & DS1302_SCLK_OUT;
& & DS1302_WriteByte(DS1302_WRITE_PROTECT_ADDR, 0x00);& && &&&// 关闭写保护
& & DS1302_WriteByte(DS1302_TRICKLE_CHARGE_ADDR, 0xa7);& && & // 使能涓流充电 1 Diode, 8kΩ
& & if (DS1302_ReadByte(DS1302_SECOND_ADDR) & 0x80)& && && &&&// 振荡器未启动
& && &&&DS1302_WriteByte(DS1302_SECOND_ADDR, 0x00);& && && &&&// 启动振荡器
& & DS1302_WriteByte(DS1302_WRITE_PROTECT_ADDR, 0x80);& && &&&// 打开写保护
// 计算年任一天星期几
// year& && &&&: 00-99
// month& && & : 01-12
// day& && && &: 01-31
// 返回 1 -& 7 : 星期一 -& 星期天
static unsigned char GetDayFromDate(unsigned char year, unsigned char month, unsigned char date)
& & if (month == 1 || month == 2)
& && &&&month += 12;
& && &&&if (year & 0)
& && && && &year--;
& && &&&else
& && && && &year = 4;
& & return (1 + ((date + 2 * month + 3 * (month + 1) / 5 + year + year / 4) % 7));
void DS1302_SetDataTimeInit(void)
& & & & DS1302_DateTime.Year = 15;
& & & & DS1302_DateTime.Month = 4;
& & & & DS1302_DateTime.Date = 29;
& & & & DS1302_DateTime.Hour = 00;
& & & & DS1302_DateTime.Minute = 58;
& & & & DS1302_DateTime.Second = 00;
& & & & DS1302_DateTime.Day = 2;
& & & & DS1302_DateTime.HourMode = _24_
& & & & DS1302_DateTime.AM_PM =
站长推荐 /2
关于意法半导体MCU交货周期88周、截单等不实传闻,官方表示ST拥有长期生产和供货策略及完善计划,保证正常及后备产能。
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered by}

我要回帖

更多关于 n25q128读不出数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信