NAND,Flash接口的演进史
2023-08-04
很多朋友对ds1302时钟芯片外部电路图,介绍DS1302时钟芯片的电路和程序不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。
DS1302是美国DALLAS公司推出的具有涓流充电能力的低功耗实时时钟芯片。可对年、月、日、周、时、分、秒进行计时,并具有闰年补偿等多种功能。
:1、参考电路
以下参考电路经过实践验证,可以正常工作。
其中,PU151PU153对应DS1302的SCLK、IO、RST引脚,需要连接微处理器(如单片机)的相关引脚。
第8脚加一颗3V备用纽扣电池,主电路断电时时钟仍能继续运行。
:2、参考方案
实践证明,以下两个程序任意一个都可以运行。
2.1 参考流程1
//DS1302设置子程序
#include 'ds1302.h'
sbit sclk=P3^3;//DS1302设置
sbit rst=P3^5;
sbit io=P3^4; //DS1302三引脚定义
unsigned char xdata time[7]={23,1,3,20,5,6,7};//0年1周2月3日4点05分6秒,有符号
unsigned char write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//DS1302写入时间寄存器地址
unsigned char read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};//读取
void write_ds1302_byte(unsigned char dat) //DS1302写字节函数
{
无符号字符i;
for(i=0;i8;i++)
{
slk=0; //下降沿数据有效
io=dat0x01;
数据=数据1;
slk=1;
}
}
void write_ds1302(无符号字符添加,无符号字符数据)
{
首先=0;
诺普();
slk=0;
诺普();
首先=1;
诺普();
write_ds1302_byte(添加);
write_ds1302_byte(dat);//发送地址后立即发送数据,不暂停
首先=0;
诺普();
slk=1;
io=1;
}
无符号字符read_ds1302(无符号字符添加)
{
无符号字符i,dat=0;
首先=0;
诺普();
slk=0;
诺普();
首先=1;
诺普();
write_ds1302_byte(add);//DS1302发送地址后立即发送数据
for(i=0;i8;i++)
{
数据=数据1;
slk=0;
如果(io)
数据=数据|0x80;
slk=1;
}
首先=0;
诺普();
slk=0;
诺普();
slk=1;
io=0; //223-3-20,将1改为0后即可保存数据
返回数据;
}
无效ds1302_init()
{
无符号字符i,j;
for(i=0;i7;i++)
{
j=时间[i]/10;
时间[i]=时间[i]%10;
时间[i]=时间[i]+j*16; //转换为BCD码
}
write_ds1302(0x8e,0x00);//解除写保护
for(i=0;i7;i++)
{
write_ds1302(write_add[i],时间[i]);
}
write_ds1302(0x8e,0x80);//添加写保护}
void read_time()//读取时间
{
无符号字符i;
for(i=0;i8;i++)
{
时间[i]=read_ds1302(read_add[i]);
time[i]=time[i]/16*10+time[i]%16;//将BCD码转换为十进制
}
如果(时间[4]23)时间[4]=23;
如果(时间[5]59)时间[5]=59;
如果(时间[6]59)时间[6]=59;
}
阐明:
如果要读取时间,调用read_time()子程序,将读取到的时钟数据存入time[]数组中;
如果要设置时间,调用ds1302_init()子程序,将要设置的时钟数据预先存放在time[]数组中;
ds1302_init()子程序不能每次开机都运行,只有修改时间时才需要运行。
2.2 参考方案2
#include 'DS1302.h'
#定义uchar无符号字符
#定义uint 无符号整型
//DS1302宏定义部分
#define WRITE_SECOND0x80 //写入第二个地址
#define WRITE_MINUTE0x82 //写入子地址
#define WRITE_HOUR0x84 //写入时的地址
#define WRITE_DATE0x86 //写入日期地址
#define WRITE_MONTH0x88 //写入月份地址
#define WRITE_WEEK0x8A //写入周地址
#define WRITE_YEAR0x8C //写入年份地址
#define WRITE_PROTECT0x8E //写保护
#define READ_SECOND0x81 //倒计时地址
#define READ_MINUTE0x83 //读取地址
#define READ_HOUR0x85 //读取时的地址
#define READ_DATE0x87 //读取日期地址
#define READ_MONTH0x89 //读取月份地址
#define READ_WEEK0x8B //读取周地址
#define READ_YEAR0x8D //读取年份地址
sbit ACC_7=ACC^7; //位寻址寄存器定义
sbit SCLK=P3^3; //DS1302时钟信号引脚6
sbit DIO=P3^4; //DS1302数据信号引脚5
sbit CE=P3^5; //DS1302片选引脚7
uchar xdata time[7]={23,1,3,2,5,6,7}; //依次存储年、月、日、周、时、分、秒,以十进制表示,第2周,2023年1月3日5:6:7
//地址,数据发送子程序
void Write1302(无符号字符地址,dat)
{
无符号字符i,临时; CE=0; //CE引脚为低电平,数据传输暂停SCLK=0; //清除时钟总线CE=1; //CE引脚为高电平,逻辑控制有效//发送地址for ( i=8; i 0; i-- ) //周期8个移位{ SCLK=0;温度=地址; DIO=(位)(temp0x01); //每次传输低字节addr=1; //右移一位SCLK=1; } //发送数据for ( i=8; i 0; i-- ) { SCLK=0;温度=数据; DIO=(位)(temp0x01); //每次发送低字节dat=1; //右移一位SCLK=1; } CE=0; }
//数据读取子程序
无符号字符Read1302(无符号字符地址)
{
无符号字符i,temp,dat1,dat2; CE=0; SCLK=0; CE=1; //发送地址for ( i=8; i 0; i-- ) //周期8 移位{ SCLK=0 ;温度=地址; DIO=(位)(temp0x01); //每次传输低字节addr=1; //右移一位SCLK=1; } //读取数据for ( i=8; i 0 ; i-- ) { ACC_7=DIO; SCLK=1; ACC=1; SCLK=0; }CE=0;数据1=ACC;数据2=数据1/16; //数据转换dat1=dat1%16; //十六进制转十进制dat1=dat1+dat2*10;返回(dat1);}
//初始化DS1302
无效初始DS1302(无效)
{
//初始化为2013年4月24日23:27:56。注意Write1302函数的第二个参数是十六进制,需要从十进制转换为十六进制。比如参数中:秒0X56表示56秒,0X12表示12月,0x23表示23点等等,以下都已转码。
写1302(WRITE_PROTECT,0X00); //禁止写保护Write1302(WRITE_SECOND,time[6]/10*16+time[6]%10); //第二位初始化Write1302(WRITE_MINUTE,time[5]/10*16 +time[5]%10); //分钟初始化Write1302 (WRITE_HOUR,time[4]/10*16+time[4]%10); //小时初始化Write1302(WRITE_YEAR,time[0]/10* 16+time[0]%10); //年份数字初始化Write1302(WRITE_MONTH,time[1]/10*16+time[1]%10); //月份数字初始化
Write1302(WRITE_DATE,时间[2]/10*16+时间[2]%10); //日仓位初始化
Write1302(WRITE_WEEK,时间[3]/10*16+时间[3]%10); //周位初始化
Write1302(WRITE_PROTECT,0x80); //允许写保护}
//读取年、月、日、周、时、分、秒
无效读取时间(无效)
{
时间[0]=Read1302(READ_YEAR); //获取年份
时间[1]=Read1302(READ_MONTH); //获取月份
时间[2]=Read1302(READ_DATE); //获取日期
时间[3]=Read1302(READ_WEEK); //获取星期
时间[4]=Read1302(READ_HOUR); //获取时间
时间[5]=Read1302(READ_MINUTE); //取积分
时间[6]=Read1302(READ_SECOND); //拿
}
////运行read_nyrsfm() 子函数读取数组time[] 并显示它
阐明:
如果要读取时间,调用read_time()子程序,将读取到的时钟数据存入time[]数组中;
如果要设置时间,请调用InitialDS1302()子程序,并将要设置的时钟数据预先存储在time[]数组中。
InitialDS1302()子程序不能每次开机都运行,只有在修改时间时才需要运行。
以上电路和程序已经过实践验证,可以正常运行。
以上知识分享希望能够帮助到大家!
版权声明:本站所有作品图文均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系我们
推荐阅读
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
2023-08-04
栏目热点
NAND,Flash接口的演进史
LilyGoT手表键盘C3迷你电脑套件
索泰ZBOXEdgeCI342迷你电脑正式上市
谷歌在最新的视频预告片中展示了PixelWatch的独特设计
三星与设计师Juun.J合作推出限量版可折叠产品和配件
从2023年起Fitbit设备将需要Google帐户
TOKKCAMC2+智能WiFi独立日 夜视摄像头
三星正在与全球时尚品牌JUUN.J合作
OnePlusNordWatch的颜色选项通过泄露的渲染揭示
就在第一款Nothing手机发布之前一种新的TWS芽设计浮出水面