第9章单片机的串行扩展技术.ppt
第9章 单片机的串行扩展技术,9.1 串行扩展概述 新一代单片机技术的显著特点之一就是串行扩展总线的推出。在没有专门的串行扩展总线时,除了可以使用UART串行口的移位寄存器方式扩展并行I/O外,只能通过并行总线扩展外围器件。由于并行总线扩展时连线过多,外围器件工作方式各异,外围器件与数据存储器混合编址等,外围器件在系统中软、硬件的独立性较差,无法实现单片机应用系统的模块化、标准化设计。这给单片机应用系统设计带来了很大困难。,9.1.1串行扩展的特点 串行扩展总线技术是新一代单片机技术发展的一个显著特点。与并行扩展总线相比,串行扩展总线有突出的优点:电路结构简单,程序编写方便,易于实现用户系统软硬件的模块化、标准化等。9.1.2串行扩展的种类 目前在新一代单片机中使用的串行扩展接口有Motorola的SPI,NS公司的Microwire/Plus和Philips公司的I2C总线、其中总线I2C具有标准的规范以及众多带I2C 接口的外围器件,形成了较为完备的串行扩展总线。,(1)I2C总线(两线制)I2C(IIC)总线是Philips公司推出的芯片间串行传输总线。它用两根线实现了完善的全双工同步数据传送,可以极为方便地构成多机系统和外围器件扩展系统。I2C总线采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有简单灵活的扩展方法。(2)One-wire总线(一线制)One-wire总线是Dallas公司研制开发的一种协议。它利用一根线实现双向通信,由一个总线主节点、一个或多个从节点组成系统,通过一根信号线对从芯片进行数据的读取。每一个符合One-wire总线协议的从芯片都有一个唯一的地址,包括48位的序列号、8位的分类码和8位的CRC代码。主芯片对各个从芯片的寻找依据这64位的不同来进行。,(3)SPI串行扩展接口(三线制)SPI(Serial Peripheral Interface,串行外设接口)总线系统是Motorola公司提出的一种同步串行外设接口,允许MCU与各种外围设备以同步串行方式进行通信,其外围设备种类繁多,从最简单的TTL移位寄存器到复杂的LCD显示驱动器、网络控制器等,可谓应有尽有。SPI总线提供了可直接与各厂家生产的多种标准外围器件直接连接的接口,该接口一般使用4根线:串行时钟线SCK、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS。由于SPI系统总线只需3根公共的时钟数据线和若干位独立的从机选择线(依据从机数目而定),在SPI从设备较少而没有总线扩展能力的单片机系统中使用特别方便。即使在有总线扩展能力的系统中采用SPI设备也可以简化电路设计,省掉很多常规电路中的接口器件,从而提高了设计的可靠性。,(4)USB串行扩展接口 USB比较于其他传统接口的一个优势是即插即用的实现,即插即用(Plug-and-Play)也可以叫做热插拔(Hot plugging)。USB接口的最高传输率可达12Mbit/s。一个USB口理论上可以连接127个USB设备,连接的方式也十分灵活。(5)Microware串行扩展接口 Microwire串行通信接口是NS公司提出的,Microwire是串行同步双工通信接口,由一根数据输出线、一根数据输入线和一根时钟线组成。所有从器件的时钟线连接到同一根SK线上,主器件向SK线发送时钟脉冲信号,从器件在时钟信号的同步沿作用下输出/输入数据。主器件的数据输出线DI和所有从器件的数据输入线相接,从器件的数据输出线都接到主器件的数据输入线DO上。与SPI接口类似,每个从器件也都需要另外提供一条片选通线CS。,(6)CAN总线 CAN,全称为“Controller Area Network”,即控制器局域网,是国际上应用最广泛的现场总线之一。最初,CAN被设计作为汽车环境中的微控制器,在车载各电子控制装置ECU之间交换信息,形成汽车电子控制网络。比如:发动机管理系统、变速箱控制器、仪表装备,由德国Bosch公司最先提出的电子主干系统中,均嵌入CAN控制装置。一个由CAN总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。CAN可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。另外,硬件的错误检定特性也增强了CAN的抗电磁干扰能力。CAN是一种多主方式的串行通信总线,基本设计规范要求有高的位速率,高抗电磁干扰性,而且能够检测出产生的任何错误。当信号传输距离达10km时,CAN仍可提供高达50Kbit/s的数据传输速率。,9.2 I2C总线的串行扩展 单片机应用系统正向小型化、高可靠性、低功耗等方向发展。在一些设计功能较多的系统中,常需扩展多个外围接口器件。若采用传统的并行扩展方式,将占用较多的系统资源,且硬件电路复杂,成本高、功耗大、可靠性差。为此,Philips公司推出了一种高效、可靠、方便的串行扩展总线I2C总线。单片机系统采用I2C总线后将大大简化电路结构,增加硬件的灵活性,缩短产品开发周期,降低成本,提高系统可靠性。I2C总线(Inter IC BUS)是Philips推出的芯片间串行传输总线。它以两根连线实现了完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。I2C总线采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有最简单而灵活的扩展方法。,9.2.1 I2C总线器件应用概述一、I2C总线器件 目前许多单片机厂商引进了Philips公司的I2C总线技术,推出了许多带有I2C总线接口的单片机。Philips公司除了生产具有I2C总线接口的单片机外,还推出了许多具备I2C总线的外部接口芯片,如24XX系列的EEPROM、128字节的静态RAM芯片PCF8571、日历时钟芯片PCF8563、4位LED驱动芯片SAA1064、160段LCD驱动芯片PCF8576等多种类多系列接口芯片。二、I2C总线工作原理 采用I2C总线系统结构如下图9-1所示。,图9-1 I2C总线系统结构图 其中,SCL是时钟线,SDA是数据线。总线上的各器件都采用漏极开路结构与总线相连,因此,SCL、SDA均需接上拉电阻,总线在空闭状态下均保持高电平。I2C总线支持多主和主从两种工作方式,通常为主从工作方式。在主从工作方式中,系统中只有一个主器件(单片机),总线上其它器件都是具有I2C总线的外围从器件。在主从工作方式中,主器件启动数据的发送(发出启动信号),产生时钟信号,发出停止信号。为了实现通信,每个从器件均有唯一一个器件地址,具体地址由I2C总线委员会分配。,(一)I2C总线工作方式 I2C总线上进行一次数据传输的通信格式如下图9-2所示。,(二)I2C总线数据传输方式模拟 目前已有多家公司生产具有I2C总线的单片机,如Philips、Motorola、韩国三星、日本三菱等公司。这类单片机在工作时,总线状态由硬件监测,无须用户介入,应用非常方便。对于不具有I2C总线接口的MCS-51单片机,在单主机应用系统中可以通过软件模拟I2C总线的工作时序,在使用时,只需正确调用该软件包就可很方便地实现扩展I2C总线接口器件。,I2C总线软件包组成:启动信号子程序STA停止信号子程序STOP发送应答位子程序MACK发送非应答位子程序MNACK应答位检查子程序CACK单字节发送子程序WRBYT单字节接收子程序RDBYTn字节发送子程序WRNBYTn字节接收子程序RDNBYT,9.2.2 EEPROM AT24CXX系列 具有I2C总线接口的EEPROM 拥用多个厂家的多种类型产品。在此仅介绍ATMEL公司生产的AT24CXX系列EEPROM,主要型号有AT24C01/02/04/08/16,其对应的存储容量分别为1288/2568/5128/10248/20488。采用这类芯片可解决掉电数据保护问题,可对所存数据保存100年,并可多次擦写,擦写次数可达10万次。在一些应用系统设计中,有时需要对工作数据进行掉电保护,如电子式电能表等智能化产品。若采用普通存储器,在掉电时需要备用电池供电,并需要在硬件上增加掉电检测电路,但存在电池不可靠及扩展存储芯片占用单片机过多端口的缺点。采用具有I2C总线接口的串行EEPROM器件可很好地解决掉电数据保持问题,且硬件电路简单。,一、现在以AT24C02为例,讲述其结构及功能(一)AT24C02的引脚功能 AT24C02芯片的常用封装形式有直插(DIP8)式和贴片(SO-8)式两种,AT24C02直插式引脚图如下图9-3所示。,各引脚功能如下:1脚,2脚,3脚(A0、A1、A2)-可编程地址输入端;4脚(GND)-电源地;5脚(SDA)-串行数据输入/输出端;6脚(SCL)-串行时钟输入端;7脚(WP)-写保护输入端,用于硬件数据保护;当其为低电平时,可以对整个存储器进行正常的读/写操作;当其为高电平时,存储器具有写保护功能,但读操作不受影响。8脚(VCC)-电源正端。,(二)AT24C02存储结构与寻址 AT24C02的存储容量为256B,内部分成32页,每页8B。操作时有两种寻址方式:芯片寻址和片内地址寻址。AT24C02的芯片地址为1010,其地址控制字格式为1010A2A1A0D0.其中A2,A1,A0为可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。D0为芯片读写控制位,该位为0,表示对芯片进行写操作;该位为1,表示对芯片进行读操作。片内地址寻址可对内部256B中的任一个地址进行读/写操作,其寻址范围为0X00-0Xff,共256个寻址单元。(三)AT24C02读/写操作时序 串行EEPROM一般有两种写入方式:一种是字节写入方式,另一种是页写入方式。页写入方式允许在一个写周期内(10ms左右)对一个字节到一页的若干字节进行编程写入,AT24C02的页面大小为8B。采用页写方式可提高写入效率,但也容易发生事故。AT24C02系列片内地址在接收到每一个数据字节后自动加1,故装载一页以内数据字节时,只需输入首地址。如果写到此页的最后一个字节,主器件继续发送数据,数据将重新从该页的首地写入,进而造成原来的数据丢失,这就是页地址空间的“上卷”现象。解决“上卷”的方法是:在第8个数据后将地址强制加1,或是将下一页的首地址重新赋给寄存器。,1.字节写入方式:单片机在一次数据帧中只访问EEPROM一个单元。在这种方式下,单片机先发送启动信号,然后送一个字节的控制字,再送一个字节的存储器单元子地址,上述几个字节都得到EEPROM响应后,再发送8位数据,最后发送1位停止信号。发送格式如下图9-4所示。,图9-4 字节写入时序图,2.页写入方式:单片机在一个数据写周期内可以连续访问1页(8个)EEPROM存储单元。在该方式中,单片机先发送启动信号,接着送一个字节的控制字,再送1个字节的存储器单元地址,上述几个字节都得到EEPROM应答后就可以送最多1页的数据,并顺序存放在以指定起始地址开始的相继单元中,最后以停止信号结束,页写入帧格式如下图9-5所示。,图9-5 页写入时序图,3.指定地址读操作:读指定地址单元的数据。单片机在启动信号后先发送含有片选地址的写操作控制字,EEPROM应答后再发送1个(2KB以内的EEPROM)字节的指定单元的地址,EEPROM应答后再发送1个含有片选地址的读操作控制字,此时如果EEPROM作出应答,被访问单元的数据就会按SCL信号同步出现在串行数据/地址线SDA上。这种读操作的数据帧格式如下图9-6所示。,图9-6 指定地址字节读时序图,4.指定地址连续读:此种方式的读地址控制与前面指定地址读相同。单片机接收到每个字节数据后应做出应答,只要EEPROM检测到应答信号,其内部的地址寄存器就自动加1指向下一单元,并顺序将指向的单元的数据送到SDA串行数据线上。当需要结束读操作时,单片机接收到数据后在需要应答的时刻发送一个非应答信号,接着再发送一个停止信号即可。这种读操作的数据帧格式如下图9-7所示。,图9-7 连续字节读时序图,二、AT24C系列存储卡简介(一)IC卡标准与引脚定义 IC卡标准与引脚定义如下图9-8所示。,图9-8 IC卡示意图 1987年,国际标准化组织ISO专门为IC卡制定了国际标准:ISO/IEC7816-1、2、3、4、5、6,这些标准为IC卡在全世界范围内的推广和应用创造了规范化的前提和条件,使IC卡技术得到了飞速的发展。根据国际标准ISO 7816对接触式IC卡的规定,在IC卡的左上角封装有IC芯片,其上覆盖有6或8个触点和外部设备进行通信,见上图9-8。部分触点及其定义如下表9-1所示。,表9-1 IC卡引脚定义,(二)AT24C系列存储卡型号与容量ATMEL公司生产的AT24C系列存储卡采用低功耗CMOS工艺制造,芯片容量规格比较齐全,工作电压选择多样化,操作方式标准化,因而使用方便,是目前应用较多的一种存储卡。这种卡实质就是前面介绍的AT24C系列存储器。该类IC卡型号与容量如下表9-2所示。,表9-2 AT24C系列存储卡型号与容量,(三)AT24C系列存储卡工作原理,存储卡内部逻辑结构如下图9-9所示。其中A2、A1、A0为器件/页地址输入端,在IC卡芯片中,将此三端接地,并且不引出到触点上(如图中虚线所示)。,(三)AT24C系列存储卡工作原理 存储卡内部逻辑结构如下图9-9所示。其中A2、A1、A0为器件/页地址输入端,在IC卡芯片中,将此三端接地,并且不引出到触点上(如图中虚线所示)。,图9-9 IC卡内部逻辑结构,1.内部逻辑单元功能芯片信号线有两条:SCL时钟信号线和SDA数据信号线,数据传输采用I2C总线协议。当SCL为高电平期间,SDA上的数据信号有效;当SCL为低电平期间,允许SDA上的数据信号变化。启动与停止逻辑单元。当SCL为高电平期间,SDA从低电平上升为高电平的跳变信号作为I2C总线的停止信号;当SCL为高电平期间,SDA从高电平下降为低电平的跳变信号作为I2C总线的启动信号。串行控制逻辑单元。这是芯片正常工作的控制核心单元。该单元根据输入信号产生各种控制信号。在寻址操作时,它控制地址计数器加1并启动地址比较器工作;在进行写操作时,它控制升压/定时电路为EEPROM提供编程高压;在进行读操作时,它对输出/确认逻辑单元进行控制。地址/计数器单元。根据读/写控制信号及串行逻辑控制信号产生EEPROM单元地址,并分别送到X译码器进行字选(字长8位),送到Y译码器进行位选。升压定时单元。该单元为片内升压电路。在芯片采用单一电源供电情况下,它可将电源电压提升到1221.5V,以供作EEPROM编程高压。EEPROM存储单元。该单元为IC卡芯片的存储模块,其存储单元多少决定了卡片的存储容量。,2.芯片寻址方式器件地址与页面选择。IC卡芯片的器件地址为8位,即7位地址码,1位读/写控制码。如上图9-9可见,与普通24系列EEPROM集成电路相比,IC卡芯片的A2、A1、A0端均已在卡片内部接地,而没有引到外部触点上,在使用时,不同型号IC卡的器件地址码见下表9-3所示。,R/,R/,R/,R/,R/,R/,对于容量为1K、2K的卡片,其器件地址是唯一的,无需进行页面选择。对于容量为4K、8K、16K的卡片,利用P2、P1、P0作为页面地址选择。不同容量的芯片,页面数不同,如AT24C08根据P1、P0的取值不同,可有0、1、2、3四个页面,每个页面有256个字节存储单元。对于容量为32K的卡片,没有采用页面寻址方式,而是采用直接寻址方式。字节寻址。在器件地址码后面,发送字节地址码。对于容量小于32K的卡片,字节地址码长度为一个字节(8位);对于容量为32K的卡片,采用2个8位数据字作为寻址码。第一个地址字只有低4位有效,此低4位与第二个字节的8位一起组成12位长的地址码,对4096个字节进行寻址。,3.读、写操作对这种IC卡的读、写操作实质上就是对普通AT24C系列EEPROM的读写,操作方式完全一样。,9.2.3 AT24C02与单片机应用实例,例题9-1:如图9-10所示,该电路实现的功能是开机次数统计。数码管初始显示“0”,复位后,数码管将无数字显示。当再次按下开机,CPU会从AT24C02里面调出保存的开机次数,并加1后显示在数码管上,如此反复。,图9-10 AT24C02与单片机应用,解:程序如下。#include#include#define uchar unsigned char#define uint unsigned int#define OP_WRITE 0 xa0/器件地址以及写入操作#define OP_READ 0 xa1/器件地址以及读取操作 uchar code display=0 xC0,0 xF9,0 xA4,0 xB0,0 x99,0 x92,0 x82,0 xF8,0 x80,0 x90;sbit SDA=P23;sbit SCL=P22;sbit SMG=P37;/定义数码管选择引脚void start();void stop();uchar shin();bit shout(uchar write_data);void write_byte(uchar addr,uchar write_data);/void fill_byte(uchar fill_size,uchar fill_data);void delayms(uint ms);uchar read_current();uchar read_random(uchar random_addr);#define delayNOP();_nop_();_nop_();_nop_();_nop_();,main(void)uchar i=1;SMG=0;/选数码管 SDA=1;SCL=1;i=read_random(1);/从AT24C02移出数据送到i暂存 if(i=9)i=0;else i+;write_byte(1,i);/写入新的数据到EEPROM P0=displayi;/显示 while(1);/停止等下一次开机或复位/*/void start()/开始位 SDA=1;SCL=1;delayNOP();SDA=0;delayNOP();SCL=0;/*/,void stop()/停止位 SDA=0;delayNOP();SCL=1;delayNOP();SDA=1;/*/uchar shin()/从AT24C02移出数据到MCU uchar i,read_data;for(i=0;i 8;i+)SCL=1;read_data=1;read_data|=SDA;SCL=0;return(read_data);,/*/bit shout(uchar write_data)/从MCU移出数据到AT24C02 uchar i;bit ack_bit;for(i=0;i 8;i+)/循环移入8个位 SDA=(bit)(write_data/返回AT24C02应答位,/*/void write_byte(uchar addr,uchar write_data)/在指定地址addr处写入数据write_data start();shout(OP_WRITE);shout(addr);shout(write_data);stop();delayms(10);/写入周期/*/*void fill_byte(uchar fill_size,uchar fill_data)/填充数据fill_data到EEPROM内fill_size字节 uchar i;for(i=0;i fill_size;i+)write_byte(i,fill_data);*/,/*/uchar read_current()/在当前地址读取 uchar read_data;start();shout(OP_READ);read_data=shin();stop();return read_data;/*/uchar read_random(uchar random_addr)/在指定地址读取 start();shout(OP_WRITE);shout(random_addr);return(read_current();/*/void delayms(uint ms)/延时子程序 uchar k;while(ms-)for(k=0;k 120;k+);,9.3 单总线串行扩展9.3.1 DS18B20简述一、DS18B20的主要特性1.适应电压范围更宽,电压范围在3.05.5V,在寄生电源方式下可由数据线供电。2.独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条线即可实现微处理器与DS18B20的双向通讯。3.DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温。4.DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。5.测温范围在-55+125,在-10+85时精度为0.5。6.可编程的分辨率为912位,对应的可分辨温度分别为0.5、0.25、0.125和0.0625,可实现高精度测温。7.在9位分辨率时最多在 93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快。8.测量结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力。9.负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。,二、DS18B20的外形和内部结构DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、温度报警触发器TH和TL、配置寄存器。DS18B20的外形及管脚排列如下图9-11所示。,PR-35封装,SOSI封装,DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(2)GND为电源地;(3)VDD为外接供电电源输入端(在寄生电源接线方式时接地)。,图9-11 DS18B20的外形及管脚排列,DS18B20内部结构如下图9-12所示。,DS18B20有4个主要的数据部件:(一)光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。(二)DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以 0.0625/LSB形式表达,其中S为符号位。DS18B20温度格式如下表9-4所示。,图9-12 DS18B20内部结构,表9-4 DS18B20温度值格式表,这是12位转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。例如:+125的数字输出为07D0H,+25.0625的数字输出为0191H;-25.0625的数字输出为FE6FH,-55的数字输出为FC90H。DS18B20温度数据转换如下表9-5所示。,表9-5 DS18B20温度数据表,(三)DS18B20温度传感器的存储器,DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPRAM,后者存放高温触发器TH、低温度触发器TL和结构寄存器。(四)配置寄存器 配置寄存器该字节各位的意义如下表9-6所示。,表9-6 配置寄存器结构,低五位一直都是“1”,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。DS18B20可以程序设定9-12位的分辨率,精度为0.5C。R1和R0用来设置分辨率,如下表9-7所示。(注意:DS18B20出厂时被设置为12位),表9-7 温度分辨率设置表,(五)高速暂存存储器高速暂存存储器由9个字节组成,其分配如下表9-8 所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式如表9-4所示。对应的温度计算:当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变为原码,再计算十进制值。表9-5是对应的一部分温度值。第8个字节是冗余检验字节。DS18B20高速暂存存储器分布如下表9-8所示。,表9-8 DS18B20暂存寄存器分布,根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在低脉冲,主CPU收到此信号表示复位成功。,三、DS18B20工作原理DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s 减为750ms。DS18B20测温原理如图9-13所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在55所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图9-13中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。,图9-13 DS18B20测温原理框图,ROM指令表如下表9-9所示。,表9-9 ROM指令表,RAM指令表如下表9-10所示。,表9-10 RAM指令表,四、DS18B20使用中注意事项DS18B20虽然具有测温系统简单、测温精度高、连接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:1.较小的硬件开销需要相对复杂的软件进行补偿。由于DS18B20与微处理器间采用串行数据传送,因此,在对DS18B20进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用PL/M、C等高级语言进行系统程序设计时,对 DS18B20操作部分最好采用汇编语言实现。2.在DS18B20的有关资料中均未提及单总线上所挂DS18B20数量问题,容易使人误认为可以挂任意多个DS18B20,在实际应用中并非如此。当单总线上所挂DS18B20超过8个时,就需要解决微处理器的总线驱动问题,这一点在进行多点测温系统设计时要加以注意。3.连接DS18B20的总线电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过50m时,读取的测温数据将发生错误。当将总线电缆改为双绞线带屏蔽电缆时,正常通讯距离可达150m,当采用每米绞合次数更多的双绞线带屏蔽电缆时,正常通讯距离进一步加长。这种情况主要是由总线分布电容使信号波形产生畸变造成的。因此,在用DS18B20进行长距离测温系统设计时要充分考虑总线分布电容和阻抗匹配问题。4.在测温程序设计中,向DS18B20发出温度转换命令后,程序总要等待DS18B20的返回信号,一旦某个DS18B20接触不好或断线,当程序读该DS18B20时,将没有返回信号,程序进入死循环。这一点在进行DS18B20硬件连接和软件设计时也要给予一定的重视。测温电缆线建议采用屏蔽4芯双绞线,其中一对线接地线与信号线,另一组接VCC和地线,屏蔽层在源端单点接地。,9.3.2 DS18B20与单片机应用实例例题9-2:如图9-14所示,是一个实时测温电路。P2口接数码管的字型口,实现显示0-9数码的功能。P1.0-P1.2经74LS138译码器驱动数码管的字位口,实现个十百千等位置的选中。DS18B20的2脚(DQ)接P3.3,实现把实时温度传递给CPU,并显示在数码管上。,图9-14 DS18B20与单片机应用实例,解:程序如下。#include#include#define uchar unsigned char#define uint unsigned intsbit DS=P33;/定义DS18B20接口int temp;uchar flag1;void display(unsigned char*lp,unsigned char lc);/数字的显示函数;lp为指向数组的地址,lc为显示的个数void delay();/延时子函数,5个空指令code unsigned char table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 xbf,0 x86,0 xdb,0 xcf,0 xe6,0 xed,0 xfd,0 x87,0 xff,0 xef,0 x40,0 x39,0 x00;/共阴数码管显示数的组成是 0-90-9有小数点的-C 空 表unsigned char l_tmpdate8=0,0,10,0,0,0,0,0;/定义数组变量,并赋值1,2,3,4,5,6,7,8,就是本程序显示的八个数,int tmp(void);void tmpchange(void);void tmpwritebyte(uchar dat);uchar tmpread(void);bit tmpreadbit(void);void dsreset(void);void delayb(uint count);,void main()/主函数uchar i;int l_tmp;while(1)tmpchange();/温度转换l_tmp=tmp();/读取温度值if(l_tmp0)l_tmpdate0=20;/判断温度为负温度,前面加-elsel_tmpdate0=l_tmp/1000;/显示百位,这里用1000,是因为我们之前乖以10了if(l_tmpdate0=0)l_tmpdate0=22;/判断温度为正温度且没有上百,前面不显示,查表第12是空l_tmp=l_tmp%1000;l_tmpdate1=l_tmp/100;/获取十位l_tmp=l_tmp%100;l_tmpdate2=l_tmp/10;/获取个位再l_tmpdate2+=10;/加入小数点,查表可得出有小数点的排在后10位,所以加10l_tmpdate3=l_tmp%10;/获取小数第一位l_tmpdate4=21;for(i=0;i10;i+)/循环输出10次,提高亮度display(l_tmpdate,5);,void display(unsigned char*lp,unsigned char lc)/显示unsigned char i;/定义变量P2=0;/端口2为输出P1=P1/下一位数码管,void delay(void)/空5个指令_nop_();_nop_();_nop_();_nop_();_nop_();void delayb(uint count)/delay uint i;while(count)i=200;while(i0)i-;count-;,void dsreset(void)/DS18B20初始化 uint i;DS=0;i=103;while(i0)i-;DS=1;i=4;while(i0)i-;bit tmpreadbit(void)/读一位 uint i;bit dat;DS=0;i+;/小延时一下 DS=1;i+;i+;dat=DS;i=8;while(i0)i-;return(dat);,uchar tmpread(void)/读一个字节 uchar i,j,dat;dat=0;for(i=1;i1);/读出的数据最低位在最前面,这样刚好/一个字节在DAT里 return(dat);/将一个字节数据返回,void tmpwritebyte(uchar dat)/写一个字节到DS18B20里 uint i;uchar j;bit testb;for(j=1;j1;if(testb)/写1部分 DS=0;i+;i+;DS=1;i=8;while(i0)i-;else DS=0;/写0部分 i=8;while(i0)i-;DS=1;i+;i+;,void tmpchange(void)/发送温度转换命令 dsreset();/初始化DS18B20 delayb(1);/延时 tmpwritebyte(0 xcc);/跳过序列号命令 tmpwritebyte(0 x44);/发送温度转换命令int tmp()/获得温度 float tt;uchar a,b;dsreset();delayb(1);tmpwritebyte(0 xcc);tmpwritebyte(0 xbe);/发送读取数据命令 a=tmpread();/连续读两个字节数据 b=tmpread();temp=b;temp=8;temp=temp|a;/两字节合成一个整型变量。tt=temp*0.0625;/得到真实十进制温度值,因为DS18B20/可以精确到0.0625度,所以读回数据的最低位代表的是/0.0625度。temp=tt*10+0.5;/放大十倍,这样做的目的将小数点后第一位/也转换为可显示数字,同时进行一个四舍五入操作。return temp;/返回温度值,void readrom()/read the serial 读取温度传感器的序列号/本程序中没有用到此函数 uchar sn1,sn2;dsreset();delayb(1);tmpwritebyte(0 x33);sn1=tmpread();sn2=tmpread();void delay10ms()uchar a,b;for(a=10;a0;a-)for(b=60;b0;b-);,9.4 SPI总线串行扩展9.4.1 SPI接口SPI(Serial Peripheral Interface-串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI有三个寄存器分别为:控制寄存器SPCR,状态寄存器SPSR,数据寄存器SPDR。外围设备FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线CS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。SPI接口的全称是Serial Peripheral Interface,意为串行外围接口,是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间。SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。SPI串行扩展如下图9-15所表示,接口包括以下四种信号。