单片机技术与项目训练 课件 第9章 单片机串行总线通信设计_第1页
单片机技术与项目训练 课件 第9章 单片机串行总线通信设计_第2页
单片机技术与项目训练 课件 第9章 单片机串行总线通信设计_第3页
单片机技术与项目训练 课件 第9章 单片机串行总线通信设计_第4页
单片机技术与项目训练 课件 第9章 单片机串行总线通信设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机串行总线通信设计第9章在单片机的通信技术中,串行通信扮演着重要的角色。除串口数据通信之外,单片机与外部的通信还有常用的I2C总线、SPI总线等,它们都是标准的串行总线通信技术,有的单片机内部已经包含了这些接口硬件设计。然而,也有很多芯片、设备并不具备标准的串行总线接口,而是提供了接口的协议和控制时序,需要单片机通过I/O口来模拟产生时序逻辑控制脉冲对这些设备进行读/写控制。引言目录单片机I/O口时序控制方法1DS18B20数字温度传感器通信2本章小结6项目训练一:温度采集系统设计3项目训练二:精准数字钟设计5行业PPT模板/hangye/DS1302时钟芯片通信49.1单片机I/O时序控制方法9.1.1并行转串行单片机内部的存储数据通常以字节为单位,而单片机与外围设备的通信需要通过I/O口将单片机内部的字节数据发送出来,这就需要经过并行到串行的数据转换,把8位数据按位展开,一位接一位地把数据顺序传送出去,即把并行数据转为串行数据。在通信接口的设计中,除需要一根数据线外,通常还需要一根时钟线(并不是必需的)作为数据的时间基准。9.1.1并行转串行图1一种并行转串行的时序9.1.1并行转串行1时钟输出

时钟的波形是一个方波,方波的输出在第5章介绍过,可以用定时器来实现。但是这里的方波需要和数据输出进行配合,定时器的输出方式不适合这样的操作。因此,可以采用延时的方式来实现,延时的时间根据时序参数的要求设定即可。2串行数据的输出串行数据的输出是重点,它是把1字节的数据变为8位的数据顺序输出,需要用到的算法如下。设要传输的数据为0x56,其二进制数是01010110,要把这些二进制数由低位到高位拆分出来,需要用到与运算和移位运算。算法解释如下。(1)把数据和0x01进行与运算(2)把数据右移一位,得到00101011,再和00000001进行与算法,得到00000001,把它送到I/O口,I/O口上得到的数据为“1”。(3)以此类推,最后即可把一字节的数据按位拆开送到I/O口,从而实现数据由并行转串行的操作。程序算法通过一条语句来实现:

DATA=(send_data>>i)&0x1; //i从0到7递增9.1.1并行转串行3合并操作把时钟产生和串行数据输出合并在一起,就可以实现类似图1的时序控制要求,即先把时钟置1(初始为0),产生上升沿脉冲并延时;然后做与运算和移位运算和与运算,把结果输出并延时;最后把时钟置0,并延时,延时的时间根据实际要求而定。主要的算法示例程序如下:for(i=0;i<8;i++){ CLK=1;//时钟上升沿延时; DATA=(send_data>>i)&0x1; //将send_data的第i位赋DATA

延时; CLK=0; //时钟下降沿 延时;}9.1.2串行转并行1时钟上升沿检测程序中是通过while(1)来循环检测CLK的状态的,当检测到上一次的CLK的状态clk_history为0,并且当前的CLK状态clk_get为1时,即认为检测到一个时钟上升沿。while(1){ clk_get=CLK; //在一次while循环中,只采样一次CLK端口

if((clk_history==0)&&(clk_get==1)) //时钟上升沿

{...(略)//起始位检测及有效数据的读取

} clk_history=clk_get;}后面的起始位检测及有效数据的读取均在检测到时钟上升沿时进行。9.1.2串行转并行2起始位检测使用一个关键变量state来表示单片机程序当前的工作状态,当state为0时,表示当前处于起始位检测状态;当state为1时,表示当前处于有效数据的读取状态。state的初始值为0,当检测到CLK上升沿有效且DATA的数据为0时,认为检测到起始位,将state置1。9.1.2串行转并行3有效数据读取当state为1时,进行有效数据的读取。通过变量cnt来表示当前读取的串行数据位是接收数据data_receive的第几位,cnt的数值为0~7。从I/O口读进来的数据是一个接一个的二进制数,需要把它们组合到一起,形成1字节的数据,这里需要用到左移和或运算。算法原理是:在时钟信号CLK上升沿到来时读取一位I/O口(DATA)的数据(data_get),左移cnt(cnt初始值为0)位后,将其和存放最终结果的变量data_receive进行或运算,并将结果存放到data_receive中,依次循环执行类似操作,便可将串行的位数据组合或1字节数据。算法实现如下:data_receive|=(data_get<<cnt);当有效数据全部采集完后(CLK上升沿有效,state为1,cnt为7),将cnt置0、state置0,并将最终采集的并行数据赋给P0口显示。9.1.2串行转并行课堂练习

