在前面的课程中咱们现已了解到了不少关于时钟的概念,比方咱们用的单片机的主时钟是11.0592M、I2C总线有一条时钟信号线SCL等,这些时钟本质上都是一个某一频率的方波信号。那么除了这些在前面新学到的时钟概念外,还有一个咱们早已了解的不能再了解的时钟概念——“年-月-日时:分:秒”,便是咱们的挂钟和日历给出的时刻,它的重要程度我想就不需求多说了吧,在单片机体系里咱们把它称作实时时钟,以差异于前面说到的几种方波时钟信号。实时时钟,有时也被称作墙上时钟,很形象的一个名词,对吧,咱们知道它们讲的一回事就行了。本章,咱们将学习实时时钟的运用,有了它,你的单片机体系就能在漫漫历史长河中找到自己的时刻定位啦,能够在指定时刻干某件事,或许记载下某事发生的详细时刻,等等。除此之外,本章还会学习到C言语的结构体,它也是C言语的精华部分,咱们经过本章先来了解它的根底,后边再逐步到达娴熟、灵活运用它,你的编程水平会进步一个层次哦。
1.1BCD码的概念
在日常出产日子顶用的最多的数字是十进制数字,而单片机体系的一切数据本质上都是二进制的,所以聪明的长辈们就给咱们发明了BCD码。
BCD码(Binary-CodedDecimal)亦称二进码十进制数或二-十进制代码。用4位二进制数来一共1位十进制数中的0~9这10个数字。是一种二进制的数字编码办法,用二进制编码的十进制代码。BCD码这种编码办法利用了四个位元来贮存一个十进制的数码,使二进制和十进制之间的转化得以分心的进行。咱们前边讲过十六进制和二进制本质上是一回事,十六进制仅仅是二进制的一种缩写办法罢了。而十进制的一位数字,从0到9,最大的数字便是9,再加1就要进位,所以用4位二进制一共十进制,便是从0b0000到0b1001,不存在0b1010、0b1011、0b1100、0b1101、0b1110、0b1111这6个数字。BCD码假如到了0b1001,再加1的话,数字就变成0b00010000这样了,相当于用了8位的二进制数字一共了2位的十进制数字。
BCD码的运用仍是十分广泛的,比方咱们这节课要学的实时时钟,日期时刻在时钟芯片中的存储格局便是BCD码,当咱们需求把它记载的时刻转化成能够直观显现的ASCII码时(比方在液晶上显现),就能够省去一步由二进制的整型数到ASCII的转化进程,而直接取出一共十进制1位数字的4个二进制位然后再加上0x30就可组成一个ASCII码字节了,这样就会便利的多,在后边的实践例程中将看到这个简略的转化。
1.2SPI时序开端知道
UART、I2C和SPI是单片机体系中最常用的三种通讯协议。前边咱们现已学了UART和I2C通讯协议,这节课咱们来学习剩余的SPI通讯协议。
SPI是英语SerialPeripheralInterface的缩写,望文生义便是串行外围设备接口。SPI是一种高速的、全双工、同步通讯总线,规范的SPI也仅仅运用4个引脚,常用于单片机和EEPROM、FLASH、实时时钟、数字信号处理器等器材的通讯。SPI通讯原理比I2C要简略,它首要是主从办法通讯,这种办法一般只需一个主机和一个或许多个从机,规范的SPI是4根线,别离是SSEL(片选,也写作SCS)、SCLK(时钟,也写作SCK)、MOSI(主机输出从机输入MasterOutput/SlaveInput)和MISO(主机输入从机输出MasterInput/SlaveOutput)。
SSEL:从设备片选使能信号。假如从设备是低电平使能的话,当拉低这个引脚后,从设备就会被选中,主机和这个被选中的从机进行通讯。
SCLK:时钟信号,由主机发生,和I2C通讯的SCL有点相似。
MOSI:主机给从机发送指令或许数据的通道。
MISO:主机读取从机的状况或许数据的通道。
在某些状况下,咱们也能够用3根线的SPI或许2根线的SPI进行通讯。比方主机只给从机发送指令,从机不需求回复数据的时分,那么MISO就能够不要;而在主机只读取从机的数据,不需求给从机发送指令的时分,那MOSI就能够不要;当一个主机一个从机的时分,从机的片选有时能够固定为有用电平而一向处于使能状况,那么SSEL就能够不要;此时假如再加上主机只给从机发送数据,那么SSEL和MISO都能够不要;假如主机只读取从机送来的数据,SSEL和MOSI都能够不要。
3线和2线的SPI咱们要知道怎么回事,实践运用也是有运用的,可是当咱们提及SPI的时分,一般都是指规范SPI,都是指4根线的这种办法。
SPI通讯的主机也是咱们的单片机,在读写数据时序的进程中,有四种办法,要了解这四种办法,首要咱们得学习以下两个名词。
CPOL:ClockPolarity,便是时钟的极性。时钟的极性是什么概念呢?通讯的整个进程分为闲暇时刻和通讯时刻,假如SCLK在数据发送之前和之后的闲暇状况是高电平,那么便是CPOL=1,假如闲暇状况SCLK是低电平,那么便是CPOL=0。
CPHA:ClockPhase,便是时钟的相位。
主机和从机要交流数据,就牵涉到一个问题,即主机在什么时刻输出数据到MOSI上而从机在什么时刻采样这个数据,或许从机在什么时刻输出数据到MISO上而主机什么时刻采样这个数据。同步通讯的一个特色便是一切数据的改变和采样都是伴跟着时钟沿进行的,也便是说数据总是在时钟的边缘邻近改变或被采样。而一个时钟周期必定包含了一个上升沿和一个下降沿,这是周期的界说所决议的,仅仅这两个沿的先后并无规则。又咱们数据从发生的时刻到它的安稳是需求必定时刻的,那么,假如主机在上升沿输出数据到MOSI上,从机就只能在下降沿去采样这个数据了。反之假如一方在下降沿输出数据,那么另一方就有必要在上升沿采样这个数据。
CPHA=1,就一共数据的输出是在一个时钟周期的第一个沿上,至于这个沿是上升沿仍是下降沿,这要视CPOL的值而定,CPOL=1那便是下降沿,反之便是上升沿。那么数据的采样天然便是在第二个沿上了。
CPHA=0,就一共数据的采样是在一个时钟周期的第一个沿上,相同它是什么沿由CPOL决议。那么数据的输出天然就在第二个沿上了。细心想一下,这儿会有一个问题:便是当一帧数据开端传输第一个bit时,在第一个时钟沿上就采样该数据了,那么它是在什么时分输出来的呢?有两种状况:一是SSEL使能的边缘,二是上一帧数据的终究一个时钟沿,有时两种状况还会一同收效。
咱们以CPOL=1/CPHA=1为例,把时序图像出来给咱们看一下,如图15-1所示。
15-1SPI通讯时序图(一)
咱们看图15-1所示,当数据未发送时以及发送结束后,SCK都是高电平,因而CPOL=1。能够看出,在SCK第一个沿的时分,MOSI和MISO会发生改变,一同SCK第二个沿的时分,数据是安稳的,此时采样数据是适宜的,也便是上升沿即一个时钟周期的后沿锁存读取数据,即CPHA=1。留意终究最荫蔽的SSEL片选,这个引脚一般用来决议是哪个从机和主机进行通讯。剩余的三种办法,咱们把图像出来,简化起见把MOSI和MISO合在一同了,咱们细心对照看看研究一下,把一切的理论进程都弄清楚,有利于你对SPI通讯的深刻了解,如图15-2所示。
15-2SPI通讯时序图(二)
在时序上,SPI是不是比I2C要简略的多?没有了开端、中止和应对,UART和SPI在通讯的时分,只担任通讯,不论是否通讯成功,而I2C却要经过应对信息来获取通讯成功失败的信息,所以相对来说,UART和SPI的时序都要比I2C简略一些。
1.3实时时钟芯片DS1302
DS1302是个实时时钟芯片,咱们能够用单片机写入时刻或许读取当时的时刻数据,下面带着咱们经过阅览这个芯片的数据手册来学习和把握这个器材。
咱们IT技能国际化比较强,因而数据手册绝大多数都是英文的,导致许多英语根底欠好的同学看到英文手册头就大了。这儿我要告知咱们的是,只需精力不畏缩,办法总比困难多,许多英语水平不高的,看数据手册照样彻底没问题,咱们咱们用到的专业词汇也就那么几个,多看几回就知道了。咱们现在不是考试,因而咱们能够充分利用一些英文翻译软件,翻译过来的中文意思有时分或许不是那么精确,那你就把翻译的内容和英文手册里的一些图表比较参阅学习。此外数据手册除了介绍性的阐明外,一般还会配相关的图形或许表格,结合起来看也有利于了解手册所表达的意思。这节课我会把DS1302的英文材料尽或许的用比较便于了解的办法给咱们表达出来,同学们能够把我的表达和英文手册多做一下比照,尽或许快的开端学会了解英文手册。
1.3.1DS1302的特色
DS1302是DALLAS(达拉斯)公司推出的一款涓流充电时钟芯片,2001年DALLAS被MAXIM(美信)收买,因而咱们看到的DS1302的数据手册既有DALLAS的标志,又有MAXIM的标志,咱们了解即可。
DS1302实时时钟芯片广泛运用于电话、传真、便携式仪器等产品范畴,它的首要性能指标如下:
1、DS1302是一个实时时钟芯片,能够供应秒、分、小时、日期、月、年等信息,而且还有软件主动调整的才能,能够经过装备AM/PM来决议选用24小时格局仍是12小时格局。
2、具有31字节数据存储RAM。
3、串行I/O通讯办法,相对并行来说比较节约IO口的运用。
4、DS1302的作业电压比较宽,在2.0~5.5V的规模内都能够正常作业。
5、DS1302这种时钟芯片功耗一般都很低,它在作业电压2.0V的时分,作业电流小于300nA。
6、DS1302共有8个引脚,有两种封装办法,一种是DIP-8封装,芯片宽度(不含引脚)是300mil,一种是SOP-8封装,有两种宽度,一种是150mil,一种是208mil。咱们看一下DS1302的引脚封装图,如图15-3所示。
图15-3DS1302封装图
所谓的DIP(DualIn-linePackage)封装,便是双列直插式封装技能,就好像咱们开发板上的STC89C52单片机,便是个典型的DIP封装,当然这个STC89C52还有其它的封装款式,为了便利学习运用,咱们选用的是DIP封装。而74HC245、74HC138、24C02、DS1302咱们用的都是SOP(SmallOut-LinePackage)封装,是一种芯片马虎引出L形引脚的封装技能,咱们能够看看开发板上的芯片,了解一下这些知识性知识。
7、当供电电压是5V的时分,兼容规范的TTL电平规范,这儿的意思是,能够完美的和单片机进行通讯。
8、咱们DS1302是DS1202的晋级版别,所以一切的功用都兼容DS1202。此外DS1302有两个电源输入,一个是主电源,别的一个是备用电源,比方能够用电池或许大电容,这样做是为了在体系掉电的状况下,咱们的时钟还会继续走。假如运用的是充电电池,还能够在正常作业时,设置充电功用,给咱们的备用电池进行充电。
DS1302的特色第二条“具有31字节数据存储RAM”,这是DS1302额定存在的资源。这31字节的RAM相当于一个存储器相同,咱们编写单片机程序的时分,能够把咱们想存储的数据存储在DS1302里面,需求的时分读出来,这块功用和EEPROM有点相似,相当于一个掉电丢掉数据的“EEPROM”,假如咱们的时钟电路加上备用电池,那么这31个字节的RAM就能够代替EEPROM的功用了。这31字节的RAM功用运用很少,所以在这儿咱们就不讲了,咱们了解即可。
1.3.2DS1302的硬件信息
咱们平常所用的不论是单片机,仍是其它一些电子器材,依据运用条件的亏本,能够分为商业级和工业级,首要是作业温度规模的不同,DS1302的购买信息如下图15-4所示。
图15-4DS1302订货信息
咱们在订货DS1302的时分,就能够依据图15-4所标识的来跟出售厂家交流,商业级的作业温度规模略窄,是0~70摄氏度,而工业级能够作业在零下40~85摄氏度。TOPMARK便是指在芯片上印的字。
DS1302一共有8个引脚,下边要依据引脚分布图和典型电路图来介绍一下每个引脚的功用,如图15-5和图15-6所示。
图15-5DS1302引脚图 图15-6DS1302典型电路
1脚VCC2是主电源正极的引脚,2脚X1和3脚X2是晶振输入和输出引脚,4脚GND是负极,5脚CE是使能引脚,接单片机的IO口,6脚I/O是数据传输引脚,接单片机的IO口,7脚SCLK是通讯时钟引脚,接单片机的IO口,8脚VCC1是备用电源引脚。考虑到KST-51开发板是一套以学习为意图的板子,加上备用电池对航空运输和带着不便利,所以8脚没有接备用电池,而是接了一个10uF的电容,这个电容就相当于一个电量很小的电池,经过实验丈量得出其能够在体系掉电后仍和谐DS1302运转1分钟左右,假如咱们想运转时刻再长,能够加大电容的容量或许换成备用电池,假如掉电后不需求它再和谐运转,也能够爽性悬空,如图15-7和图15-8所示。
图15-7DS1302电容作备用电源 图15-8DS1302无备用电源
涓流充电功用,根本也用不到,咱们实践运用中很少会挑选可充电电池作为备用电源,本钱太高,本课程也不讲了,咱们作为选学即可。咱们运用的时分直接用5V电源接一个二极管,在主电源上电的状况下给电容充电,在主电源掉电的状况下,二极管能够避免电容向主电路放电,而仅用来和谐DS1302的供电,这种电路的最大用途是在电池供电体系中替换主电池的时分坚持实时时钟的运转不中止,1分钟的时刻关于替换电池足够了。此外,经过咱们的运用经历,在DS1302的主电源引脚串联一个1K电阻能够有用的避免电源对DS1302的冲击,R6便是这个电阻,而R9、R26、R32都是上拉电阻。
咱们把8个引脚功用别离介绍,如表15-1所示。
表15-1DS1302引脚功用图
引脚编号 |
引脚称号 |
引脚功用 |
1 |
Vcc2 |
主电源引脚,当Vcc2比Vcc1高0.2V以上时,DS1302由Vcc2供电,当Vcc2低于Vcc1时,由Vcc1供电。 |
2 |
X1 |
这两个引脚需求接一个32.768K的晶振,给DS1302供应一个基准。特别留意,要求这个晶振的引脚负载电容有必要是6pF,而不是要加6pF的电容。假如运用有源晶振的话,接到X1上即可,X2悬空。 |
3 |
X2 |
|
4 |
GND |
接地。 |
5 |
CE |
DS1302的使能输入引脚。当读写DS1302的时分,这个引脚有必要是高电平,DS1302这个引脚内部有一个40k的下拉电阻。 |
6 |
I/O |
这个引脚是一个双向通讯引脚,读写数据都是经过这个引脚完结。DS1302这个引脚的内部含有一个40k的下拉电阻。 |
7 |
SCLK |
输入引脚。SCLK是用来作为通讯的时钟信号。DS1302这个引脚的内部含有一个40k的下拉电阻。 |
8 |
Vcc1 |
备用电源引脚。 |
DS1302电路的一个要点便是晶振电路,它所运用的晶振是一个32.768k的晶振,晶振外部也不需求额定增加其它的电容或许电阻了。时钟的精度,首要取决于晶振的精度以及晶振的引脚负载电容。假如晶振禁绝或许负载%&&&&&%过大或过小,都会导致时钟夺冠过大。在这一切都搞定后,终究一个考虑要素是晶振的温漂。跟着温度的改变,晶振的精度也会发生改变,因而,在实践的体系中,其间一种办法便是常常校正。比方咱们所用的电脑的时钟,一般咱们会设置一个选项“将计算机设置与internet时刻同步”。选中这个选项后,一般过一段时刻,咱们的计算机就会和internet时刻校准同步一次。
1.3.3DS1302寄存器介绍
DS1302的一条指令一个字节共8位,其间第7位(即最高位)固定为1,这一位假如是0的话,那写进去也是无效的。第6位是挑选RAM仍是CLOCK的,我前边说过,咱们这儿首要讲CLOCK时钟的运用,它的RAM功用咱们不必,所以假如挑选CLOCK功用,第6位是0,假如要用RAM,那第6位便是1。从第5到第1位,决议了寄存器的5位地址,而第0位是读写位,假如要写,这一位便是0,假如要读,这一位便是1。指令字节直观位分配如图15-9所示。
图15-9DS1302指令字节
DS1302时钟的寄存器,其间8个和时钟有关的,5位地址别离是0b00000~0b00111,还有一个寄存器的地址是01000,这是涓流充电所用的寄存器,咱们这儿不讲。在DS1302的数据手册里的地址,直接把第7位、第6位和第0位值给出来了,所以指令就成了0x80、0x81那些了,最低位是1,那么一共读,最低位是0一共写,如图15-10所示。
图15-10DS1302的时钟寄存器
寄存器0:最高位CH是一个时钟中止标志位。假如时钟电路有备用电源,上电后,咱们要先检测一下这一位,假如这一位是0,那阐明时钟芯片在体系掉电后,咱们备用电源的供应,时钟是继续正常运转的;假如这一位是1,那么阐明时钟芯片在体系掉电后,时钟部分不作业了。假如Vcc1悬空或许是电池没电了,当咱们下次从头上电时,读取这一位,那这一位便是1,咱们能够经过这一位判别时钟在单片机体系掉电后是否还正常运转。剩余的7位高3位是秒的十位,低4位是秒的个位,这儿再提请留意一次,DS1302内部是BCD码,而秒的十位最大是5,所以3个二进制位就够了。
寄存器1:最高位未运用,剩余的7位中高3位是分钟的十位,低4位是分钟的个位。
寄存器2:bit7是1的话代表是12小时制,0代表是24小时制;bit6固定是0,bit5在12小时制下0代表的是上午,1代表的是下午,在24小时制下和bit4一同代表了小时的十位,低4位代表的是小时的个位。
寄存器3:高2位固定是0,bit5和bit4是日期的十位,低4位是日期的个位。
寄存器4:高3位固定是0,bit4是月的十位,低4位是月的个位。
寄存器5:高5位固定是0,低3位代表了星期。
寄存器6:高4位代表了年的十位,低4位代表了年的个位。请特别留意,这儿的00~99指的是2000年~2099年。
寄存器7:最高位一个写保护位,假如这一位是1,那么是制止给任何其它寄存器或许那31个字节的RAM写数据的。因而在写数据之前,这一位有必要先写成0。