一、
DS1302是一种实时时钟的芯片;
实际中:当我们需要一种芯片时,我们获取芯片以后,首先需要拿到芯片的设计手册,明确芯片的功能,进一步去使用芯片的功能;
BCD码:用四位二进制数表示一位十进制数;简单来说就是将8位分开来代替十进制数-----0001 0011 表示的二进制数是13;0001 =1;0011=3;所以最终表示的二进制数是13;------------------------BCD码转十进制:DEC=BCD/16*10+BCD%16;(2位BCD)
---十进制转BCD码:BCD=DEC/10*16+DEC%10; (2位BCD)
RTC:实时时钟,一种集成电路,通常称为时钟芯片。

要想完成DS1302的书写功能,需要定义单字节写和单字节读两个功能;

DS1302时钟显示:
注意:DS1302.c的主要思路是sbit重新定义引脚,方便后续直接使用;首先初始化DS1302,如上图,将CE置0,SCLK置0;定义写的地址,在读Byte是直接将最低位置1即可;
然后定义写时钟代码和读时钟的代码;据上图,写时钟CE置高电位1,IO口的低位置---置0,用&;开启for循环;SCLK高电位1读取,低电位0移位;开启循环Date,和command是一致的;最终结束后将CE置0;
读时钟时需要注意:因为读时钟时的SCLK电位变化是15,所以先置0,后置1;Date时先置1,后置0,;两次置1相当于一次,保证电位变化为15;
然后建立时钟,读时钟;
建立时钟时,需要写进的是BCD码;初始化数组,内容为年-月-日-时-分-秒-日期,首先关闭写保护,然后写时钟BCD码;
读时钟时需要将读取到的BCD码转换成二进制数;
主函数建立时钟---读时钟;然后将数组打印出来;
main.c
#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
unsigned char Second,Minute;
void main()
{
LCD_Init();
DS1302_Init();
LCD_ShowString(1,1," - - ");
LCD_ShowString(2,1," : : ");
// DS1302_WriteByte(0x8E,0x00);//关闭写保护位,如果没有这句代码,结果会显示128;
DS1302_SetTime();
while(1)
{
DS1302_ReadTime();
LCD_ShowNum(1,1,DS1302_Time[0],2);
LCD_ShowNum(1,4,DS1302_Time[1],2);
LCD_ShowNum(1,7,DS1302_Time[2],2);
LCD_ShowNum(2,1,DS1302_Time[3],2);
LCD_ShowNum(2,4,DS1302_Time[4],2);
LCD_ShowNum(2,7,DS1302_Time[5],2);
}
}
DS1302.c
#include <REGX52.H>
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;
#define DS1302_SECOND 0x80//定义-后面方便使用,查表的结果
#define DS1302_MINUTE 0x82//定义的是写的地址;查表可得:读的地址在写的地址的基础上把最低位置1即可;
#define DS1302_HOUR 0x84
#define DS1302_DATE 0x86
#define DS1302_MONTH 0x88
#define DS1302_DAY 0x8A
#define DS1302_YEAR 0x8C
#define DS1302_WP 0x8E
unsigned char DS1302_Time[]={22,11,11,19,41,59,5};//年-月-日-时-分-秒-日期
DS1302_Init()
{
DS1302_CE=0;
DS1302_SCLK=0;
}
void DS1302_WriteByte(unsigned char command,Date)
{
unsigned char i;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=command&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
for(i=0;i<8;i++)
{
DS1302_IO=Date&(0x01<<i);
DS1302_SCLK=1;
DS1302_SCLK=0;
}
DS1302_CE=0;
}
unsigned char DS1302_ReadByte(unsigned char command)
{
unsigned char i,Date=0x00;//局部变量初始化时不一定是0;
command=command|0x01;//在定义写的地址基础上将最低位-置1,保证读取ReadByte时写的地址切换为读的地址;
DS1302_CE=1;
for(i=0;i<8;i++)
{
DS1302_IO=command&(0x01<<i);//&是找0
DS1302_SCLK=0;
DS1302_SCLK=1;
}
for(i=0;i<8;i++)
{
DS1302_SCLK=1;
DS1302_SCLK=0;
if(DS1302_IO){Date=Date|(0x01<<i);}//最低位 置1;
}//|是找1;
DS1302_CE=0;
DS1302_IO=0;
return Date;
}
//注意在此读和写与或不同:是因为写是高电平写-读是低电平读;
//注意写进去的需要转换成BCD码,读出来的需要从BCD码转成二进制;
void DS1302_SetTime(void)
{
DS1302_WriteByte(DS1302_WP,0x00);//0x00关闭写保护
DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*

本文详细介绍了DS1302实时时钟芯片的工作原理及其在微控制器系统中的应用。通过DS1302初始化、读写操作的代码实现,展示了如何设置和读取时间。同时,代码中涉及了BCD码的转换,并利用LCD1602显示时间。此外,还涵盖了主函数中的时间设置和显示功能,包括按键操作和越界判断。
最低0.47元/天 解锁文章
3331





