AutoLeaders 控制组——郑伟钞51单片机学习第二阶段 DS1302

声明:本文章主要整理自b站视频,详情可以访问https://www.bilibili.com/video/BV1Mb411e7re?p=23

一. 寄存器和计时器

在不明白基本概念的情况下去学习单片机知识是很痛苦的,特别是对于没有学过数电和模电的萌新来说,所以有必要进行一番基本的探索。

寄存器

1. 寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。

触发器:在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当CLK到来时电路才被“触发”而动作,并根据输入信号改变输出状态。把这种在时钟信号触发时才能动作的存储单元电路称为触发器,以区别没有时钟信号控制的 锁存器 。)
锁存器:锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。锁存器是利用电平控制数据的输入,它包括不带使能控制的锁存器和带使能控制的锁存器。)

2. 按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。

计时器

1. 计时器,是利用特定的原理来测量时间的装置。计时器可以用来帮你解决这些问题。操作界面简便易用,提供了基本的计时控制功能,包括:开始计时、停止计时、继续计时、操作界面简便易用复零、调整计时。
2. 现代计时器的种类包括电磁打点计时器、电火花计时器、坚持计时器、停车计时器、反应计时器、放大计时器以及windows计时器等等。电磁打点计时器和电火花打点计时器最为常见。

在51单片机中,每个时钟都有两个功能,分别就是寄存器和计时器,通过不同地代码指令进行启动。

二. DS1302(低功耗实时时钟芯片)

由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片

1)什么是涓细电流充电
1. 涓流充电

涓流充电是从镍氢电池时代开始出现的充电概念一般指的就是小电流充电,模式一般是随着充电状态逐渐提高,电流慢慢变小,越接近满电状态充电电流越小,像是涓涓细流,因此得名。

2. 为什么要有涓细电流充电

涓流充电是用来弥补电池在充满电后由于自放电而造成的容量损失。一般采用脉冲电流充电来实现上述目的。为补偿自放电,使蓄电池保持在近似完全充电状态的连续小电流充电。又称维护充电。电信装置、信号系统等的直流电源系统的蓄电池,在完全充电后多处于涓流充电状态,以备放电时使用。

2)DS1302工作原理

它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
在赋予DS1302初始之后,DS1302自己会进行运作进行时间递增。

3) 芯片引脚及其作用

在这里插入图片描述
CE:相当于开关,在向芯片输入或者读取芯片数据的时候,需要将CE置为高电平,
即通过对应的赋值操作赋值为1。在该芯片中,代表CE口的就是P3^5,对其直接赋值便可以改变它的电平。对应的引脚可以通过原理图查看。
IO:它是该芯片输入输出用的唯一通道,对应引脚为P3^4。
SCLK:它是串行时钟,通过控制其高低电平,进而产生上下沿,以此来读取IO上出现的数据。
其余的引脚都不需要人为操作。

4)三个引脚的相互作用

对实时时钟进行初始赋值,从芯片中读取数据,依靠的都是这三个引脚的相互作用。
时序图,通过该图可以认识到三个引脚在向芯片中输入数据,或者从中读取数据时是如何作用的。
在这里插入图片描述
以基础的线为低电平,高出的部分为高电平,可以看到,总的工作原理就是:
CE置为高电平,SCLK高低电平变化,产生上升沿和下降沿(电平上升和电平下降),在对应上升沿下降沿变化时,从IO中读取一位数据。

我们可以看到IO上分为两个字节(16个bit),前面的一个字节叫做命令字,后面才是我们要输入或者读取的数据。

1. IO口的命令字与数据输入和读取

三者相互作用的内部结构图
在这里插入图片描述
内部时间的变化与储存需要的就是它的寄存器,在它有限的寄存器中,其中一部分就被用来储存时间。
在这里插入图片描述
我们的命令字就是通过赋值来知晓我们调用的是时间的哪一位。
在对应的表格下面,write和read下方的16进制数表示的就是命令字,其中的命令字符合下方另一张表的格式,并且可以看到,每一位时间的命令字都是不一样的,每一位时间读和写的命令字也都不一样。
由此,我们可以通过让芯片读取命令字,知晓我们是选择哪一位时间,读还是写。
注意:在开始之前一定要关闭读写保护,就是上面那个大个表格中的WP,在进行读写操作之前需要让Wp置零,对它操作也需要一个命令字和一个数据,关闭读写保护就把数据写成16进制的0;

