单片机常用总线讲解

上传人:沈*** 文档编号:91511150 上传时间:2022-05-17 格式:DOCX 页数:57 大小:88.79KB
收藏 版权申诉 举报 下载
单片机常用总线讲解_第1页
第1页 / 共57页
单片机常用总线讲解_第2页
第2页 / 共57页
单片机常用总线讲解_第3页
第3页 / 共57页
资源描述:

《单片机常用总线讲解》由会员分享,可在线阅读,更多相关《单片机常用总线讲解(57页珍藏版)》请在装配图网上搜索。

1、-第8章单片机常用总线讲解8.1 C总线接口80C51单片机本身不具有总线接口,但是通过软件进行模拟,可以挂接具有C接口的芯片。8.1.1 C总线的介绍串行扩展总线在单片机系统中的应用是目前单片机技术发展的一种趋势。在目前比较流行的几种串行扩展总线中,总线以其严格的规*和众多带接口的外围器件而获得广泛应用。总线是PHILIPS公司推出的芯片间串行传输总线,它由两根线组成,一根是串行时钟线(SCL),一根是串行数据线(SDA)。主控器利用串行时钟线发出时钟信号,利用串行数据线发送或接收数据。总线由主控器电路引出,凡具有接口的电路(受控器)都可以挂接在总线上,主控器通过总线对受控器进行控制。随着总

2、线研究的深入,总线已经广泛应用于视/音频领域、IC卡行业和一些家电产品中,在智能仪器、仪表和工业测控领域也越来越多地得到应用。8.1.2 总线的特点总线的广泛应用是同它卓越的性能和简便的操作方法分不开的。总线的特点主要表现在以下几个方面:硬件结构上具有相同的硬件接口界面。总线系统中,任何一个总线接口的外围器件,不论其功能差别有多大,都是通过串行数据线(SDA)和串行时钟线(SCL)连接到总线上。这一特点给用户在设计用用系统中带来了极大的便利性。用户不必理解每个总线接口器件的功能如何,只需将器件的SDA和SCL引脚连到总线上,然后对该器件模块进行独立的电路设计,从而简化了系统设计的复杂性,提高了

3、系统抗干扰的能力。线接口器件地址具有根大的独立性。每个接口芯片具有唯一的器件地址,由于不能发出串行时钟信号而只能作为从器件使用。各器件之间互不干扰,相互之间不能进行通信,各个器件可以单独供电。单片机与器件之间的通信是通过独一无二的器件地址来实现的。软件操作的一致性。由于任何器件通过总线与单片机进行数据传送的方式是基本一样的,这就决定了总线软件编写的一致性。PHILIPS公司在推出总线的同时,也为总线制订了严格的规*,如:接口的电气特性、信号时片、信号传输的定义等。规*的严密性,结构的独立性和硬、软件接口界面的一致性.极大地方便了总线设计的模块化和规*化,伴随面来的是用户在使用总线时的“傻瓜”化

4、。8.1.3 总线数据的传输规则在总线上的数据线SDA和时钟线SCL都是双向传输线,它们的接口各自通过一个上拉电阻接到电源正端。当总线空闲时,SDA和SCL必须保持高电平。为了使总线上所有电路的输出能完成一个线“与”的功能,各接口电路的输出端必须是开路漏极或开路集电极。进行数据传送时.在时钟信号高电平期间.数据线上的数据必须保持稳定;只有时钟线上的信号为低电平期间.数据线上的高电平或低电平才允许变化,如图所示。图8-1 数据的有效性在总线的工作过程中,当时钟线保持高电平期间,数据线由高电平向低电平变化定义为起始信号(S)。而数据线由低电平向高电平的变化定义为一个终止倌号(P),如图所示,起始信

5、号和终止信号均由主控器产生。起始条件停止条件图8-2 起始和停止条件总线传送的每一字节均为8位,但每启动一次总线,传输的字节数没有限制,由主控器发送时钟脉冲及起始信号、寻址字节和停止信号,受控器件必须在收到每个数据字节后做出响应,在传送一个字节后的第9个时钟脉冲位,受控器输出低电平作为应答信号。此时.要求发送器在第9个时钟脉冲位上释放SDA线,以便受控器演出应答信号,将SDA线拉或低电平,表示对接收数据的认可,应答信号用或表示.非应答信号用或表示,当确认后,主控器可通过产生一个停止信号来终止总线数据传输。总线数据传输示意图如图所示。起始地址读/写应答数据应答数据应答停止信号信号图8-3总线数据

