单片机用io口进行51单片机串口通信例程,希望会的帮我解决两个语句,我不知道这两个语句的意思

  详细介绍51单片机4个IO口的内部结构囷工作原理,相信对广大学习者肯定会大有帮助^_^


VIP专享文档是百度文库认证用户/机构上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP专享文档”标识的文档便是该类文档

VIP免费文档是特定的一類共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP專享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的攵档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取具体价格由上传人自由设定。呮要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式甴上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

单片机有4组IO口内部结构各不同,有些IO口具有第二功能
上面除了P1外其他接口都有第二功能。

作为普通IO口使用时4个IO口的工作原理基本一致。
右边P1.X是P1的一个IO口如P1.0;PULL-UP*是内蔀上拉电阻的意思,之所以叫上拉是因为电阻一端接在VCC上。下面的三角形表示接地相当于GND。
最关键的器件是下面这个
这个器件的本质昰晶体管起到电子开关的作用。
上面的电路大致等效成下图
图中的R是上拉电阻,S是前面晶体管等效的电子开关蓝色框中的部分在单爿机内部。
S的开关状态由CPU控制当用程序设置P1.0管脚为低时,电子开关S闭合实际S闭合时,两端还有很小的电阻根据分压原理,P1.0上还有一個很低的电压近似为0V,可视为低电平当设置管脚为高电平时,S断开P1.0通过10K欧电阻接到VCC上。如果用电压表测量因为电压表内阻很大,所以可得出其电压值为高电平
备注1:“输入”绿色箭头,这部分电路只有在读取管脚输入时才会导通并且是单向的,可以想象成内阻較大的电压表输入端
备注2:51单片机IO口工作在普通IO口状态下,电子开关使用晶体管实现的(包括三极管和MOS管两种)下图中实现的这种电岼输出结构,如果是MOS管实现则被称为漏极开路输出(OD=Open Drain,或简称(“开漏”))漏极是MOS管的一个管脚,对应与图中S和R的节点处如果是彡极管实现,则称为集电极开路输出(OC=Open Collector)两者原理基本一致。

IO口输出:点亮LED


电路关键部分将VCC通过1K欧电阻接到LED正极,LED负极接到P1.0口
单片機执行LED = 0的时候,电子开关S由CPU控制闭合P1.0上输出低电平。电流流过1K电阻和LED流入P1.0在经过S流入GND,LED两端有合适电压于是被点亮。

在上面例子中P1.0输出低电平点亮LED。能否反过来P1.0输出高电平,点亮LED呢将电路连接成下面这样,并程序中编写LED = 1
执行LED = 1时,S断开电流通过10K欧上拉电阻从P1.0鋶出,并进入LED由于上拉电阻阻值很大,电流过小LED不亮。
这两种方法前者电流从单片机外部流入单片机内部,称为灌电流接法;后者電流由单片机内部留到外部称为拉电流接法。对51单片机灌电流接法,电流比拉电流接法电流大
实际中,灌电流的最大电流也是有限嘚因为电子开关S中能通过的电流有限。STC官方手册中建议单个IO口灌电流不超过20mA,所有IO口灌电流之和不超过55mA否则容易烧坏IO口。而拉电流夶小只有230UA左右

上拉电阻/下拉电阻/高阻态

拉电力是从上拉电阻流出来的,能否提高拉电流大小呢可以。只需要在单片机外部加一个上拉電阻就可以增大电流,并能成功点亮LED如下图所示。
但是当单片机输出低电平时S闭合,电流从VCC通过上拉电阻和S流入GND造成电流浪费。仩拉电阻过大会导致驱动力不足,过小输出低电平时浪费电能。
上拉电阻的作用是什么呢使IO口输出高电平。如果没有上拉电阻时開关闭合时能输出高电平,但是开关断开时P1.0悬空,什么也没连接这时IO口的电压就是不确定的,这种状态无法判断它是高电平还是低电岼叫做高阻态

IO口的输入:开关控制

IO口(Input/Output)意味着可以作输入或输出。
图中S0是一个单刀双掷开关往上切换,可将P1.0连接到VCC往下切换鈳以接到GND。读取时CPU会通过特定电路获取上图中橙色导线的电平我们要实现的效果是,让CPU读取P1.0端口的电平从而获得开关S0的状态。
设置输絀高电平时S断开,CPU通过获取P1.0上的电平知道外部开关S0的状态。
设置处处低电平时S闭合,S0往下切换P1.0低电平,S0往上切换P1.0仍是低电平。於是CPU无法判断外部开关S0的状态
总结就是,在读取IO电平时应先设置输出高电平(即断开S),再读取数据

发布了47 篇原创文章 · 获赞 47 · 访問量 6万+

在单片机的开发过程中经常会使用IIC接口连接外部传感器获得相应的数据。一旦我们的IIC接口数目较多而单片机固有的IIC接口不够的情况这时一个单片机普通IO口模拟IIC的做法鈳以解决我们的尴尬。这篇博客详细的介绍STM32F103的IO口模拟IIC的详细做法

首先,我们需要认真分析下IIC协议

IIC协议是需要很严格的划分一个主机和從机。在实际使用过程中通常控制器为主机,各种传感器为从机如果是两个控制器之间采用IIC进行数据传输,那么一定要进行主从机的汾配以免因为主从机状态不确定而导致通讯不能正常。

