DS1302 程序无法读写数据!
时间:10-02
整理:3721RD
点击:
源代码:
#include<reg51.h>
#define unchar unsigned char
unchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int secddp=1;
sbit RST=P2^5;
sbit CLK=P2^6;
sbit IO=P2^7;
sbit ming=P2^0;
sbit mins=P2^1;
sbit hourg=P2^2;
sbit hours=P2^3;
sbit ddp=P2^4;
sbit A0=ACC^0;
sbit A7=ACC^7;
unchar ds_data;
unchar ds_addr;
unchar min;
unchar hour;
void delay()
{
unchar i=30000;
for(;i>0;i--);
}
ds_read()
{
unchar i;
RST=0;
CLK=0;
RST=1;
ACC=ds_addr;
for(i=8;i>0;i--)
{IO=A0;
IO=A0;////
IO=A0;
IO=A0;
IO=A0;
CLK=1;
CLK=0;
ACC>>=1;
}
for(i=8;i>0;i--)
{//CLK=1;////////////////
A7=IO;
A7=IO;
A7=IO;
A7=IO;
A7=IO;
ACC>>=1;
CLK=1;
CLK=0;
}
ds_data=ACC;
return ds_data;
RST=0;
}
void ds_write()
{
int i;
RST=0;
CLK=0;
RST=1;
ACC=ds_addr;
for(i=8;i>0;i--)
{
IO=A0;/////
IO=A0;
IO=A0;
IO=A0;
CLK=1;
CLK=0;
ACC>>=1;
}
ACC=ds_data;
for(i=8;i>0;i--)
{
IO=A0;////
IO=A0;
IO=A0;
IO=A0;
IO=A0;
CLK=1;
CLK=0;
ACC>>=1;
}
RST=0;
}
void display0() interrupt 1
{
unchar temp;
ddp=1;
secddp++;
while(secddp==40)
{
ddp=!ddp;
secddp=1;
}
TH0=0x00; //
TL0=0x2c;
P0=tab[min&&0x0f];
ming=0;
mins=1;
hourg=1;
hours=1;
delay(); ///////
temp=min&&0xf0;
temp>>=4;
P0=tab[temp];
ming=1;
mins=0;
hourg=1;
hours=1;
delay(); ///////
P0=tab[hour&&0x0f];
ming=1;
mins=1;
hourg=0;
hours=1;
delay(); ////////
temp=hour&&0xf0;
temp>>=4;
P0=tab[temp];
ming=1;
mins=1;
hourg=1;
hours=0;
delay(); ////////
}
void main()
{
P0=0x00;
P2=0x00;
TMOD=0x01;
TH0=0x00; //
TL0=0x2c;
EA=1;
ET0=1;
TR0=1;
P0=0x00;
P2=0x00;
ds_addr=0x8e; //控制字
ds_data=0x00;
ds_write();
ds_addr=0x82; //写分
ds_data=0x01; //00分
ds_write();
ds_addr=0x84;//写时
ds_data=0x01;//00时
ds_write();
ds_addr=0x8f; //控制字
ds_data=0x00;
ds_write();
ds_addr=0x83; //读分
min=ds_read();
ds_addr=0x85; //读时
hour=ds_read();
}
求救!
#include<reg51.h>
#define unchar unsigned char
unchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int secddp=1;
sbit RST=P2^5;
sbit CLK=P2^6;
sbit IO=P2^7;
sbit ming=P2^0;
sbit mins=P2^1;
sbit hourg=P2^2;
sbit hours=P2^3;
sbit ddp=P2^4;
sbit A0=ACC^0;
sbit A7=ACC^7;
unchar ds_data;
unchar ds_addr;
unchar min;
unchar hour;
void delay()
{
unchar i=30000;
for(;i>0;i--);
}
ds_read()
{
unchar i;
RST=0;
CLK=0;
RST=1;
ACC=ds_addr;
for(i=8;i>0;i--)
{IO=A0;
IO=A0;////
IO=A0;
IO=A0;
IO=A0;
CLK=1;
CLK=0;
ACC>>=1;
}
for(i=8;i>0;i--)
{//CLK=1;////////////////
A7=IO;
A7=IO;
A7=IO;
A7=IO;
A7=IO;
ACC>>=1;
CLK=1;
CLK=0;
}
ds_data=ACC;
return ds_data;
RST=0;
}
void ds_write()
{
int i;
RST=0;
CLK=0;
RST=1;
ACC=ds_addr;
for(i=8;i>0;i--)
{
IO=A0;/////
IO=A0;
IO=A0;
IO=A0;
CLK=1;
CLK=0;
ACC>>=1;
}
ACC=ds_data;
for(i=8;i>0;i--)
{
IO=A0;////
IO=A0;
IO=A0;
IO=A0;
IO=A0;
CLK=1;
CLK=0;
ACC>>=1;
}
RST=0;
}
void display0() interrupt 1
{
unchar temp;
ddp=1;
secddp++;
while(secddp==40)
{
ddp=!ddp;
secddp=1;
}
TH0=0x00; //
TL0=0x2c;
P0=tab[min&&0x0f];
ming=0;
mins=1;
hourg=1;
hours=1;
delay(); ///////
temp=min&&0xf0;
temp>>=4;
P0=tab[temp];
ming=1;
mins=0;
hourg=1;
hours=1;
delay(); ///////
P0=tab[hour&&0x0f];
ming=1;
mins=1;
hourg=0;
hours=1;
delay(); ////////
temp=hour&&0xf0;
temp>>=4;
P0=tab[temp];
ming=1;
mins=1;
hourg=1;
hours=0;
delay(); ////////
}
void main()
{
P0=0x00;
P2=0x00;
TMOD=0x01;
TH0=0x00; //
TL0=0x2c;
EA=1;
ET0=1;
TR0=1;
P0=0x00;
P2=0x00;
ds_addr=0x8e; //控制字
ds_data=0x00;
ds_write();
ds_addr=0x82; //写分
ds_data=0x01; //00分
ds_write();
ds_addr=0x84;//写时
ds_data=0x01;//00时
ds_write();
ds_addr=0x8f; //控制字
ds_data=0x00;
ds_write();
ds_addr=0x83; //读分
min=ds_read();
ds_addr=0x85; //读时
hour=ds_read();
}
求救!
仿真图
时序图
电路图
你仿真时,晶振设置成了多少?
图上中间的脉冲是不SCLK的波形?
SLCK要有宽度限制的。