6、传输示意图需要说明的是,当主控器接收数据时,在最后一个数据字节,必须发送一个非应答位,使受控器释放SDA线,以便主控器产生一个停止信号来终止总线数据传输。3.总线数据的读写格式总线上传送数据的格式是指为被传送的各项有用数据安排的先后顺序,这种格式是人们根据串行通信的特点,传送数据的有效性、准确性和可靠性而制定的。另外,总线上数据的传送还是双向的,也就是说主控器在指令操纵下,既能向受控器发送数据(写入),也能接收受控器中*寄存器中存放的数据(读取).所以传送数据的格式有“写格式”与“读格式”之分。(1)写格式总线数据的写格式如图8-4所示图8-4 总线数据的写格式写格式是指主控器向受控器发送数据

7、,工作过程是:先由主控器发出启动信号(S),随后传送一个带读/写(R/)标记的从地址(SLAVE ADD)字节,从地址只有7bit长,第8位是读/写位(R/),用来确定数据传送的方向,对于写格式,R/应为“0”,表示主控器将发送数据给受控器,接着传送第二个字节,即从地址的子地址(SUB ADD),若受控器有多字节的控制项目,该子地址是指首(第一个)地址,因为子地址在受控器中都是按顺序编制的,这就便于*受控器的数据一次传送完毕;接着才是若干字节的控制数据的传送,每传送一个字节的地址或数据后的第9位是受控器的应答信号,数据传送的顺序要靠主控器中程序的支持才能实现,数据发送完毕后,由主控器发出停止信

8、号(P)。(2)读格式读格式如图所示。与写格式不同,读格式首先要找到读取数据的受控器的地址,包括从地址和子地址,所以格式中在启动读之前,用写格式发送受控器,再启动读格式,不过前3个应答信号因为是指向受控器,所以应由受控器发出;然后,所有数据字节的应答信号因为是指向主控制器,因此由主控器发出。不过最后的A=1。图8-5 受控器向主控器发送数据(读格式)重点提示在设置众多受控器中,为了将控制数据可靠地传逆给指定的受控IC,必须使每一块IC编制一个地址码,通常称为从地址,显然从地址不能在不同的IC间重复使用。主控器发送寻址字节时,总线上所有受控器都将寻址字节中的7位地址与自己的从地址相比较,如果两者

9、相同,则该器件就是被寻址的受控器(从器件),受控器内部的n个数据地址(子地址)的首地址由子地址数据字节指出,总线接口内部具有子地址指针自动加1功能,所以主控器不必一一发送n个数据字节的子地址。4.单片机模拟总线通信单片机在模拟总线通信时,需写出如下几个关键部分的程序:总线初始化、启动信号、应答信号、停止信号、写个字节、读个字节。下面分别给出具体函数的写法供大家参考,在阅读代码时请参考前面相关部分的文字描述及时序图。(1) 总线初始化void int() /将总线都拉高以释放总线 SCL=1; delay(); SDA=1; delay();(2) 启动信号void start() /SCL在高

10、电平期间,SDA一个下降沿启动信号。 SDA=1; delay(); SCL=1; delay(); SDA=0; delay();(3) 应答信号void respons() uchar i=0; SCL=1; delay(); while(SDA=1)&(i255) i+; SCL=0; delay();SCL在高电平期间,SDA被从设备拉为低电平表示应答。上面代码中有一个(SDA=1)和(i255)相与的关系,表示若在一段时间内没有收到从器件的应答则主器件默认从器件已经收到数据而不在等待应答信号,这一点是作者后加的一步,大家可不必深究,因为如果不加这个延时退出,一旦从器件没有发送应答信号

11、,程序将永远停止在这里,而真正的程序中是不允许这样的情况发生的。(4) 停止信号void stop() /SCL在高电平期间,SDA一个上升沿停止信号。 SDA=0; delay(); SCL=1; delay(); SDA=1; delay();(5) 写一个字节void writebyte(uchar date) uchar i,temp; temp=date; for(i=0;i8;i+) Temp=temp1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay();SCL=0;delay();SDA=1;delay();串行发送一个字节时,需要

