找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 422|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机初学之最重要的实验之一:端口输入实验

[复制链接]
跳转到指定楼层
楼主
  单片机的作用,不是关起门来在自个肚子里运行程序,而是要用来控制外部设备,而其控制外部设备的唯一途径,对于我们现在已发明的数字设备来说,就是向外部设备输出高低电位,这个,就是我们称之为输出的功能。
可以说,绝大多数场合下,单片机要控制外部设备以达成我们的愿望,还必须获取外部信息,比如说你设计了一个流水灯,但是如果有一个灯坏了,如果你想要做到让单片机自己能够立即知道这个情况,那么,这个单片机就得有接收相关信息的能力,而要想让单片机接收到这个信息,唯一的途径,就是外部设备有控制单片机端口电位高低的能力,并且单片机能将端口的电位高低状况读入其内部并按预设程序进行处理,这个,就是我们称之为输入的功能,所以说,单片机的输入功能,是其最重要最基本的能力之一,学好这个,理解好这个,就为我们用好单片机打下了坚实的基础。
  下面,就让我们来体验一下单片机的输入功能,在这里,我会设计两个实验:
  第一个:用拨码开关控制一个电路某点的电位高低,然后将此点连接到单片机的端口。为了直观观察这个点的电位的高低,我们再在此点接入能直观显示其电位高低的装置(在此处,我们接入一个LED灯);同样也是为了实验的效果更好,我们一次做八个这样的电路,接入单片机的一组八个端口(这里我们用P2端口)。完成电路搭建后,编制程序,让单片机读取这组端口的电位,送入另外一组端口上(这里我们用P1端口)。为了直观地观察到P2端口的电位是否被送到了P1端口,我们在P1端口接上八只LED灯,当我们用拨码开关改变P2端口的电位时,如果P1口的八只LED灯亮灭的顺序与P2口的相同,就说明这个实验成功了。
  实验电路图如下:
  电路搭建完成后,将拨码开关八个位全部处于关的位置,然后连接好电脑,在STC下载软件中的程序文件窗口中输入75 90 FF 75 A0 FF 80 EF这一组八个十六进制数(里面的两个FF就是置P1P2这两组端口电位全部为高,换算成二进制就是11111111),再按“下载/编程”按钮将程序下载入单片机,然后检查这十六个灯是否全亮,然后再将拨码开关全部拨到开的位置以检查P2口的八个灯是否全灭,这两项检查完成,基本可以说明电路搭建无问题。
  搭建完成的实物图如下:

  接下来就开始做实验了,编程将P2的电位读入单片机并送入P1,其二进制程序代码为85 A0 90 80 FEC语言代码就是P1=P2。下载到单片机中后,我们可以任意开关那个八位拨码开关让其控制的八个LED灯中的任意个亮灭,然后让单片机重启(可以简单地用插拨电源线的方式重启),然后观察这两组灯的亮灭次序是否一致。
  接下来,我们让单片机自己将其P2端口输出全部置低电位(二进制75 A0 00C语言P2=0;),然后再让单片机将P2端口电位状况送入P1端口(全部代码二进制75 A0 00 85 A0 90 80 FEC语言两条语句P2=0P1=P2;),然后我们发现,无论怎样动拨码开关,P2口这边的灯都不会亮。这个实验说明了一个电路的基本道理,只有当单片机端口输出为高电位时,外界才能控制其电位为高为低;如果单片机自己向这个端口输出了低电位,外界是无法强行将这个端口处的电位拉高的,所以,这个程序设计中,单片机应该先让端口输出高电位(P2=255255对应二进制就是11111111。这个行为称之为交出端口的电位控制权)之后,才能进行端口电位的读取。
  那为什么我们之前没有P2=255这条语句也能成功呢?这就得谈到单片机芯片设计中的“复位值”这个在芯片手册和教材中经常看到的概念,对于端口来说,这个意思,就是单片机上电之后,其端口电位的高低,对于STC89C52这个单片机来说,在设计上,它就是上电后即为高电位,所以,我们可以不用加上P2=255这条语句也能成功,但编程应该严谨,要养成好习惯,特别是,其它厂家型号的单片机,其复位值不一定设计成这样。
  上面的程序中有一个问题,就是每次改变拨码开关之后,都要重启单片机才能进行观察,我们能不能做到不用重启、而是在改变开关状态之后立即就能观察到现象呢?简单,让单片机不断重复“读取并将P2口的状况送入P1口”这个动作就行了,C语言主程序内容如下:
P2=256//P2组端口为高电位,交出端口电位控制权
While(1)  //程序一直重复执行下面大括号内的语句
{P1=P2;}  //读取P2的电位状态并送入P1
第一个实验基本就这样了。
第二个实验:在以上电路的基础上,加一个按钮开关连到单片机的某一引脚,当我们改变拨码开关之后,单片机机并不立即读取P2口状况,而是等我们按下这个按钮开关之后,才读取并送入P1
这里,我们选择用P3这一组端口的第八个引脚(引脚图上的P37)来连接按钮,按钮开关的另一端连到地(见上面的电路图)。
完整程序如下:
#include "reg52.h"  //这个是头文件
sbit   key=P3^7;  //P37引脚起一个好记的名字叫key
void main()  //主程序
{
P2=255;  //P2组端口为高电位,交出端口电位控制权
key=1;   //P37引脚为高电位,交出端口电位控制权
while(1)  //程序一直重复执行下面大括号内的语句
{
   if(key==0)  //P37引脚的电位进行检测,如果检测到为低电位,也就是按钮被按下,则执行下面大括号内的语句
{P1=P2;}    //读取P2端口的电位状态并送入P1
}
}
说明一下,为了让程序流程表达清晰,没有做简化程序。
搭建好电路并下载我们编制好的程序,我们就可以开始实验了。随意改变拨码开关的开关状态,可以看到P2口的灯亮灭有变化,但P1口的灯并无变化;然后按一下按钮开关,我们就可以看到,P1口的灯与P2口的灯的亮灭状态一致了。
这个实验,可以说是进一步证明了我们的单片机具备将其端口电位高低的控制权交给外部设备、读取端口电位并进行处理的能力。
可以说,这个按钮控制实验是我们单片机输入实验中的一个极其重要也非常基础的实验,我们在学习1602显示屏或12864显示屏时,就会用到这一功能和方法。我们在进行数据传输时,不管是外部设备向单片机传送数据,还是单片机向外部设备传送数据,或者是单片机向单片机传送数据,都要解决一个问题,那就是,作为接收方,我得知道对方已经将数据放在端口上了,然后我就可以开始读入数据了。方法有很多种,而在本实验中,采用的是单片机检测到按钮开关按下了,就知道已经可以读数据了。这里还要说明一下的是,本实验中,我们设计的是按钮开关按下后端口电位为低则表示按钮开关按下了,其实我们也可以设计成按钮开关按下后端口电位为高来表示按钮开关按下了,当然,我们还可以设计成只要端口的电位发生了变化、电位由高变化成低(下降沿)、电位由低变化成高(上升沿)等来表示可以读数据了。
单片机对于读入的数据的处理功能,我们还可以进行一个升级实验来体验,就是对读入的数据进行算术运算之后,再将其运算结果送入P1,方法很简单,比如说将P1=P2这条语句改为P1=P2+1P1=P2*2等等的,然后我们去观察结果。
PS:本人水平实在有限,恳请诸位用力批评指正:)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1165569 发表于 2026-1-3 09:36 | 只看该作者
这个对初学者帮助很大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表