所以我们通过两个读取来读取两个字节,就可以把我们想要写的数据写到相应时间位置上。
这里我们通过KeilC51对51单片机的DS1302进行操作。

如代码所表示的

#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
#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[]={19,11,16,12,00,00,6};

void DS1302_Init()
{
	DS1302_CE=0;//初始化低电平
	DS1302_SCLK=0;//初始化低电平
}

void DS1302_WriteByte(unsigned char Command,Data)
{
	
	unsigned char i;
	DS1302_CE=1;//高电平开始输入
   
	for(i=0;i<8;i++)//通过&的操作八次取其每个位置上的数,写到IO口上,IO是来输入的,先输入一个写的指令
{
	DS1302_IO=Command&(0x01<<i);
	DS1302_SCLK=1;//这两个代码是用来实现高低沿进而读取command的
	DS1302_SCLK=0;
}

for(i=0;i<8;i++)
{
	DS1302_IO=Data&(0x01<<i);//写入数据
	DS1302_SCLK=1;
	DS1302_SCLK=0;
}
	
DS1302_CE=0;//最后置零,好习惯
}

command是我们的命令字,Data是我们要输入的数据。
通过调用函数我们就可以进行赋值操作。

同样的,我们通过让芯片读取一个字节并让函数返回一个字节,我们就可以知道对应时间位置上的数据。

unsigned char DS1302_ReadByte(unsigned char Command)
{	
	unsigned char i,Data=0x00;
	Command|=0x01;//将其第一位置为1,因为write第一位是0,刚好反过来,不用再定义一个了
	DS1302_CE=1;
	
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=0;//这两个代码是用来实现高低沿进而读取command的
		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;
}

该代码是上面代码的下半部分。
Command是命令字,Data是读取到对应位置的值。

5) 十进制与BCD码

这个内容与我们输入数据时的操作有关,需要掌握。

1.BCD码

BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用。

在DS1302中,其中的数据是通过BCD码形式运行,于是,在进行输入时,我们要将十进制转化为BCD码再进行输入,在进行读取时,我们要将BCD码(也就是DS1302里的数据)在读出来后转化为十进制

2.BCD码和十进制相互转化

BCD码转化成10进制输出方法: 将BCD码先转换为两字符的16进制字符串的拼接,四个二进制一个十进制的位,注意高低位顺序。 将所完成的16进制字符串拼接输出到可视控件或屏幕,就是显示10进制的字符串。

十进制是逢十进一,而十六进制是逢十六进一,它们之间的每次进位差6,所以一个十进制数要转换成BCD码,要先算清多进位的位数,比如,十进制99进位了99/10=9次,每次进位和十六进制进位相比差6,所以一共差了9×6=54,即99+54=153(BCD)。 BCD码转化成十进制码也一样。

代码的实现

void DS1302_SetTime(void)
{
	
	DS1302_WriteByte(DS1302_Wp,0x00);
	DS1302_WriteByte(DS1302_Year,DS1302_Time[0]/10*16+DS1302_Time[0]%10);//十进制转BCD码后写入,在DS1302中,会把这个数据先转为八位二进制,再分别取前面四位和后面四位表示十进制的十位和个位。
	DS1302_WriteByte(DS1302_Month,DS1302_Time[1]/10*16+DS1302_Time[1]%10);//要写入的地址,写入的东西(年月日)
	DS1302_WriteByte(DS1302_Date,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_Hour,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	DS1302_WriteByte(DS1302_Minute,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	DS1302_WriteByte(DS1302_Second,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	DS1302_WriteByte(DS1302_Day,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	DS1302_WriteByte(DS1302_Wp,0x80);
	
}



void DS1302_ReadTime(void)
{
	unsigned char Temp;
	Temp=DS1302_ReadByte(DS1302_Year);//写完后让它读出来,显示
	DS1302_Time[0]=Temp/16*10+Temp%16;//读取年
	Temp=DS1302_ReadByte(DS1302_Month);
	DS1302_Time[1]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_Date);
	DS1302_Time[2]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_Hour);
	DS1302_Time[3]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_Minute);
	DS1302_Time[4]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_Second);
	DS1302_Time[5]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_Day);
	DS1302_Time[6]=Temp/16*10+Temp%16;
}

到此我们就可以通过最上面的数组的值为DS1302赋值了
要想看看时间,把时间对应时间读取即可。将对应数组元素显示在LCD或者数码管上都可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值