12、把这个字节中的8位一位一位地发出去,“Temp=temp1;”表示将temp左移位,最高位将移入PSW寄存器的CY位中,然后将CY赋给SDA进而在SCL的控制下发送出去。(6) 读一个字节uchar readbyte() uchar i,k; SCL=0; delay(); SDA=1; for(i=0;i8;i+) SCL=1; delay(); k=(k1)|SDA; SCL=0; delay();delay();return k;同样的,串行接收个字节时需将8位一位一位地接收,然后再组合成一个字节,上面代码中我们定义了一个临时变量k,将k左移一位后与SDA进行“或运算,依次把8个独立的位

13、放入一个字节中来完成接收。8.1.4 总线实例应用(AT24C02)具有总线接口的PROM有多个厂家的多种类型产品。在此仅介绍ATMEL公司生产的AT24C系列PROM。主要型号有AT24C01/02/04/08/16等,其对应的存储容量分别为128*8/256*8/521*8/1024*8/2048*8。采用这类芯片可解决掉电数据保存问题,可对所存数据保存100年.并可多次擦写,擦写次数可达10万次以上。在一些应用系统设计中,有时需要对工作数据进行掉电保护,如电子式电能表等智能化产品。若采用普通存储器,在掉电时需要备引电池供电,并需要在硬件上增加掉电检测电路。但存在电池不可靠及扩展存储芯片占

14、用单片机过多口线的缺点。采用具有总线接口的串行PROM器件可很好地解决掉电数据保存问题,且硬件电路简单。下面以AT24C02芯片为例,介绍具有总线接口的PROM的具体应用。AT24C02芯片的常用封装形式有直插(DIP8)式和贴片(SO-8)式两种,实物图分别如图和图所示。图8-6直插式AT24C02 图8-7 贴片式AT24C02无论是直插式还是贴片式,其引脚功能与序号都一样,引脚图如图所示。图8-8 AT24C02引脚图各引脚功能如下:1,2,3,(A0、A1、A2)可编程地址输入端。4(GND)电源地。5(SDA)串行数据输入/输出端。6(SCL)串行时钟输入端。7(WP)写保护输入端,

15、用于硬件数据保护。当其为低电平时,可以对整个存储器进行正常的读/写操作;当其为高电平时,存储器具有写保护功能,但读操作不受影响。8()电源正端。2.存储结构与寻址AT24C02的存储容量为2KB,内部分成32页,每页8B,共2S6B,操作时有两种寻址方式;芯片寻址和片内子地址寻址。(1)芯片寻址。AT24C02的芯片地址为1010,其地址控制字格式为1010A2A1A0R/W。其中A2,A1,A0为可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。R/为芯片读写控制位,该位为0,表示对芯片进行写操作;该位为1,表示对芯片进行读操

16、作。(2)片内子地址寻址。芯片寻址可对内部256B中的任一个进行读/写操作,其寻址*围为00FF,共256个寻址单元。3.读/写操作时序串行PROM一般有两种写入方式:一种是字节写入方式,另一种是页写入方式。页写入方式允许在一个写周期内(10ms左右)对一个字节到一页的若干字节进行编程写入,AT24C02的页面人小为8B。采用页写方式可提高写入效率,但也容易发生事故。AT24C系列片内地址在接收到每个数据字节后自动加1,故装载顷以内数据字节时,只需输入首地址,如果写到此页的最后个字节,主器件继续发送数据,数据将重新从该页的首地址写入,进而造成原来的数据丢失,这就是页地址空间的“上卷”现象。解决

17、“上卷”的方法是:在第8个数据后将地址强制加1,或是将下一页的旨地址重新赋给寄存器。(1)字节写入方式。单片机在次数据帧巾只访问PROM一个单元。该方式下,单片机先发送启动信号,然后送个字节的控制字,再送一个字节的存储器单元子地址,上述几个宁节都得到PROM响应后,再发送8位数据,最后发送1位停止信号。发送格式如图所示。图8-9字节写入方式发送格式(2)页写入方式。单片机在一个数据与周期内可以连续访问1页(8个)PROM存储单元。在该方式中,单片机先发送启动信号,接着送个字节的控制字,再送1个字节的存储器起始单元地址,上述几个字节都得到PROM应答后就可以发送最多1页的数据,并顺序存放在以指定

