DS1302与51单片机的问题,大家来帮我看看这个程序吧...不知道哪儿出错了读到的数据总是0xff......求指教!
解决时间 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;不能一直为底
全部回答
程序不想看了,不过要提醒一下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;
}
}
我要举报
大家都在看
推荐资讯