1 小白学单片机(20) IO口原理讲解资料下载-德赢Vwin官网 网
×

小白学单片机(20) IO口原理讲解资料下载

消耗积分:3 | 格式:pdf | 大小:424.58KB | 2021-04-19

分享资料个

IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比较长的篇幅介绍IO口的原理。也是查阅了不少资料,确保内容正确无误,花了很长时间写的。IO口原理原本需要涉及很多深入的知识,而这里尽最大可能做了简化方便理解。这样对于以后解决各种IO口相关的问题会有很大的帮助。 IO口等效模型是本人独创的方法,通过此模型,能有效的降低对IO口内部结构理解的难度。并且经查阅资料确认,这种模型和实际工作原理基本一致。 前面说了很多东西,不少人或许已经迫不及待的想要实际操作单片机了。IO口作为单片机与外界通信最主要的手段,是单片机学习最基本也最重要的一个知识。前面我们编程实现了IO口点亮LED的实验,本篇继续对IO口相关知识进行介绍。 为了更好的学习IO口操作,有必要了解一下IO口的内部结构和相关概念。这些知识对于后续的学习很有帮助,重点是理解,完全不需要刻意去记。不记得就回来再看看就行了,用得多了自然就记住了。 官方资料(最权威准确) 我们说过,要了解一个芯片,最准确有效的方法,是查看官方给出的芯片手册等资料。但是初学单片机,直接看芯片手册资料恐怕很难弄明白,尤其是看到一堆英文、陌生的电路、名词术语,如果是我,一定也会抓狂的。但是这里我还是给出一张从Atmel官方的《Atmel 8051 Microcontrollers Hardware Manual》中截取的图片。 给出这张图片并不是为了打击大家学习热情,而是希望大家能明白,我们所见过的各种单片机资料到底是怎么来的,到底是否准确,这一切都可以通过官方资料弄清楚,对于大家以后深入学习一些东西有一定的帮助。 第二功能简介 上图正是官方给出的权威的51单片机IO口结构图。可以看出,单片机的四组IO口内部结构各不相同,原因是有些IO口有第二功能,入门篇里面提到过。 还记得这张管脚图吗?括号中标注的就是IO口的第二功能名称。除了P1以外,每个接口都有第二功能。介绍单片机系统模块时,我提到51单片机有预留扩展存储器的接口,正是图中的P0和P1的第二功能(同时还要用到29、30等管脚)。因为用的不多,涉及知识也比较深入,就不做具体研究了。顺便一提,其实这里我们看到的AD0~AD7,就是用于并行口的。而P3口的第二功能,就包括串口等,后面学到了还会具体介绍。 IO口等效电路 由于深入理解IO口的原理涉及到很多电路甚至微机原理相关知识,这里只做简化介绍,能满足绝大多数情况下的需要。作为普通IO口使用时,四个IO口的工作原理基本一致。 下面的图是从前面图中的P1电路中裁剪出来的,也是我们需要理解的关键。 右边的P1.X表示P1的一个IO口,如P1.0;电阻右边写的英文是内部上拉电阻的意思,之所以叫上拉电阻,是因为电阻的一端接在VCC上。下面的三角形表示接地,相当于GND。除此之外,最关键的一个器件是下面这个。 这个器件的本质是晶体管,起到电子开关的作用(如果想深入了解,可以学习模拟电路相关的知识,或者等到原理篇中介绍)。上面的电路可以大致等效成下图。注意,这样的结构只是一个IO口,整个单片机中有32个这种结构。 图中的R为阻值10k的上拉电阻,S是由前面的晶体管等效的电子开关。蓝色框中的部分在单片机内部。 S的开关状态由CPU控制。当用程序设置P1.0管脚为低电平时,电子开关S闭合。实际上电子开关S闭合时,两端还有很小的电阻。根据分压原理,P1.0上会有一个很低的电压,近似0V,已经可以视为低电平了。当设置管脚为高电平时S断开,P1.0通过10k上拉电阻接到VCC上。如果用电压表测量,因为电压表内阻很大,所以可以得出其电压值为高电平。 IO口的输出:点亮LED 前面介绍了点亮第一个LED的程序和电路。程序如下: #include sbit LED = P1^0; void main() { LED = 0; while(1); } 电路关键部分如下,VCC通过1k电阻连接到LED正极,LED负极接到P1.0口: 在单片机执行LED=0的时候,电子开关S就由CPU控制而闭合,P1.0上输出低电平。电流通过1k电阻和LED流入P1.0,再经过S流入GND,LED两端有合适的电压于是点亮。结合单片机内部IO口等效电路,整个电路如下图 灌电流与拉电流 在上面的例子中,P1.0输出低电平点亮LED。能不能反过来,P1.0输出高电平点亮LED呢?我们可以考虑电路连接成下面这样,并在程序中编写LED=1。 当执行LED=1时,S断开。电流通过10k上拉电阻R从P1.0流出,并进入LED。由于上拉电阻的阻值太大,电流太小,导致LED不亮,或者亮度很微弱。所以通常不采用这种方法。 这两种方法,前者电流从外部流入单片机内部,我们称之为灌电流接法;后者电流方向相反,称为拉电流接法。对比可以看出,对于51单片机,灌电流接法电流较大,拉电流接法由于受到上拉电阻限制,电流较小。 在实际当中灌电流的最大电流也是有限的,因为电子开关S中能通过的电流有限。根据STC官方的芯片手册,对于STC单片机,建议单个IO口灌电流建议不超过20mA,所有IO口灌电流之和不超过55mA,否则容易烧坏IO口。而拉电流大小只有230uA左右。 上拉电阻/下拉电阻/高阻态 拉电流是从上拉电阻流出来的,能否提高拉电流大小呢?答案是可以。我们只需要在单片机外部再添加一个上拉电阻,就可以增大拉电流,并且能成功点亮LED,如下图所示。 图中的电路,相当于R和R0并联了,整个上拉电阻的阻值减小了。但是这样做有个缺陷。在这个电路中,当单片机输出低电平时,S闭合,此时电流从VCC通过上拉电阻和S流入GND。此时虽然LED熄灭了,但是却有较大电流通过上拉电阻而浪费掉。所以上拉电阻过大,会导致驱动力不足,而上拉电阻过小,又会在输出低电平时浪费电能。 上拉电阻的作用是什么呢?对电路了解多一点的人很快能发现,如果没有上拉电阻,IO口就无法输出高电平,也就是下图这样的。开关闭合时能输出低电平,但是开关断开时,P1.0就悬空了,什么也没连接。这时IO口的电压就是不确定的了,这种状态无法判断它是低电平还是高电平,叫做高阻态。很巧的是,单片机的P0口确实就没有上拉电阻,而其他三组IO口都有上拉电阻。所以当P0输出高电平,并且没有外接上拉电阻时,就是高阻态,不能正常输出高电平。后面我会通过具体例子来让大家感受一下高阻态。 备注1:后续文章会详细分析高阻态。 备注2:虽然P1.0似乎是同时连接到CPU的IO输入端了,即图中写着“输入”的绿色箭头,但是这部分电路只有在读取管脚输入的时候才会导通,并且是单向的,可以想象成内阻较大的电压表输入端。 备注3:如图中所示,51单片机IO口工作在普通IO口状态下,电子开关是用晶体管实现的(包括三极管和MOS管两种)。图中实现的这种电平输出结构,如果是MOS管实现,则被称为漏极开路输出(OD=Open Drain,或简称为“开漏”),漏极是MOS管的一个管脚,对应于图中S和R的接点处。而如果是三极管实现,则称为集电极开路输出(OC=Open Collector),两者原理基本一致。后续文章会介绍三极管。 上拉电阻的存在,将原本的高阻态转变成了高电平,也因此得名。和上拉电阻相对应的,还有下拉电阻,区别在于下拉电阻另一端不是连接VCC而是接到GND。 IO口的输入 IO口之所以叫IO口(IO=Input/Output),意味着它既可以输出又可以输入。前面讲的都是IO口的输出,下面讲IO口的输入。IO口的输出我们通过LED来介绍,而IO口的输入我们则通过开关来说明。在很多单片机中,IO的输入和输出需要通过电路切换,而对于51单片机来说,输入和输出使用的是同一套电路,也就是上面我们分析的电路。 图中的S0是一个单刀双掷开关,往上切换可以将P1.0接到VCC,往下切换可以接到GND。读取时CPU会通过特定电路获取图中橙色导线上的电平。我们想要实现的效果是,让CPU读取P1.0端口的电平,从而获得开关S0的状态。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"//www.hzfubeitong.com/m/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="https://m.elecfans.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'小白学单片机(20) IO口原理讲解资料下载',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.hzfubeitong.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);