18、起始地址开始的相继单元中,最后以停止信号结束。页写入帧格式如图所示。图8-10页写入帧格式(3)指定地址读操作。读指定地址单元的数据。单片机在启动信号后先发送含有片选地址的写操作控制字,PROM应答后再发送1个(2KB以内的PROM)字节的指定单元的地址,PROM应答后再发送1含有片选地址的读操作控制字,此时如果PROM做出应答,被访问单元的数据就会按SCL信号同步出现在串行数据/地址线SDA上。这种读操作的数据帧格式如叫所示。图8-11指定地址读操作数据帧格式(4)指定地址连续读。此种方式的读地址控制与前面指定地址读相同。单片机接收到每个字节数据后应做出应答,只要PROM检测到应答信号,其内

19、部的地址寄存器就自动加1指向下一单元,并顺序将指向的单元的数据送到SDA串行数据线上。当需要结束读操作时,单片机接收到数据后在需要应答的时刻发送一个非应答信号,接着再发送一个停止信号即可。这种读操作的数据帧格式如图所示。图8-12指定地址连续读数据帧格式4.T*-1C实验板上AT24C02连接图。T*-1C实验板上AT24C02与单片机连接如图所示,其中A0,A1,A2与WP都接地,SDA接单片机P2.0脚,SCL接单片机P2.1脚,SDA与SCL分别与之间接一10k上拉电阻,因为AT24C02总线内部是漏极开路形式,不接上拉电阻无法确定总线空队列的电平状态。图8-13 T*-1实验板上AT2

20、4C02连接图例:用C语言编写程序,在T*1C实验板上实现如下功能:利用定时器产生一个099秒变化的秒表,并且显示在数码管上,每过一秒将这个变化的数写入板上AT24C02内部。当关闭实验板电源,并再次打开实验板电源时,单片机先从ATZ4C02中将原来写入的数读取出来,接着此数继续变化并显示在数码管上。通过本实验可以看到,若向AT24C02中成功写入,并且成功读取则数码管上显示的数会接着关闭实验板时的数继续显示,否则有可能显示乱码。新建文件part2.6_1.c.程序代码如下:#include#define uchar unsigned char#define uint unsigned int

21、bit write=0; /写24C02的标志;sbit sda=P20;sbit scl=P21;sbit dula=P26;sbit wela=P27;uchar sec,tt;uchar code table=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71;void delay();void delay1m(uint z) uint *,y; for(*=z;*0;*-) for(y=110;y0;y-);void start() /开始信号 sda=1; delay(); s

22、cl=1; delay(); sda=0; delay();Void stop() /停止 sda=0; delay(); scl=1; delay(); sda=1; delay();Void respons() /应答 uchar i; scl=1; delay(); while(sda=1)&(i255) i+; scl=0; delay();Void int() /将总线都拉高以释放总线 scl=1; delay(); sda=1; delay();void write_byte(uchar date) uchar i,temp; temp=date; for(i=0;i8;i+) T

23、emp=temp1; scl=0; delay(); sda=CY; delay(); scl=1; delay();scl=0;delay();sda=1;delay();uchar read_byte() uchar i,k; scl=0; delay(); sda=1; for(i=0;i8;i+) scl=1; delay(); k=(k100) sec=0; TMOD=0*01; /定时器工作在方式1 ET0=1; EA=1; TH0=(65536-50000)/256; /对TH0 TL0赋值 TL0=(65536-50000)%256; /使定时器0.05秒中断一次 TR0=1;

24、 while(1) display(sec/10,sce%10); if(write=1) write=0; /清0 write_add(2,sec); /在24c02的地址2中写入数据secvoid t0() interrupt 1 /定时中断服务函数 TH0=(65536-50000)/256; /对TH0 TL0赋值 TL0=(65536-50000)%256; /对装计数初值 tt+; /每过50ms tt加一 if(tt=20) /计满20次(1秒)时 tt=0; /重新再计 sec+; write=1; /1秒写一次24C02 if(sce=100) /定时100秒,再从零开始计时

25、 sec=0;分析如下:(1)“void delay();”是个微秒级延时函数,以前编写的延时函数内部都是用变量递增或是递减来实现延时,而这个函数是用空语句来实现短时间延时的,在Keil软件中设置晶振为11.0592MHz时,该延时函数延时人概45微秒,用来操作总线时用。(2)“void write_add(uchar sddress,uchar date)”和“uchar read_add(uchar sddress)”两个函数分别实现向AT24CO2的任地址写字节的数据和从AT24CO2中任一地址读取字节数据的功能,函数操作步骤完全遵循前面讲解的操作原理,请人家参考对照。(3) sec=r

