单片机用的是C8051F020,12MHz。不知道为什么,读出来的数据一直是0。看了很久芯片说明也没想出究竟,希望帮我找找问题点。
代码如下:
//DS1687控制定义
sbit DS1687_CS=P1^4;//DS1687.13
sbit DS1687_ALE=P1^5;//DS1687.14
sbit DS1687_WR=P1^6;//DS1687.15
sbit DS1687_RD=P1^7;//DS1687.17
#define DS1687_DATA P6//AD7~AD0
//---地址定义--------------------
#define RegisterA 0x0a
#define RegisterB 0x0b
#define Seconds 0x00
#define Minutes 0x02
#define Hours 0x04
#define Day 0x06 //周1~周日
#define Date 0x07 //日
#define Month 0x08
#define Year 0x09 //00~99
#define Century 0x48
/******************************************************
函 数 名:Read_DS1687
功 能:对DS1687进行读取操作
参数列表:
unsigned char iAdress 所要读取的数据的地址
********************************************************/
unsigned char Read_DS1687(unsigned char iAdress)
{
unsigned char Data;
DS1687_CS=1;DS1687_ALE=1;DS1687_WR=1;DS1687_RD=1;
DS1687_CS=0;
DS1687_DATA=iAdress;
DS1687_ALE=1;DS1687_ALE=0;//ALE下降沿锁入地址
DS1687_RD=0;Data=DS1687_DATA;
DS1687_RD=1;
DS1687_CS=1;DS1687_ALE=1;DS1687_WR=1;DS1687_RD=1;
return Data;
}
/******************************************************
函 数 名:Writ_DS1687
功 能:对DS1687进行写操作
参数列表:unsigned char iAdress--要写入的地址
unsigned char iData----要写入的数据
sbit DS1687_CS=P1^4;//DS1687.13
sbit DS1687_ALE=P1^5;//DS1687.14
sbit DS1687_WR=P1^6;//DS1687.15
sbit DS1687_RD=P1^7;//DS1687.17
********************************************************/
Writ_DS1687(unsigned char iAdress,unsigned char iData)
{
DS1687_CS=1;DS1687_ALE=1;DS1687_WR=1;DS1687_RD=1;
DS1687_CS=0;
DS1687_DATA=iAdress;
DS1687_ALE=1;DS1687_ALE=0;//ALE下降沿锁入地址
DS1687_WR=0;DS1687_DATA=iData;
DS1687_WR=1;
DS1687_CS=1;DS1687_ALE=1;DS1687_WR=1;DS1687_RD=1;
}
main()
{
...
Writ_DS1687(RegisterA,0x30); //启动倒计时计数器,启动内部晶振,启动外部寄存器
Writ_DS1687(RegisterB,0x86); //将SET位置1,即时间更新被阻止,并且允许程序初始化时钟和日历,2进制,24小时制
Writ_DS1687(Hours,10);Writ_DS1687(Minutes,10);Writ_DS1687(Seconds,50);//时分秒
Writ_DS1687(Century,20);Writ_DS1687(Year,10); //2010年
Writ_DS1687(Month,11);Writ_DS1687(Date,8);//
Writ_DS1687(RegisterB,0x06);//将SET位置0,开启时间更新
...
Display(Read_DS1687(Date));
}
资料的时序图:
|