代码如下
前言
在使用蓝桥杯单片机比赛的单片机时,发现ds1302只返回高电平,在网上找了很多结果但都没有找到原因,后来在不断的调试和对比下终于发现了原因。
#include <REGX52.H>
#include "DS1302.h"
#include "LCD1602.h"
unsigned char a;
int main()
{
LCD_Init();
DS1302_Init();
while(1)
{
a=DS1302_ReadByte(0x80);
LCD_ShowNum(1,1,a,3);
}
}
#include <REGX52.H>
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;
unsigned char DS1302_ReadByte(unsigned char Command)
{
unsigned char i,Data=0x00;
Command|=0x01; //将指令转换为读指令
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=Command&(0x01<<i);
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO){Data|=(0x01<<i);}
}
DS1302_CE=0;
DS1302_IO=0; //读取后将IO设置为0,否则读出的数据会出错
return Data;
}
原因:
1.芯片的写保护还没有解除。(这个是网上一般找到的结果)
2.没有给时、分,秒写入初始值。(这个是我尝试出来的结果)
解决方法:
1,在main函数之前写入解除代码 Write_Ds1302_Byte(0x8E,0x00); 注意0x00才是解除写保护0x80是加入写保护,写入0x80之后对芯片进行的操作无效;
2,给ds1302赋初值,就算是 0 也行。