26、ead_add(2); /读出保存的数据赋给secif(sec100) /以防止首次读取出错误数据 sec=0;在主程序的开始处先读取上次写入AT24C02的数据,下面两句是为了防止第一次操作AT24C02时出现意外而加的,若是全新的AT24C02芯片或是以前已经被别人写过的不知道是什么内容的芯片,首次上电后读出来的数据我们无法知道,若是大于100的数将无法在数码管上显示向造成乱码,若是100以内的数还好处理。人家可自行修改程序使错误出现,再尝试修改程序看能否将错误排除。实例演示实际现象如图所示。图8-14 实际现象效果图8.2 SPI总线接口8.2.1 SPI总线的介绍 SPI, Seria

27、l Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的, 它允许 MCU 以全双工的同步串行方式, 与各种外围设备进行高速数据通信. SPI 主要应用在 EEPROM, Flash, 实时时钟(RTC), 数模转换器(ADC), 数字信号处理器(DSP) 以及数字信号解码器之间. 它在芯片中只占用四根管脚 (Pin) 用来控

28、制以及数据传输, 节约了芯片的 pin 数目, 同时为 PCB 在布局上节省了空间. 正是出于这种简单易用的特性, 现在越来越多的芯片上都集成了 SPI技术.8.2.2 SPI总线实例应用(DS1302)DS1302简介:DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。引脚及其功能结构如图所示图8-15 DS1302外部引脚分配DS1302的引脚排列,其中

29、Vcc1为后备电源,VCC2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。*1和*2是振荡源,外接32.768kHz晶振。 CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问为寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。I/O:串行数据输入输出端(双向),后面有详细说明。SCLK:时钟输入端。命令字节每一数据传送都需要由命令字节初始化。命令字节的最高位(位7)

30、必须为1;位6为0表示对时钟数据操作,为1表示对RAM数据操作;位15指定读写操作的寄存器;位0为0表示写操作,位1表示读操作;命令字节总是从最低有效位开始传送的。命令字节格式如下:图8-16 控制字(即地址及命令字节)芯片复位与时钟控制CE复位引脚有两种功能:CE引脚接通控制逻辑,允许地址/命令序列送入移位寄存器;CE引脚可以终止单字节或多字节数据的传送。当CE为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。时钟周期是下降沿跟随上升沿的序列,对于数据输入,则在时钟上升沿时数据必须有效,输出数据时,数据在时钟的下降沿输出。如果在传送过程中将CE引脚置为低电平,则会终止此次数据传

31、送,使I/O引脚变为高阻态。上电运行时,在VCC2.0V之前,CE必须保持低电平。只有在SCLK为低电平时,才能将CE置为高电平。读数据/写数据如图和图图8-17 单字节读图8-18 单字节写数据输入紧跟写命令字节的8个SCLK之后的8个SCLK周期的上升沿,将数据写入DS1302,数据从低位开始写入。数据输出紧跟写命令字节的8个SCLK之后的8个SCLK周期的下降沿,将数据从DS1302输出。输出的第一个数据位出现在写命令字节的最后一位后的第1个下降沿。多字节方式读写通过对地址31寻址(地址命令位15全为1),则可以对时钟和RAM寄存器实现多字节读写操作,又称为突发模式。同样,地址命令位6选

32、择时钟或RAM,而位0选择读或写。再多字节操作方式下,不能操作地址为931的时钟寄存器,也不能操作地址为31的RAM寄存器。在多字节读写操作中,从地址0的0位开始。时钟时间与日期可以通过读DS1302的*些字节得到。通过写*些寄存器字节可以设置时间和日期,这些寄存器如表8-1所示。表8-1 DS1302寄存器表中每个寄存器都有读地址与写地址,前七个寄存器为:秒、分、小时、日期、月、星期、年,随后是写保护寄存器和充电保护寄存器。时间和日期以BCD格式保存。小时寄存器的第7位为1,为12小时模式;位5显示AM/PM,当位5为1时,表示PM,为0时,表示AM。位7为0时是24小时模式,这时位5是小时

