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;
}

原因:

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

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

解决方法:

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

        2,给ds1302赋初值,就算是 0 也行。

猜你喜欢

转载自blog.csdn.net/wcl501375/article/details/128906004