专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
DS1302 读出时间不正确,是什么原因?
2020-01-16 18:27
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
3870
16
16
用STC12C 5412AD 芯片 12 M晶体,程序是用 公版程序,程序用于另一个板子(STC 12C5A62S2 4M)可以正常运行。
现像为: FF 02 FF 09 05 11,FF 02 FF 05 59 最后一位,秒可以读出,最大变化到59 后,就变成7F, 其他位读出不对。
按理接线是对的,驱动也是对的! P1 口有AD转换, 只用P1.0,与P1.1用作AD。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
liyo2012
2020-01-17 16:48
node720 发表于 2017-1-8 09:48
时序不对吧?贴程序看看。
sbit RST = P1^2;
sbit IO = P1^4;
sbit SCK = P1^5;
uchar time_buf[8] = {0x20,0x10,0x0c,0x05,0x0F,0x08,0x55,0x02};//³õ
unsigned char idata Rec_buf[10]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char idata Ctrl_buf[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*****Ôö¼Ó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
void ds1302_init(void) //OK
{
RST=0; //RST½ÅÖõÍ
SCK=0; //SCK½ÅÖõÍ
}
void ds1302_write_byte(uchar addr, uchar d)
{
uchar i;
RST=1; //Æô¶¯DS1302×ÜÏß
//дÈëÄ¿±êµØÖ·£ºaddr
addr = addr & 0xFE; //×îµÍλÖÃÁ㣬¼Ä´æÆ÷0λΪ0ʱд£¬Îª1ʱ¶Á
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
IO=1;
}
else {
IO=0;
}
SCK=1; //²úÉúʱÖÓ
SCK=0;
addr = addr >> 1;
}
//дÈëÊý¾Ý£ºd
for (i = 0; i < 8; i ++) {
if (d & 0x01) {
IO=1;
}
else {
IO=0;
}
SCK=1; //²úÉúʱÖÓ
SCK=0;
d = d >> 1;
}
RST=0; //Í£Ö¹DS1302×ÜÏß
}
//´ÓDS1302¶Á³öÒ»×Ö½ÚÊý¾Ý
uchar ds1302_read_byte(uchar addr) {
uchar i,temp;
RST=1; //Æô¶¯DS1302×ÜÏß
//дÈëÄ¿±êµØÖ·£ºaddr
addr = addr | 0x01; //×îµÍλÖøߣ¬¼Ä´æÆ÷0λΪ0ʱд£¬Îª1ʱ¶Á
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
IO=1;
}
else {
IO=0;
}
SCK=1;
SCK=0;
addr = addr >> 1;
}
//Êä³öÊý¾Ý£ºtemp
for (i = 0; i < 8; i ++) {
temp = temp >> 1;
if (IO) {
temp |= 0x80;
}
else {
temp &= 0x7F;
}
SCK=1;
SCK=0;
}
RST=0; //Í£Ö¹DS1302×ÜÏß
return temp;
}
//ÏòDS302дÈëʱÖÓÊý¾Ý
void ds1302_write_time(void)
{
ds1302_write_byte(ds1302_control_add,0x00); //¹Ø±Õд±£»¤
ds1302_write_byte(ds1302_sec_add,0x80); //ÔÝͣʱÖÓ
//ds1302_write_byte(ds1302_charger_add,0xa9); //ä¸Á÷³äµç
ds1302_write_byte(ds1302_year_add,time_buf[1]); //Äê
ds1302_write_byte(ds1302_month_add,time_buf[2]); //ÔÂ
ds1302_write_byte(ds1302_date_add,time_buf[3]); //ÈÕ
ds1302_write_byte(ds1302_hr_add,time_buf[4]); //ʱ
ds1302_write_byte(ds1302_min_add,time_buf[5]); //·Ö
ds1302_write_byte(ds1302_sec_add,time_buf[6]); //Ãë
ds1302_write_byte(ds1302_day_add,time_buf[7]); //ÖÜ
ds1302_write_byte(ds1302_control_add,0x80); //´ò¿ªÐ´±£»¤
}
//´ÓDS302¶Á³öʱÖÓÊý¾Ý
void ds1302_read_time(void)
{
time_buf[1]=ds1302_read_byte(ds1302_year_add); //Äê
time_buf[2]=ds1302_read_byte(ds1302_month_add); //ÔÂ
time_buf[3]=ds1302_read_byte(ds1302_date_add); //ÈÕ
time_buf[4]=ds1302_read_byte(ds1302_hr_add); //ʱ
time_buf[5]=ds1302_read_byte(ds1302_min_add); //·Ö
time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//Ã룬ÆÁ±ÎÃëµÄµÚ7룬±ÜÃⳬ³ö59
time_buf[7]=ds1302_read_byte(ds1302_day_add); //ÖÜ
}
if(RTCOK_fag==0) 读出并上传时间数据~
{Rec_buf[0]=0x55;
delayms(10);
ds1302_read_time();
Rec_buf[0]=0x55;
Rec_buf[1]=time_buf[1];//年
Rec_buf[2]=time_buf[2]; //月
Rec_buf[3]=time_buf[3]; //日
Rec_buf[4]=time_buf[4]; //时
Rec_buf[5]=time_buf[5]; //分
Rec_buf[6]=time_buf[6];//秒
Rec_buf[7]=0xE5; //
Rec_buf[8]=0xaa;//
send1();//串口发送数据据!
}
主要程序!!
加载中...
查看其它16个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
sbit RST = P1^2;
sbit IO = P1^4;
sbit SCK = P1^5;
uchar time_buf[8] = {0x20,0x10,0x0c,0x05,0x0F,0x08,0x55,0x02};//³õ
unsigned char idata Rec_buf[10]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char idata Ctrl_buf[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*****Ôö¼Ó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
void ds1302_init(void) //OK
{
RST=0; //RST½ÅÖõÍ
SCK=0; //SCK½ÅÖõÍ
}
void ds1302_write_byte(uchar addr, uchar d)
{
uchar i;
RST=1; //Æô¶¯DS1302×ÜÏß
//дÈëÄ¿±êµØÖ·£ºaddr
addr = addr & 0xFE; //×îµÍλÖÃÁ㣬¼Ä´æÆ÷0λΪ0ʱд£¬Îª1ʱ¶Á
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
IO=1;
}
else {
IO=0;
}
SCK=1; //²úÉúʱÖÓ
SCK=0;
addr = addr >> 1;
}
//дÈëÊý¾Ý£ºd
for (i = 0; i < 8; i ++) {
if (d & 0x01) {
IO=1;
}
else {
IO=0;
}
SCK=1; //²úÉúʱÖÓ
SCK=0;
d = d >> 1;
}
RST=0; //Í£Ö¹DS1302×ÜÏß
}
//´ÓDS1302¶Á³öÒ»×Ö½ÚÊý¾Ý
uchar ds1302_read_byte(uchar addr) {
uchar i,temp;
RST=1; //Æô¶¯DS1302×ÜÏß
//дÈëÄ¿±êµØÖ·£ºaddr
addr = addr | 0x01; //×îµÍλÖøߣ¬¼Ä´æÆ÷0λΪ0ʱд£¬Îª1ʱ¶Á
for (i = 0; i < 8; i ++) {
if (addr & 0x01) {
IO=1;
}
else {
IO=0;
}
SCK=1;
SCK=0;
addr = addr >> 1;
}
//Êä³öÊý¾Ý£ºtemp
for (i = 0; i < 8; i ++) {
temp = temp >> 1;
if (IO) {
temp |= 0x80;
}
else {
temp &= 0x7F;
}
SCK=1;
SCK=0;
}
RST=0; //Í£Ö¹DS1302×ÜÏß
return temp;
}
//ÏòDS302дÈëʱÖÓÊý¾Ý
void ds1302_write_time(void)
{
ds1302_write_byte(ds1302_control_add,0x00); //¹Ø±Õд±£»¤
ds1302_write_byte(ds1302_sec_add,0x80); //ÔÝͣʱÖÓ
//ds1302_write_byte(ds1302_charger_add,0xa9); //ä¸Á÷³äµç
ds1302_write_byte(ds1302_year_add,time_buf[1]); //Äê
ds1302_write_byte(ds1302_month_add,time_buf[2]); //ÔÂ
ds1302_write_byte(ds1302_date_add,time_buf[3]); //ÈÕ
ds1302_write_byte(ds1302_hr_add,time_buf[4]); //ʱ
ds1302_write_byte(ds1302_min_add,time_buf[5]); //·Ö
ds1302_write_byte(ds1302_sec_add,time_buf[6]); //Ãë
ds1302_write_byte(ds1302_day_add,time_buf[7]); //ÖÜ
ds1302_write_byte(ds1302_control_add,0x80); //´ò¿ªÐ´±£»¤
}
//´ÓDS302¶Á³öʱÖÓÊý¾Ý
void ds1302_read_time(void)
{
time_buf[1]=ds1302_read_byte(ds1302_year_add); //Äê
time_buf[2]=ds1302_read_byte(ds1302_month_add); //ÔÂ
time_buf[3]=ds1302_read_byte(ds1302_date_add); //ÈÕ
time_buf[4]=ds1302_read_byte(ds1302_hr_add); //ʱ
time_buf[5]=ds1302_read_byte(ds1302_min_add); //·Ö
time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//Ã룬ÆÁ±ÎÃëµÄµÚ7룬±ÜÃⳬ³ö59
time_buf[7]=ds1302_read_byte(ds1302_day_add); //ÖÜ
}
if(RTCOK_fag==0) 读出并上传时间数据~
{Rec_buf[0]=0x55;
delayms(10);
ds1302_read_time();
Rec_buf[0]=0x55;
Rec_buf[1]=time_buf[1];//年
Rec_buf[2]=time_buf[2]; //月
Rec_buf[3]=time_buf[3]; //日
Rec_buf[4]=time_buf[4]; //时
Rec_buf[5]=time_buf[5]; //分
Rec_buf[6]=time_buf[6];//秒
Rec_buf[7]=0xE5; //
Rec_buf[8]=0xaa;//
send1();//串口发送数据据!
}
主要程序!!
一周热门 更多>