前言
在使用蓝桥杯单片机比赛的单片机时,发现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); //打开写保护
}