参考例9-1和例9-2,搭建一个并行转串行和串行转并行系统,并编写单片机程序,实现串行通信。9.2

DS18B20数字温度传感器通信9.2.1DS18B20基本知识图2DS18B20的封装与引脚DS18B20数字温度传感器是DALLAS公司生产的单总线器件(1-Wire),具有线路简单。体积小的特点。因此用它组成一个测温系统具有线路简单的优点。在一根通信线上,可以挂很多这样的数字温度传感器。而且它输出的是数字信号,与单片机接口连接非常方便,不需要经过A/D转换。9.2.1DS18B20基本知识1DS18B20产品结构特点只要求一个端口即可实现通信。其中的每个器件上都有独一无二的序列号。实际应用中不需要外部任何元器件即可实现测温。测量温度范围为-55~+125℃。用户可以从9位到12位选择其分辨率。内部有温度上、下限

告警设置。9.2.1DS18B20基本知识2.DS18B20的4个主要的数据部件(1)64位序列号编码:可用来区分多个连接在同一总线上的DS18B20器件。(2)温度数值:最高12位,用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB的形式表达,其中S为符号位,其格式如图3所示。二进制序列中的前面5位是符号位,如果测得的温度值大于0,那么这5位为0,只要将测得的数值乘以0.0625即可得到实际温度;如果测得的温度值小于0,那么这5位为1,测得的数值需要取反加1再乘以0.0625,这样可得到实际温度值。图3