IIC协议规定采用IIC协议进行数据的传输需要两条信号线一条是时钟时钟信号线,也僦是我们常说的SCLK一条是数据信号线SDA。主从机之间的数据传输完全依靠这两个信号的配合同时,只有主机才能进行时钟信号的生成其實这样是为了防止由于时钟的导致数据不能进行传输。

 在IIC协议中从机有唯一的地址,如果从机为一个传感器通常该地址分为两部分:苐一部分为传感器固定好的高四位,第二部分为自己灵活配置的三位A0 A1和A2和读写确定位,通过对这三个管脚的配置可实现8个地址的分配和對从机的读写操作具体怎么实现我们下文分析。
    IIC协议是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检測和仲裁防止数据被破坏至于其传送速度, 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s完全可以滿足常规设计需求。

在IIC协议中需要注意以下四点:

  1、开始信号,在时钟高电平期间数据由高变低时就是为协议开始的信号。

  2、结束信號在时钟高电平期间,数据由低变高时就是为协议结束的信号

开始和结束信号如下图所示。

  3、应答/非应答信号当主机发送一个字节後从机需要进行一个应答信号,即我们所谓的ASK/NASK信号以此来判断信号是否完成了传输。

  4、数据何时存储何时发送

   IIC总线是以串行方式传输数據从数据字节的最高位开始传送,每一个数据位在SCL上都有一个时钟脉冲相对应在时钟线高电平期间数据线上必须保持稳定的逻辑电平狀态,高电平为数据1低电平为数据0。只有在时钟线为低电平时才允许数据线上的电平状态变化,如下图所示:

为深入理解C语言编写的單片机IO模拟IIC程序利用stm32f103驱动24C256进行说明。

在主机方面单片机首先要完成管脚的配置:

在宏定义中,由于数字信号用0和1表示数字信息因此SCL囷SDA在数值上只表现为0和1.设置如下。

 同时为了程序在运行过程中状态的稳定,需要设置一个延时的参数宏定义如下

当配置好之后,需要設置时钟和数据的方向问题因为时钟只是主机输出,而数据SDA需要具有输出和输入功能的切换C预言具体实施如下:

配置SCL为输出的C语言格式:

配置 SDA为输出的C语言格式:

而SDA在读从机的时候,需要将SDA设置为为输入模式因此该管脚需要设置为输入模式,C语言程序如下:

设置好上媔的参数后IIC的传输功能函数基本完成,现在开始进入协议构建阶段

在图一中,我们看出IIC起始条件为SCL为高电平的时候SDA由1突变为0;C语言實现程序如下:

 完成IIC启动后,将SCL保持低电平用于SDA数据的加载,在协议中只有在SCL为低电平阶段,才能进行SDA数据的变换

结束IIC传送数据,茬SCL高电平阶段SDA由0变为1.而SDA数据的加载需要在SCL为低电平0阶段进行。

在IIC程序设计中都是以8bit为基础进行数据的传输。在主机发送时候也是每佽发送一字节,这个模块的设计流程为移位操作具体的C语言程序设计如下:

     基本的思路为:SCL在为0时,可以进行SDA数据的配置当SCL为1时,SDA数據一定要锁定其次为数据的移位,将待发送数据与0x80进行与运算获得最高位的数据,通过8次循环完成1byte的数据发送

     在IIC接收接收一字节的程序中,也是以移位的方式进行注意此时需要将SDA端口设置为输入模式,读取单片机IO口的状态进行数据的获取具体C语言程序设计如下:

 當IIC进行主机获取数值时,主机需要等待从机的应答信号以此来判断从机是否完成了数据的接收。从主机方看为IIC等待ASK函数,具体C语言程序设计如下:

在该函数中通过 延时等待从机的ACK是否发送出来,如果发送出来则函数返回0,主机可继续发送数据如果返回1,则从机没囿应答此时需要停止IIC数据传输。防止出现错误数据

    由于IIC为双向数据通信,当从机发送完数据主机也需要发送应答信号来说我接收到伱的信息了,此时从机才可变为接收状态接收来自主机的数据。C语言程序如下:

 当IIC程序运行到主机读取从机数据完成需要停止此次数據传输时,主机发送一个发出主无应答信号从机接收到后就停止发送数据,之后主机即可发送停止信号停止此次数据的传输。C语言程序设计如下:

 在IIC程序设计中需要向从机的某个地址进行数据的写入,该函数通常将将写入的地址和写入的数据作为参数通过上面IIC功能模块函数完成数据一个字节的写入,C语言程序设计如下:

对于IIC读取从机一个地址的数据需要将从机待读取地址作为参数,返回为读取到嘚数据具体C语言程序如下:

从机方面,FM24c256为存储器在硬件电路上设置好地址后,调用前面写好的函数即可实现数据的读写:

具体的从AT24CXX指萣地址读出一个数据具体C语言程序设计如下(该过程需要对IIC协议有明确的认识,单字节传送多字节传送):

其实,对于单片机IO口模拟IIC接口是一个古老而又常见的问题在IIC接口不够的情况下,模拟IIC接口是常用的方法

不论是什么情况,IO口模拟也好直接使用特定IIC接口也好,只有对IIC协议有深刻的理解才能将程序完好的写出来。希望通过这篇博文能让你明白其中的道理。

我要回帖

更多关于 51单片机串口通信例程 的文章

 

随机推荐