单片机学习笔记.根据芯片数据手册写驱动程序(这里使用的是普中开发版,以DS1302为例)

发布于:2025-07-14 ⋅ 阅读:(16) ⋅ 点赞:(0)

硬件原理图部分: 

 

 VCC2:是主电源

VCC1:是备用电源,此处没有使用VCC1


 查芯片数据手册的网站:

ALLDATASHEETCN.COM - 电子元件和半导体及其他半导体的数据表搜索网站。https://www.alldatasheetcn.com/


 

 1.由原理图可知对应引脚,所以先在软件里定义其对应引脚:

sbit DS1302_SCLK=P3^6; //串行时钟
sbit DS1302_IO=P3^4;//数据输入/输出
sbit DS1302_CE=P3^5;//芯片使能

 2.由时序图可知在开始阶段无论发送还是接收CE和SCLK都是低电平

void DS1302_Init()
{
	DS1302_CE=0;
	DS1302_SCLK=0;
}

 命令字地址:

3.由时序图写DS1302发送一个字节 :

  写入时的时序图的分析:

 

 这里时钟线这里拉高直接拉低,没有加延时,是因为DS1302是纳秒级,而单片机是微秒,不然需要加延时函数

void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE=1;
//	DS1302_IO=(Command&0x01);//0000 0001 取cmd的最低位
//	DS1302_SCLK=1;//单片机需要加延时看数据手册
//	DS1302_SCLK=0;
//	DS1302_IO=(Command&0x02);//0000 0010 取cmd的次低位,
//	DS1302_SCLK=1;
//	DS1302_SCLK=0;

//找到规律,for循环左移8次就可以存入所有位
	for(i=0;i<8;i++)//根据数据手册的时序图来写
	{
		DS1302_IO=(Command&(0x01<<i));
		DS1302_SCLK=1;
//这里,没有加延时是因为DS1302是纳秒级,而单片机是微秒,不然需要加延时函数
		DS1302_SCLK=0;
	}

	for(i=0;i<8;i++)
	{
		DS1302_IO=(Data&(0x01<<i));
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_CE=0;
}

4.由时序图写DS1302读取一个字节 :

unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Data=0x00;
	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;
	return Data;
//	DS1302_SCLK=0;
//	DS1302_SCLK=1;
//	if(DS1302_IO){Data|=0x02;}
//	DS1302_SCLK=0;
//	DS1302_SCLK=1;
//	if(DS1302_IO){Data|=0x04;}
	
}


网站公告

今日签到

点亮在社区的每一天
去签到