DS18B20的温度值格式9.2.1DS18B20基本知识(3)配置寄存器。如图4所示,该字节各位的意义:低5位一直都是1,TM是测试模式位,用于设置DS18B20是在工作模式下还是在测试模式下。在DS18B20出厂时,该位被设置为0,用户不要改动。R1和R0用来设置分辨率。图4配置寄存器数据格式9.2.1DS18B20基本知识(4)存储器。DS18B20数字温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性的且可电擦除的EEPROM,高速暂存RAM由9字节组成,其分布如表1所示。寄存器内容字节地址温度值低位(LSByte)0温度值高位(MSByte)1高温限值(TH)2低温限值(TL)3配置寄存器4保留5保留6保留7CRC校验值8表1DS18B20的高速暂存RAM分布9.2.1DS18B20基本知识3DS18B20控制指令(1)复位。根据DS18B20的通信协议,主机(单片机)控制DS18B20完成温度转换必须经过3个步骤。①每次读/写前都要对DS18B20进行复位操作。②复位成功后发送一条ROM指令。③发送RAM指令。9.2.1DS18B20基本知识(2)写时序voidWR_Bit(biti){DQ=0; //总线拉低,产生写时序_nop_();_nop_(); //总线拉低持续时间要长于1μsDQ=i; //写数据delayxus15(3); //延时45μs,等待DS18B20采样读取DQ=1; //拉高释放总线}图5DS18B20写操作时序9.2.1DS18B20基本知识(3)读时序unsignedcharRead_Bit(){unsignedcharreadb;DQ=0; //拉低总线_nop_();_nop_();DQ=1; //释放总线_nop_();_nop_();_nop_();_nop_();readb=DQ; //读时隙产生7μs后读取总线数据

delayxus15(3); //延时45μs,满足读时隙的时间要求

DQ=1; //释放总线

returnreadb; //返回读取的数据}9.2.1DS18B20基本知识图6DS18B20读操作时序9.2.2单片机与计算机的串行通信虚拟串口软件VSPD图7虚拟串口软件界面9.3项目训练一:温度采集系统设计9.3.1项目要求利用数字温度传感器DS18B20实现温度的采集,并将采集的数据发送给计算机,要求每秒传送一次。计算机可以根据不同的温度情况对单片机进行控制,从而实现计算机和单片机的通信与控制。要求利用Proteus仿真软件来模拟实现。9.3.2项目分析温度采集系统包含数字温度传感器DS18B20,单片机将DS18B20采集的温度数据发送给计算机,要求每秒种传送一次。这里的每秒可以用软件延时来实现,也可以用硬件延时来实现,这里采用软件延时来实现。单片机通过串口与计算机进行通信时,需要注意双方串口的模式及波特率要一致,可考虑将单片机串口设置为工作方式1,波特率为2400bit/s。计算机通过串口对单片机进行控制,可以采用LED显示出来。9.3.3原理图设计图8

温度采集系统电路原理图9.3.4编写单片机与计算机串行通信的程序图9软件总体流程9.3.5调试程序图10

COMPIN属性设置打开串口调试助手,修改串口为COM1,波特率为2400bit/s,无奇偶校验位,数据位8位,停止位为1位,如图10所示。用Proteus打开仿真电路文件,先设置AT89C51的属性,晶振为12MHz。打开串口COMPIN的属性对话框,Physicalport选择COM2,波特率为2400,校验位为None,数据位8,停止位为l。如果需要用到波特率9600bit/s,则需要将晶振改为11.0592MHz。9.4DS1302时钟芯片通信9.4.1DS1302基本知识DS1302是DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5~5.5V。它采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8字节的用于临时存放数据的RAM。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。图11

DS1302的引脚功能图和应用电路图9.4.2DS1302的控制字节DS1302的控制字节如图12所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302。位6如果为0,则表示存取日历时钟数据;为1表示存取RAM数据。位5至位1指示操作单元的地址。最低有效位(位0)如果为0,则表示要进行写操作;为1表示进行读操作。控制字节总是从最低位开始输出的。图12

DS1302的控制字节9.4.3DS1302的寄存器READWRITEBIT7BIT6BIT5BIT4BIT3BIT2BIT1BIT0RANGE81

H80HCH10SecondsSeconds00~5983H82H

10MinutesMinutes00~5985H84H0:241:12010HourHour1~12/0~230:AM1:PM87H86H0010DateDate1~3189H88H00010MonthMonth1~128BH8AH00000Day1~78DH8CH10YearYear00~998FH8EHWP0000000—91H90HTCSTCSTCSTCSDSDSRSRS—表2DS1302的寄存器9.4.4DS1302的读写时序图13

DS1302的读写时序9.5项目训练二:精准数字钟设计9.5.1项目要求与项目分析利用单片机读取DS1302的时钟数据,并将其时、分、秒数据显示在8位数码管上。单片机通过SPI接口与DS1302时钟芯片进行通信,由于8051单片机片内部没有SPI硬件接口,所以需要通过I/O口模拟来实现SPI时序。数字钟需要将其时、分、秒数据显示在8位数码管上,一般采用的是动态扫描显示方法。9.5.2原理图设计图14

精准数字钟电路图9.5.3编写精准数字钟的程序voidDs1302Write(ucharaddr,uchardat){ ucharn; CE=0; _nop_(); SCLK=0;//将SCLK置低电平

_nop_(); CE=1;//将CE(CE)置高电平

_nop_(); for(n=0;n<8;n++)//开始传送8位地址指令

{ DSIO=addr&0x01;//数据从低位开始传送

addr>>=1; SCLK=1;//数据在上升沿时,DS1302读取数据

_nop_();SCLK=0;_nop_(); } for(n=0;n<8;n++) //写入8位数据

{ DSIO=dat&0x01; dat>>=1; SCLK=1; //数据在上升沿时,DS1302读取数据

_nop_(); SCLK=0; _nop_(); }

CE=0; //传送数据结束

_nop_();}1向DS1302写指令(地址+数据)9.5.3编写精准数字钟的程序ucharDs1302Read(ucharaddr){ ucharn,dat,dat1; CE=0; _nop_(); SCLK=0;//将SCLK置低电平

_nop_(); CE=1; //将CE(CE)置高电平

_nop_(); for(n=0;n<8;n++)//开始传送8位地址指令

{ DSIO=addr&0x01;//数据从低位开始传送

addr>>=1;SCLK=1; //数据在上升沿时,DS1302读数据

nop_(); SCLK=0; //DS1302下降沿时,放置数据

_nop_(); } _nop_(); for(n=0;n<8;n++) //读取8位数据

{ dat1=DSIO; //

温馨提示

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

评论

0/150

提交评论