33、的最高位。秒寄存器的第7位为始终暂停位(CH),该位为1时,时钟停止,DS1302处于低功耗状态,消耗电流为100nA;该位为0时,启动时钟。控制寄存器的第7位(WP)是写保护位,该位为0才能进行写时钟与RAM寄存器操作;为1时,阻止写操作。上电后该位状态不定,所以在写操作前应该先清除该位。一些参数表8-2 DS1302参数时序图读数据与写数据时CE、SCLK和I/O之间的时序图8-19如图8-19与图8-20所示。图中的时间参数如表8-3所示。由表8-3可以看出,芯片工作在5V,最小时间中最大的时间长度都小于1s,也就是说只要时间大于1s,就可以满足DS1302芯片的动作要求。例如,时间,在

34、CE跳到高电平之后,SCLK应该在1s后才能跳到高电平。因此对已工作在11.0592MHz的51单片机,其每条指令的执行时间大于1s。若第一条指令使CE跳到高电平,第二条指令使SCLK上跳到高电平,则间隔时间为1s,因此可以满足时序要求。表8-3 时间参数(条件:VCC=5V)参数参数值数据与CLK建立最小50ns时钟与数据保持最小70ns时钟与数据延时最大200s时钟低电平最小250ns时钟高电平最小250ns时钟频率直流最大2MHz时钟上升与下降,最大500nsCE与CLK建立最小1sCLK与CE保持最小60nsCE无效时间最小1sCE与I/O高阻最大70nsSCLK与I/O高阻最大70n

35、s图8-19 读数据时CE、SCLK、和I/O之间的时序图图8-20 写数据时CE、SCLK和I/O之间的时序图一些经典程序从DS1302读出一个字节数据的51单片机程序sclk=0; /使sclk为低电平ce=0; /使ce为低电平ce=1; /ce信号上跳,到此DS1302已经准备好接收数据i/o=a0; /将输出的命令a0送上i/o数据线sclk=1; / sclk信号上跳sclk=0; /返回低电平,为下次上跳做准备i/o=a1; /将输出的命令a1送上i/o数据线sclk=1; / sclk信号上跳sclk=0; /返回低电平,为下次上跳做准备.i/o=a7; /直到命令最后一位sc

36、lk=1; / sclk信号上跳,到此为止,命令字节发送完毕 /以下为读数据操作sclk=0; / sclk信号下跳,使DS1302的数据送上i/o线clock_dat=1; /准双向口设置为输出a0=i/o; /从i/o数据线上接收数据a0sclk=1; /为下次下跳做准备sclk=0; /下跳,使DS1302输出数据a1=i/o; /接收数据.sclk=1; sclk=0;a7=i/o; /接收最后一位数据a7ce=0; /一次读操作完毕sclk=1;向DS1302写入一个字节数据的51单片机程序sclk=0; /使sclk为低电平ce=0; /使ce为低电平ce=1; /ce信号上跳,到

37、此DS1302已经准备好接收数据i/o=a0; /将输出的命令a0送上i/o数据线sclk=1; / sclk信号上跳sclk=0; /返回低电平,为下次上跳做准备i/o=a1; /将输出的命令a1送上i/o数据线sclk=1; / sclk信号上跳sclk=0; /返回低电平,为下次上跳做准备.i/o=a7;/直到命令最后一位sclk=1; / sclk信号上跳,到此为止,命令字节发送完毕/以下为写数据操作sclk=0; / sclk信号下跳,为发送数据做准备i/o=a0; /将输出的命令a0送上i/o数据线sclk=1; / sclk信号上跳sclk=0; /返回低电平,为下次上跳做准备i

38、/o=a1; /将输出的命令a1送上i/o数据线sclk=1; / sclk信号上跳sclk=0; /返回低电平,为下次上跳做准备.i/o=a7; /直到写入命令最后一位sclk=1; / sclk信号上跳,到此为止,命令字节发送完毕sclk=0; / sclk信号下跳,为下次上跳做准备ce=0; /结束一次数据写入操作sclk=1;例:试验数码管显示时钟实验图8-21如下所示:图8-21 DS1302与89C2051的连接图注意:短路冒一定要接上。通过本例程了解 DS1302时钟芯片的基本原理和使用 ,理解并掌握DS1302时钟芯片驱动程序的编写以及实现数字字符在数码管中的显示。请学员认真消

