永发信息网

DS1302与51单片机的问题,大家来帮我看看这个程序吧...不知道哪儿出错了读到的数据总是0xff......求指教!

答案:3  悬赏:40  手机版
解决时间 2021-02-14 05:34
  • 提问者网友:听门外雪花风
  • 2021-02-14 00:19
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define WRITE_DATE 0x86
#define WRITE_MONTH 0x88
#define WRITE_WEEKDAY 0x8A
#define WRITE_YEAR 0x8C
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define READ_DATE 0x87
#define READ_MONTH 0x89
#define READ_WEEKDAY 0x8B
#define READ_YEAR 0x8D
#define WRITE_PROTECT 0x8E

sbit Qian_Wei=P1^0;
sbit Bai_Wei=P1^1;
sbit Shi_Wei=P2^3;
sbit Ge_Wei=P2^6;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};

sbit ACC_7 = ACC^7;
sbit SCLK = P3^5;
sbit DIO = P3^6;
sbit RET = P3^4;

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void Write1302(uchar addr,dat)
{
uchar counter,temp;
RET=0;
SCLK=0;
RET=1;
for(counter=8;counter>0;counter--) //发送地址
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr>>=1;
SCLK=1;
}
for(counter=8;counter>0;counter--) //发送数据
{
SCLK=0;
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCLK=1;
}
RET=0;
}

uchar Read1302(uchar addr)
{
uchar counter,temp,dat1,dat2;
RET=0;
SCLK=0;
RET=1;
for(counter=8;counter>0;counter--) //发送地址
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr>>=1;
SCLK=1;
}
for(counter=7;counter>0;counter--) //读取数据
{
SCLK=1;
SCLK=0;
ACC_7=DIO;
ACC>>=1;
}
SCLK=1;
SCLK=0;
ACC_7=DIO;
RET=0;
dat1=ACC;
dat2=dat1>>4; //BCD转十进制
dat1=dat1&0x0f;
dat1=dat1+dat2*10;
return dat1;
}

void init()
{
Write1302(WRITE_PROTECT,0x00);
Write1302(WRITE_SECOND,0x56);
//Write1302(WRITE_PROTECT,0x80);
}

void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
P0=table[ge];
Ge_Wei=0;
delay(5);
Ge_Wei=1;
P0=0xff;

P0=table[shi];
Shi_Wei=0;
delay(5);
Shi_Wei=1;
P0=0xff;

P0=table[bai];
Bai_Wei=0;
delay(5);
Bai_Wei=1;
P0=0xff;

P0=table[qian];
Qian_Wei=0;
delay(5);
Qian_Wei=1;
P0=0xff;
}

void main()
{
uchar num,ge,shi,bai,qian;
init();
while(1)
{
num=Read1302(READ_SECOND);
qian=num/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
display(qian,bai,shi,ge);
}
}
最佳答案
  • 五星知识达人网友:杯酒困英雄
  • 2021-02-14 00:31
void Write1302(uchar addr,dat)
{
uchar counter,temp;
RET=0;
SCLK=0;
RET=1;
for(counter=8;counter>0;counter--) //发送地址
{
SCLK=0;
temp=addr;
DIO=(bit)(temp&0x01);
addr>>=1;
SCLK=1;
}
for(counter=8;counter>0;counter--) //发送数据
{
SCLK=0;
temp=dat;
DIO=(bit)(temp&0x01);
dat>>=1;
SCLK=1;
}
RET=0;
}

RET=0;不能一直为底
全部回答
  • 1楼网友:煞尾
  • 2021-02-14 01:00
程序不想看了,不过要提醒一下1302的数据口要接上啦电阻,一共是三个吧
  • 2楼网友:几近狂妄
  • 2021-02-14 00:50
voidv_rtinputbyte(ucharucda) { uchari; acc=ucda; for(i=8;i>0;i--) { t_io=acc0;//相当于汇编中的rrc t_clk=1; t_clk=0; acc=acc>>1; } } ucharuc_rtoutputbyte(void) { uchari; for(i=8;i>0;i--) { acc=acc>>1;//相当于汇编中的rrc acc7=t_io; t_clk=1; t_clk=0; } return(acc); } voidv_w1302(ucharucaddr,ucharucda) { t_rst=0; t_clk=0; t_rst=1; v_rtinputbyte(ucaddr);//地址,命令 v_rtinputbyte(ucda);//写1byte数据 t_clk=1; t_rst=0; } ucharuc_r1302(ucharucaddr) { ucharucda; t_rst=0; t_clk=0; t_rst=1; v_rtinputbyte(ucaddr);//地址,命令 ucda=uc_rtoutputbyte();//读1byte数据 t_clk=1; t_rst=0; return(ucda); } voidv_burstw1302t(uchar*psecda) { uchari; v_w1302(0x8e,0x00);//控制命令,wp=0,写操作? t_rst=0; t_clk=0; t_rst=1; v_rtinputbyte(0xbe);//0xbe:时钟多字节写命令 for(i=8;i>0;i--)//8byte=7byte时钟数据+1byte控制 { v_rtinputbyte(*psecda);//写1byte数据 psecda++; } t_clk=1; t_rst=0; } voidv_burstr1302t(uchar*psecda) { uchari; t_rst=0; t_clk=0; t_rst=1; v_rtinputbyte(0xbf);//0xbf:时钟多字节读命令 for(i=8;i>0;i--) { *psecda=uc_rtoutputbyte();//读1byte数据 psecda++; } t_clk=1; t_rst=0; } voidv_burstw1302r(uchar*preda) { uchari; v_w1302(0x8e,0x00);//控制命令,wp=0,写操作? t_rst=0; t_clk=0; t_rst=1; v_rtinputbyte(0xfe);//0xbe:时钟多字节写命令 for(i=31;i>0;i--)//31byte寄存器数据 { v_rtinputbyte(*preda);//写1byte数据 preda++; } t_clk=1; t_rst=0; } voidv_burstr1302r(uchar*preda) { uchari; t_rst=0; t_clk=0; t_rst=1; v_rtinputbyte(0xff);//0xbf:时钟多字节读命令 for(i=31;i>0;i--)//31byte寄存器数据 { *preda=uc_rtoutputbyte();//读1byte数据 preda++; } t_clk=1; t_rst=0; } voidv_set1302(uchar*psecda) { uchari; ucharucaddr=0x80; v_w1302(0x8e,0x00);//控制命令,wp=0,写操作? for(i=7;i>0;i--) { v_w1302(ucaddr,*psecda);//秒分时日月星期年 psecda++; ucaddr+=2; } v_w1302(0x8e,0x80);//控制命令,wp=1,写保护? } voidv_get1302(ucharuccurtime[]) { uchari; ucharucaddr=0x81; for(i=0;i<7;i++) { uccurtime[i]=uc_r1302(ucaddr);//格式为:秒分时日月星期年 ucaddr+=2; } }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