Bootstrap

DS1302读取秒时总是得到255(全部返回高电平)

前言

       在使用蓝桥杯单片机比赛的单片机时,发现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;
}

原因:

   一.芯片的写保护还没有解除。(这个是网上一般找到的结果)

        解决方法:在main函数之前写入解除代码 Write_Ds1302_Byte(0x8E,0x00); 注意0x00才是  解除写保护,0x80是加入写保护写入后对芯片进行的操作无效;

  二.没有给时、分,秒写入初始值。(这个是我尝试出来的结果)

       解决方法使用之前给ds1302赋初值,就算是 0 也行。

/**
  * @brief 给DS1302模块一个初始值
  * @param  无
  * @retval  无
  */
void Time_init()
{
   Write_Ds1302_Byte(0x8E,0x00);    //取消写保护
   Write_Ds1302_Byte(0x82,0);
   Write_Ds1302_Byte(0x84,0);    
   Write_Ds1302_Byte(0x8E,0x80);   //打开写保护
}

;