3941|5

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

帮忙看下,纠结几天了,关于ds1302的 [复制链接]

#include <reg52.h>

#define uchar unsigned char 
#define uint unsigned int

 
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0X82
#define WRITE_HOUR 0X84
#define READ_SECOND 0X81
#define READ_MINUTE 0X83
#define READ_HOUR 0X85
#define WRITE_PROTECT 0X8E

sbit ACC_7=ACC^7;
sbit SCLK=P2^0;
sbit DIO=P2^1;
sbit RES=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;


uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar second,minute,hour,second1,second2,minute1,minute2,hour1,hour2;//second1和second2是second的十位和个位

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}



void write_ds(uchar addr,uchar dat) //写入1302
{
uchar i,temp;
SCLK=0;
RES=1;
for(i=0;i<8;i++)
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr>>=1;
SCLK=1;
}
for(i=0;i<8;i++)
{
SCLK=0;
temp=dat;
DIO=(bit)(temp&0x01);
SCLK=1;
dat>>=1;
}
RES=0;
}


uint read_ds(uchar addr) //´读出1302中的数据
{
uchar i,temp,dat;

SCLK=0;
RES=1;
for(i=0;i<8;i++)
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr>>=1;
SCLK=1;
}
for(i=0;i<8;i++)
{
SCLK=1;
ACC_7=DIO;
ACC>>=1;
SCLK=0; //
}
RES=0;
dat=ACC/16*10+ACC%16;
  return dat;

}


void display() //数码管显示时分秒
{  
second1=second/10;
second2=second%10;
minute1=minute/10;
minute2=minute%10;
hour1=hour/10;
hour2=hour%10;

dula=1;
P0=table[second2];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(1);

dula=1;
P0=table[second1];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);

dula=1;
P0=table[minute2];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);

dula=1;
P0=table[minute1];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);

dula=1;
P0=table[hour2];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);

dula=1;
P0=table[hour1];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}


void init() //配置
{

write_ds(WRITE_PROTECT,0X00);
write_ds(WRITE_SECOND,0X56);
write_ds(WRITE_MINUTE,0X34);
write_ds(WRITE_HOUR,0X12);
write_ds(WRITE_PROTECT,0X80);

}

int main()
{


init();
while(1)
{  
second=read_ds(READ_SECOND);
minute=read_ds(READ_MINUTE);
hour=read_ds(READ_HOUR);
display();
  }
return 0;
}

程序很简单,就显示时分秒,会走就行。不知道为什么,数码管显示676767,而且不动,可是不连接DIO、SLK、CS这三个通道,数码管依然显示676767,分明没受控制,程序我也看了好几遍,都是些最简单的,没有检查出来错误,各位大侠帮帮忙,为什么啊?是不是程序哪不对啊?实在是自己无法解决了。
此帖出自单片机论坛

最新回复

这两天正在学这个顺便看了一下,你的读程序错了 or(i=0;i<8;i++){SCLK=1;ACC_7=DIO;ACC>>=1;SCLK=0; //}RES=0;dat=ACC/16*10+ACC%16;  return dat; 应该改为 for(i=0;i<8;i++){ACC_7=DIO;SCLK=1; ACC>>=1;SCLK=0; //} 改了过后在板子上运行了一次 能正常运行  详情 回复 发表于 2011-3-25 14:17
点赞 关注
个人签名努力奋斗
 

回复
举报

463

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
这种问题一般是不好回答的。因为你的问题是出在电路上还是软件还不确定。只能给你个方法。
1、测量硬件各关键引脚的控制逻辑是否正确,就是说单片机控制输出0看实际是否是0.同样的方法检查输入。
2、驱动数码管的一个字,看是否正常显示,最好先用静态显示再用动态扫描的方法
3、输出固定数字,比如6个数码管全部输出8或1,检查是否正确。
4、最后再显示你的时分秒变量值。
呵呵,能帮你的就这么多了。做工程师的前提是用心和细心。还有耐心。加油吧
此帖出自单片机论坛
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我测了一下能通上电,别的就不知道怎么弄了,朋友们,帮帮忙
此帖出自单片机论坛
 
个人签名努力奋斗
 
 

回复

186

帖子

0

TA的资源

一粒金砂(中级)

4
 
帮你顶顶,这个也不太了解
此帖出自单片机论坛
 
 
 

回复

996

帖子

0

TA的资源

一粒金砂(高级)

5
 
1302的例子也很多啊,先检查硬件把!~
此帖出自单片机论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

6
 

这两天正在学这个顺便看了一下,你的读程序错了

or(i=0;i<8;i++)
{
SCLK=1;
ACC_7=DIO;
ACC>>=1;
SCLK=0; //
}
RES=0;
dat=ACC/16*10+ACC%16;
  return dat;
应该改为

for(i=0;i<8;i++)
{
ACC_7=DIO;
SCLK=1;

ACC>>=1;
SCLK=0; //
}

改了过后在板子上运行了一次 能正常运行

此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表