晨辉教你轻松学51--------外围芯片之ds1302和ds18b20对于市面上的大多数51单片机开发板来说。ds1302和ds18b20应该是比较常见的两种外围芯片。ds1302是具有SPI总线接口的时钟芯片。ds18b20则是具有单总线接口的数字温度传感器。下面让我们分别来认识并学会应用这两种芯片。首先依旧是看DS1302的datasheet中的相关介绍。上面是它的一些基本的应用介绍。下面是它的引脚的描述。下面是DS1302的时钟寄存器。我们要读取的时间数据就是从下面这些数据寄存器中读取出来的。当我们要想调整时间时,可以把时间数据写入到相应的寄存器中就可以了。这是DS1302内部的31个RAM寄存器。在某些应用场合我们可以应用到。如我们想要做一个带定时功能的闹钟。则可以把闹钟的时间写入到31个RAM寄存器中的任意几个。当单片机掉电时,只要我们的DS1302的备用电池还能工作,那么保存在其中的闹钟数据就不会丢失~~由于对于这些器件的操作基本上按照数据手册上面提供的时序图和相关命令字来进行操作就可以了。因此在我们应用这些器件的时候一定要对照着手册上面的要求来进行操作。如果觉得还不够放心的话。可以到网上下载一些参考程序。对着手册看别人的程序,看别人的思路是怎么样的。DS1302和单片机的连接很简单。只需一根复位线,一根时钟线,一根数据线即可。同时它本身还需要接一个32.768KHz的晶振来提供时钟源。对于晶振的两端可以分别接一个6PF左右的电容以提高晶振的精确度。同时可以在第8脚接上一个3.6V的可充电的电池。当系统正常工作时可以对电池进行涓流充电。当系统掉电时,DS1302由这个电池提供的能量继续工作。下面让我们来驱动它。sbitio_DS1302_RST=P2^0;sbitio_DS1302_IO=P2^1;sbitio_DS1302_SCLK=P2^2;//-------------------------------------常数宏---------------------------------//#defineDS1302_SECOND_WRITE0x80//写时钟芯片的寄存器位置#defineDS1302_MINUTE_WRITE0x82#defineDS1302_HOUR_WRITE0x84#defineDS1302_WEEK_WRITE0x8A#defineDS1302_DAY_WRITE0x86#defineDS1302_MONTH_WRITE0x88#defineDS1302_YEAR_WRITE0x8C#defineDS1302_SECOND_READ0x81//读时钟芯片的寄存器位置#defineDS1302_MINUTE_READ0x83#defineDS1302_HOUR_READ0x85#defineDS1302_WEEK_READ0x8B#defineDS1302_DAY_READ0x87#defineDS1302_MONTH_READ0x89#defineDS1302_YEAR_READ0x8D//-----------------------------------操作宏----------------------------------//#defineDS1302_SCLK_HIGHio_DS1302_SCLK=1;#defineDS1302_SCLK_LOWio_DS1302_SCLK=0;#defineDS1302_IO_HIGHio_DS1302_IO=1;#defineDS1302_IO_LOWio_DS1302_IO=0;#defineDS1302_IO_READio_DS1302_IO#defineDS1302_RST_HIGHio_DS1302_RST=1;#defineDS1302_RST_LOWio_DS1302_RST=0;/*******************************************************保存时间数据的结构体*******************************************************/struct{uint8Second;uint8Minute;uint8Hour;uint8Day;uint8Week;uint8Month;uint8Year;}CurrentTime;/*******************************************************************************Function:staticvoidv_DS1302Write_f(uint8Content)**Description:向DS1302写一个字节的内容**Parameter:uint8Content:要写的字节*********************************************************************************/staticvoidv_DS1302Write_f(uint8Content){uint8i;for(i=8;i0;i--){if(Content&0x01){DS1302_IO_HIGH}else{DS1302_IO_LOW}Content=1;DS1302_SCLK_HIGHDS1302_SCLK_LOW}}/*******************************************************************************Function:staticuint8v_DS1302Read_f(void)**Description:从DS1302当前设定的地址读取一个字节的内容**Parameter:**Return:返回读出来的值(uint8)*******************************************************************************/staticuint8v_DS1302Read_f(void){uint8i,ReadValue;DS1302_IO_HIGHfor(i=8;i0;i--){ReadValue=1;if(DS1302_IO_READ){ReadValue|=0x80;}else{ReadValue&=0x7f;}DS1302_SCLK_HIGHDS1302_SCLK_LOW}returnReadValue;}/*******************************************************************************Function:voidv_DS1302WriteByte_f(uint8Address,uint8Content)**Description:从DS1302指定的地址写入一个字节的内容**Parameter:Address:要写入数据的地址**Content:写入数据的具体值**Return:*******************************************************************************/voidv_DS1302WriteByte_f(uint8Address,uint8Content){DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f(Address);v_DS1302Write_f(Content);DS1302_RST_LOWDS1302_SCLK_HIGH}/*******************************************************************************Function:uint8v_DS1302ReadByte_f(uint8Address)**Description:从DS1302指定的地址读出一个字节的内容**Parameter:Address:要读出数据的地址****Return:指定地址读出的值(uint8)*******************************************************************************/uint8v_DS1302ReadByte_f(uint8Address){uint8ReadValue;DS1302_RST_LOWDS1302_SCLK_LOWDS1302_RST_HIGHv_DS1302Write_f(Address);ReadValue=v_DS1302Read_f();DS1302_RST_LOWDS1302_SCLK_HIGHreturnReadValue;}/*******************************************************************************Function:voidv_ClockInit_f(void)**Description:初始化写入DS1302时钟寄存器的值(主程序中只需调用一次即可)**Parameter:****Return:*******************************************************************************/voidv_ClockInit_f(void){if(v_DS1302ReadByte_f(0xc1)!=0xf0){v_DS1302WriteByte_f(0x8e,0x00);//允许写操作v_DS1302WriteByte_f(DS1302_YEAR_WRITE,0x08);//年v_DS1302WriteByte_f(DS1302_WEEK_WRITE,0x04);//星期v_DS1302WriteByte_f(DS1302_MONTH_WRITE,0x12);//月v_DS1302WriteByte_f(DS1302_DAY_WRITE,0x11);//日v_DS1302WriteByte_f(DS1302_HOUR_WRITE,0x13);//小时v_DS1302WriteByte_f(DS1302_MINUTE_WRITE,0x06);//分钟v_DS1302WriteByte_f(DS1302_SECOND_WRITE,0x40);//秒v_DS1302WriteByte_f(0x90,0xa5);//充电v_DS1302WriteByte_f(0xc0,0xf0);//判断是否初始化一次标识写入v_DS1302WriteByte_f(0x8e,0x80);//禁止写操作}}/*******************************************************************************Function:voidv_ClockUpdata_f(void)**Description:读取时间数据,并保存在结构体CurrentTime中**Parameter:****Return:*******************************************************************************/voidv_ClockUpdata_f(void){CurrentTime.Second=v_DS1302ReadByte_f(DS1302_SECOND_READ);CurrentTime.Minute=v_DS1302ReadByte_f(DS1302_MINUTE_READ);CurrentTime.Hour=v_DS1302ReadByte_f(DS1302_HOUR_READ);CurrentTime.Day