39、化本例程,懂DS1302在C语言中的操作#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit SCK=P36; /时钟sbit SDA=P34; /数据sbit RST = P35; / DS1302复位sbit LS138A=P22; sbit LS138B=P23;sbit LS138C=P24; bit ReadRTC_Flag; /定义读DS1302标志unsigned char l_tmpdate7=0,0,12,15,5,3,8;/秒分时日月周年08-05-15 12:00:00unsigned char l_tmpdispl

40、ay8;code unsigned char write_rtc_address7=0*80,0*82,0*84,0*86,0*88,0*8a,0*8c; /秒分时日月周年最低位读写位code unsigned char read_rtc_address7=0*81,0*83,0*85,0*87,0*89,0*8b,0*8d; code unsigned char table=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*40; /共阴数码管 0-9 - 熄灭表/*/* 函数声明 */*/void Write_Ds1302_byte(u

41、nsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address );void Read_RTC(void);/read RTC void Set_RTC(void); /set RTC void InitTIMER0(void);/inital timer0/*/* 主函数 */*/void main(void) InitTIMER0(); /初始化定时器0Set_RTC(); /写入时钟值,如果使

42、用备用电池时候,不需要没每次上电写入,此程序应该屏蔽while(1) if(ReadRTC_Flag) ReadRTC_Flag=0;Read_RTC();l_tmpdisplay0=l_tmpdate2/16; /数据的转换,因我们采用数码管09的显示,将数据分开l_tmpdisplay1=l_tmpdate2&0*0f;l_tmpdisplay2=10;/加入-l_tmpdisplay3=l_tmpdate1/16;l_tmpdisplay4=l_tmpdate1&0*0f;l_tmpdisplay5=10;l_tmpdisplay6=l_tmpdate0/16;l_tmpdisplay7

43、=l_tmpdate0&0*0f; /*/* 定时器0初始化 */*/void InitTIMER0(void) TMOD|=0*01;/定时器设置 16位 TH0=0*ef;/初始化值 TL0=0*f0; ET0=1; TR0=1; EA=1;/*/* 写一个字节 */*/void Write_Ds1302_Byte(unsigned char temp) unsigned char i; for (i=0;i=1; /右移一位 SCK=1; /*/* 写入DS1302 */*/void Write_Ds1302( unsigned char address,unsigned char da

44、t ) RST=0;_nop_();SCK=0;_nop_();RST=1; _nop_(); /启动Write_Ds1302_Byte(address);/发送地址Write_Ds1302_Byte(dat);/发送数据RST=0; /恢复/*/* 读出DS1302数据 */*/unsigned char Read_Ds1302 ( unsigned char address )unsigned char i,temp=0*00;RST=0;_nop_();_nop_();SCK=0;_nop_();_nop_();RST=1;_nop_();_nop_();Write_Ds1302_Byt

45、e(address);for (i=0;i=1;/右移一位_nop_(); _nop_(); _nop_();SCK=1; RST=0;_nop_();/以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return (temp);/返回/*/* 读时钟数据 */*/void Read_RTC(void) /读取日历 unsigned char i,*p; p=read_rtc_

46、address; /地址传递 for(i=0;i7;i+) /分7次读取秒分时日月周年 l_tmpdatei=Read_Ds1302(*p); p+; /*/* 设定时钟数据 */*/void Set_RTC(void) /设定日历unsigned char i,*p,tmp;for(i=0;i7;i+) /BCD处理tmp=l_tmpdatei/10;l_tmpdatei=l_tmpdatei%10;l_tmpdatei=l_tmpdatei+tmp*16; Write_Ds1302(0*8E,0*00);p=write_rtc_address;/传地址for(i=0;i7;i+)/7次写入

47、秒分时日月周年 Write_Ds1302(*p,l_tmpdatei); p+; Write_Ds1302(0*8E,0*80);/*/* 定时器中断函数 */*/void tim(void) interrupt 1 using 1 /中断,用于数码管扫描 static unsigned char i,num; TH0=0*f5; TL0=0*e0;P0=tablel_tmpdisplayi;/查表法得到要显示数字的数码段 switch(i) case 0:LS138A=0; LS138B=0; LS138C=0; break; case 1:LS138A=1; LS138B=0; LS138C=0; break; case 2:LS138A=0; LS138B=1; LS138C=0; break; case 3:LS138A=1; LS138B=1; LS138C=0; brea

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!