专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
DS1302做时钟出现的问题,很是纠结
2020-02-02 09:28
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
1570
12
12
秒显示的规律:
00 01 02 03 04
08 09 10 11 12
10 11 12 13 14
18 19 20 21 22
20 21 22 23 24
28 29 30 31 32
然后再循环一次,刚好60次。但是感觉时间显示的是2秒才变一次,ds1302是买的时钟模块,应该没什么问题吧。我把液晶显示器更新时间设置为0.5秒,还是这样。检查了几天了,真不知道这怎么回事。。。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
sakmb
1楼-- · 2020-02-02 14:51
精彩回答 2 元偷偷看……
加载中...
paradisespace
2楼-- · 2020-02-02 16:24
程序是用模块写的
加载中...
paradisespace
3楼-- · 2020-02-02 16:56
sakmb 发表于 2012-5-27 00:44
估计是程序问题,你上程序大家看看那
上传了,显示上有规律,开始以为是进制的转换问题 但是检查又看不出问题来,头都看懵了。
加载中...
jxcylxh
4楼-- · 2020-02-02 19:59
呵呵,这个我刚遇到过,你的程序的读部分有问题,你把读回来的数据分析一下,你肯定多移了一位。还有就是在用的时候加上上拉电阻。
加载中...
paradisespace
5楼-- · 2020-02-02 22:14
#include <intrins.h>
#include "DS1302.h"
/*************************通用宏定义*******************************/
#define DEC2BCD(X) ((X/10)<<4 | (X%10)) //用于将十进制转成BCD码的宏
#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
/***********************变量定义******************************/
unsigned char year,month,day,week,hour,minute,second; //年月日周时分秒变量
/***********************函数定义******************************/
void DS1302_Write_Byte(unsigned char Wdata_temp); //写字节函数
unsigned char DS1302_Read_Byte(void); //读字节函数
void DS1302_Write(unsigned char address,unsigned char dat); //向指定地址写一字节数据函数
unsigned char DS1302_Read ( unsigned char address ); //从指定地址读一字节数据函数
void DS1302_Read_RTC(void); //读取DS1302的时间函数
void DS1302_Set_RTC(void); //设定DS1302的时间函数
void DS1302_Init();
//SCL的上升沿写入数据,下降沿读取数据,数据均是先低位,后高位
/************************************************************
*名称:DS1302_Write_Byte()
*说明:
*功能:向DS1302写一个字节数据
*调用:无
*输入:Wdata_temp
*输出:无
***********************************************************/
void DS1302_Init()
{
DS1302_Write(W_CONTROL,0x00);
year=0x00;
month=0x00;
day=0x00;
hour=0x00;
minute=0x00;
second=0x00;
}
/************************************************************
*名称:DS1302_Write_Byte()
*说明:
*功能:向DS1302写一个字节数据
*调用:无
*输入:Wdata_temp
*输出:无
***********************************************************/
void DS1302_Write_Byte(unsigned char Wdata_temp)
{
unsigned char i;
SCLK=0; //初始时钟线置0
_nop_();_nop_();
for (i=0;i<8;i++) //开始传输8bit数据,循环8次 写入数据
{
SDA=Wdata_temp&0x01; //取出数据的最低位,写入数据线
_nop_();_nop_();
SCLK=1; //时钟线拉高,构成时钟的上升沿
_nop_();_nop_();
SCLK=0; //时钟线拉低,为下一个上升沿做准备
Wdata_temp>>=1; //数据右移一位,准备传输下一位数据
}
}
/************************************************************
*名称: DS1302_Read_Byte()
*说明:
*功能:向DS1302读一个字节数据
*调用:无
*输入:无
*输出: Rdata_temp
***********************************************************/
unsigned char DS1302_Read_Byte(void)
{
unsigned char i;
unsigned char Rdata_temp=0;
for (i=0;i<8;i++) //循环8次 读取数据
{
if(SDA)
Rdata_temp|=0x80; //每次传输低字节
SCLK=1;
_nop_();
SCLK=0;
_nop_();
Rdata_temp>>=1; //右移一位
}
return (Rdata_temp);
}
/************************************************************
*名称:DS1302_Write()
*说明:先写地址,后写数据
*功能:向address相应的地址中写一个字节的数据
*调用:DS1302_Write_Byte()
*输入:address:要写入的地址。dat:要写入的控制字
*输出:无
***********************************************************/
void DS1302_Write(unsigned char address,unsigned char dat)
{
DS1302_RST=0;
_nop_();
SCLK=0;
_nop_();
DS1302_RST=1;
_nop_(); //启动
DS1302_Write_Byte(address); //发送地址
DS1302_Write_Byte(dat); //发送数据
DS1302_RST=0; //恢复
}
/************************************************************
*名称:DS1302_Read()
*说明:先写地址,后读数据
*功能:向address相应的地址中读一个字节的数据
*调用:DS1302_Write_Byte();DS1302_Read_Byte()
*输入:address:要写入的地址。
*输出:dat:读取的数据
***********************************************************/
unsigned char DS1302_Read ( unsigned char address )
{
unsigned char dat=0x00;
DS1302_RST=0;
SCLK=0;
DS1302_RST=1;
_nop_();
DS1302_Write_Byte(address);
dat=DS1302_Read_Byte();
DS1302_RST=0;
_nop_(); //以下为DS1302复位的稳定时间
DS1302_RST=0;
SCLK=0;
_nop_();
SCLK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (dat); //返回
}
/************************************************************
*名称:DS1302_Read_RTC()
*说明:
*功能:读取当前时间 ,同时将读到的BCD码数据转换为十进制
*调用:DS1302_Read();
*输入:
*输出:
***********************************************************/
void DS1302_Read_RTC(void)
{
unsigned char shi,ge;
//读取当前时间值,并将BCD码转换为十进制
//读取秒值
second=DS1302_Read(R_SECOND) & 0x7f; //并将秒的BCD码值转换为十进制值
// second=BCD2DEC(second);
shi=(second>>4);
ge=(second & 0x0f);
second=shi*10+ge;
//相同的操作一次读取分时日月星期年,并将读出的值进行转换
minute=DS1302_Read(R_MINUTE);
minute=BCD2DEC(minute);
hour=DS1302_Read(R_HOUR) & 0x1f;
hour=BCD2DEC(hour);
day=DS1302_Read(R_DAY);
day=BCD2DEC(day);
month=DS1302_Read(R_MONTH);
month=BCD2DEC(month);
week=DS1302_Read(R_WEEK);
year=DS1302_Read(R_YEAR);
year=BCD2DEC(year);
}
//设定DS1302的时间函数
void DS1302_Set_RTC(void)
{
unsigned char ge,shi;
//转换时间设定值为DS1602要求的BCD码值
//调整秒
// second= DEC2BCD(second);
ge=second%10;
shi=second/10;
second=ge+shi*16;
//调整分
minute= DEC2BCD(minute);
//调整时
hour= DEC2BCD(hour);
//调整日
day= DEC2BCD(day);
//调整月
month= DEC2BCD(month);
//调整年
year= DEC2BCD(year);
//设置时间
DS1302_Write(W_CONTROL,0x00); //设置DS1302寄存器允许写入数据
DS1302_Write(W_SECOND,second); //写秒
DS1302_Write(W_MINUTE,minute); //写分
DS1302_Write(W_HOUR,hour); //写小时
DS1302_Write(W_DAY,day); //写日
DS1302_Write(W_MONTH,month); //写月
DS1302_Write(W_WEEK,week); //写星期
DS1302_Write(W_YEAR,year); //写年
DS1302_Write(W_CONTROL,0x80); //设置DS1302寄存器禁止写入数据
}
复制代码
加载中...
millwood0
6楼-- · 2020-02-03 04:08
精彩回答 2 元偷偷看……
加载中...
1
2
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
上传了,显示上有规律,开始以为是进制的转换问题 但是检查又看不出问题来,头都看懵了。
- #include <intrins.h>
- #include "DS1302.h"
- /*************************通用宏定义*******************************/
- #define DEC2BCD(X) ((X/10)<<4 | (X%10)) //用于将十进制转成BCD码的宏
- #define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
- /***********************变量定义******************************/
- unsigned char year,month,day,week,hour,minute,second; //年月日周时分秒变量
- /***********************函数定义******************************/
- void DS1302_Write_Byte(unsigned char Wdata_temp); //写字节函数
- unsigned char DS1302_Read_Byte(void); //读字节函数
- void DS1302_Write(unsigned char address,unsigned char dat); //向指定地址写一字节数据函数
- unsigned char DS1302_Read ( unsigned char address ); //从指定地址读一字节数据函数
- void DS1302_Read_RTC(void); //读取DS1302的时间函数
- void DS1302_Set_RTC(void); //设定DS1302的时间函数
- void DS1302_Init();
- //SCL的上升沿写入数据,下降沿读取数据,数据均是先低位,后高位
- /************************************************************
- *名称:DS1302_Write_Byte()
- *说明:
- *功能:向DS1302写一个字节数据
- *调用:无
- *输入:Wdata_temp
- *输出:无
- ***********************************************************/
- void DS1302_Init()
- {
- DS1302_Write(W_CONTROL,0x00);
- year=0x00;
- month=0x00;
- day=0x00;
- hour=0x00;
- minute=0x00;
- second=0x00;
-
- }
- /************************************************************
- *名称:DS1302_Write_Byte()
- *说明:
- *功能:向DS1302写一个字节数据
- *调用:无
- *输入:Wdata_temp
- *输出:无
- ***********************************************************/
- void DS1302_Write_Byte(unsigned char Wdata_temp)
- {
- unsigned char i;
- SCLK=0; //初始时钟线置0
- _nop_();_nop_();
- for (i=0;i<8;i++) //开始传输8bit数据,循环8次 写入数据
- {
- SDA=Wdata_temp&0x01; //取出数据的最低位,写入数据线
- _nop_();_nop_();
-
- SCLK=1; //时钟线拉高,构成时钟的上升沿
- _nop_();_nop_();
-
- SCLK=0; //时钟线拉低,为下一个上升沿做准备
- Wdata_temp>>=1; //数据右移一位,准备传输下一位数据
- }
- }
- /************************************************************
- *名称: DS1302_Read_Byte()
- *说明:
- *功能:向DS1302读一个字节数据
- *调用:无
- *输入:无
- *输出: Rdata_temp
- ***********************************************************/
- unsigned char DS1302_Read_Byte(void)
- {
- unsigned char i;
- unsigned char Rdata_temp=0;
- for (i=0;i<8;i++) //循环8次 读取数据
- {
- if(SDA)
- Rdata_temp|=0x80; //每次传输低字节
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- Rdata_temp>>=1; //右移一位
- }
- return (Rdata_temp);
- }
- /************************************************************
- *名称:DS1302_Write()
- *说明:先写地址,后写数据
- *功能:向address相应的地址中写一个字节的数据
- *调用:DS1302_Write_Byte()
- *输入:address:要写入的地址。dat:要写入的控制字
- *输出:无
- ***********************************************************/
- void DS1302_Write(unsigned char address,unsigned char dat)
- {
- DS1302_RST=0;
- _nop_();
- SCLK=0;
- _nop_();
- DS1302_RST=1;
- _nop_(); //启动
- DS1302_Write_Byte(address); //发送地址
- DS1302_Write_Byte(dat); //发送数据
- DS1302_RST=0; //恢复
- }
- /************************************************************
- *名称:DS1302_Read()
- *说明:先写地址,后读数据
- *功能:向address相应的地址中读一个字节的数据
- *调用:DS1302_Write_Byte();DS1302_Read_Byte()
- *输入:address:要写入的地址。
- *输出:dat:读取的数据
- ***********************************************************/
- unsigned char DS1302_Read ( unsigned char address )
- {
- unsigned char dat=0x00;
- DS1302_RST=0;
- SCLK=0;
- DS1302_RST=1;
- _nop_();
- DS1302_Write_Byte(address);
- dat=DS1302_Read_Byte();
- DS1302_RST=0;
- _nop_(); //以下为DS1302复位的稳定时间
- DS1302_RST=0;
- SCLK=0;
- _nop_();
- SCLK=1;
- _nop_();
- SDA=0;
- _nop_();
- SDA=1;
- _nop_();
- return (dat); //返回
- }
- /************************************************************
- *名称:DS1302_Read_RTC()
- *说明:
- *功能:读取当前时间 ,同时将读到的BCD码数据转换为十进制
- *调用:DS1302_Read();
- *输入:
- *输出:
- ***********************************************************/
- void DS1302_Read_RTC(void)
- {
- unsigned char shi,ge;
- //读取当前时间值,并将BCD码转换为十进制
- //读取秒值
- second=DS1302_Read(R_SECOND) & 0x7f; //并将秒的BCD码值转换为十进制值
- // second=BCD2DEC(second);
- shi=(second>>4);
- ge=(second & 0x0f);
- second=shi*10+ge;
-
- //相同的操作一次读取分时日月星期年,并将读出的值进行转换
- minute=DS1302_Read(R_MINUTE);
- minute=BCD2DEC(minute);
-
- hour=DS1302_Read(R_HOUR) & 0x1f;
- hour=BCD2DEC(hour);
-
- day=DS1302_Read(R_DAY);
- day=BCD2DEC(day);
-
- month=DS1302_Read(R_MONTH);
- month=BCD2DEC(month);
-
- week=DS1302_Read(R_WEEK);
-
- year=DS1302_Read(R_YEAR);
- year=BCD2DEC(year);
- }
- //设定DS1302的时间函数
- void DS1302_Set_RTC(void)
- {
- unsigned char ge,shi;
- //转换时间设定值为DS1602要求的BCD码值
- //调整秒
- // second= DEC2BCD(second);
- ge=second%10;
- shi=second/10;
- second=ge+shi*16;
- //调整分
- minute= DEC2BCD(minute);
- //调整时
- hour= DEC2BCD(hour);
- //调整日
- day= DEC2BCD(day);
- //调整月
- month= DEC2BCD(month);
- //调整年
- year= DEC2BCD(year);
-
- //设置时间
- DS1302_Write(W_CONTROL,0x00); //设置DS1302寄存器允许写入数据
- DS1302_Write(W_SECOND,second); //写秒
- DS1302_Write(W_MINUTE,minute); //写分
- DS1302_Write(W_HOUR,hour); //写小时
- DS1302_Write(W_DAY,day); //写日
- DS1302_Write(W_MONTH,month); //写月
- DS1302_Write(W_WEEK,week); //写星期
- DS1302_Write(W_YEAR,year); //写年
- DS1302_Write(W_CONTROL,0x80); //设置DS1302寄存器禁止写入数据
- }
复制代码一周热门 更多>