单片机学习笔记.根据芯片数据手册写驱动程序(这里使用的是普中开发版,以DS1302为例)
硬件原理图部分:
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;}}