51单片机40脚与20脚引脚功能详解及最小系统入门
简介围绕51单片机引脚功能展开的入门文档面向电子爱好者、嵌入式初学者及需要快速查阅引脚定义的技术人员重点解决AT89S51与AT89C2051两款常用芯片的引脚识别、功能划分和典型应用理解问题。内容从40脚PDIP封装入手说明引脚编号与缺口、凹点的对应关系并按主电源、外接晶振、控制引脚及P0P3四组8位可编程I/O口逐类梳理逐脚说明电源、时钟、复位等引脚用途及各端口编号范围同时介绍20脚AT89C2051精简掉P0、P2口后集成模拟比较器、适合小型低功耗系统的特点并涉及复位、ALE、EA等控制信号。压缩包内共1个doc文件约137KB篇幅集中、便于打印或随查随用。读者可据此对照芯片实物快速分辨电源、时钟、复位与可编程端口理解两组芯片在引脚数量和外围配置上的差异。已有2753人学习下载可作为51单片机入门阶段对照实物认脚、理解端口分布和开发精简应用系统的参考资料。1. 从一块“40 条腿的黑蜈蚣”说起很多人第一次拿到 51 单片机第一反应不是“我要写程序”而是“这 40 条腿到底谁是谁”。它黑乎乎一块两边各伸出一排金属脚没有说明书根本不敢通电——怕接错一根就冒烟。这就是学 51 单片机引脚之前最典型的心理状态。其实可以把这块芯片想成一栋只有 40 扇门的小楼两扇门专门进电一扇进、一扇出两扇门接“节拍器”四扇门管“什么时候重启、跑内部还是外部程序”剩下 32 扇门全是可以自己编程控制进出的“活动门”你想让哪扇门亮灯、转电机、响蜂鸣器都靠这 32 扇。把 40 根引脚按功能分堆恐惧感立刻就降一半。这份资料讲的就是这件事把标准 40 脚的 51 单片机和只有 20 脚的精简版本一根一根拆开讲清楚。适合完全没碰过硬件、连电阻电容都分不清的新手跟着把第一颗 LED 点亮就算真正入门了。2. 为什么要先啃引脚拆成四类就懂一半很多人学单片机的顺序是反的一上来就抄代码、烧程序结果灯不亮连从哪查都不知道。引脚就是这块芯片的“地图”先知道哪根是电源、哪根是地、哪根是复位出问题时你才有排查的方向感而不是把它当成一个黑匣子瞎试。这一章的目标很朴素让你看完之后能把 40 根引脚按功能分成四堆并且知道每一堆“不接会怎样”。先不求会写程序只求敢把线接上。2.1 电源和晶振先让芯片“活过来”任何芯片要工作第一件事是喂饱它。标准 40 脚 51 单片机的电源引脚只有两根Pin40 是 VCC接 5VPin20 是 GND接地。就这两根接反了轻则不亮重则发烫报废。所以新手第一次通电前务必用万用表量一遍别靠眼睛数。第二件事是给它节拍。芯片内部所有动作都是踩着时钟节拍走的没有时钟它就是一坨硅。外接晶振的两根引脚是XTAL1Pin19是片内振荡电路的输入端XTAL2Pin18是输出端。典型接法是在这两脚之间跨接一颗石英晶体常见范围 2MHz 到 12MHz再从每只脚各接一颗 10pF 到 30pF 的振荡电容到地。为什么要这两颗小电容它们不是“滤波”那么简单而是帮晶体稳定起振的。我第一次焊最小系统时图省事把电容省了结果芯片时好时坏查了一整晚才找到原因这种“玄学”故障基本都是起振不稳导致的。还有一种时钟接法叫外部时钟方式把 XTAL1 接地外部时钟信号从 XTAL2 输入。入门阶段用不到先记住晶振两脚加两颗电容这个经典组合就够了。晶振要尽量靠近芯片走线越短越稳这一点在后面讲排查时还会提到。2.2 控制引脚复位、ALE、PSEN、EA 各管什么四根控制引脚里新手最先要认的是Pin9RST/VPP复位引脚。它的规则是引脚上出现 2 个机器周期以上的高电平系统就复位一次。按经典 12 分频的算法2 个机器周期大约是 24 个时钟周期。所以你会看到经典复位电路是“一颗电容 一颗电阻 一个按键”上电瞬间电容相当于短路RST 被拉高芯片自动复位电容充满后 RST 回到低电平程序开始跑按键按下时手动再复位一次。这个 VPP 还是个复用脚在 VCC 掉电期间可以接备用电源让内部 RAM 的数据不丢——入门阶段先不用管它。Pin30ALE地址锁存。访问外部程序存储器时它输出的信号用来锁存低位地址不访问外部存储器时它会输出一个频率为时钟 1/6 的正脉冲。这个特性非常有用程序明明烧进去了但不跑你可以拿示波器或频率计量一下 ALE 脚有脉冲说明芯片在跑没脉冲说明芯片根本没工作——这是排查时最省时间的一招。Pin29PSEN外部程序存储器读选通访问外部存储器时输出负脉冲把指令数据读进来。Pin31EA/VPP内部外部程序存储器选择线接高电平程序地址在 4KB 以内时读内部存储器超出 4KB 才去读外部接低电平不管地址多大一律读外部。对新手来说这四根里只有一句话必须刻进脑子不扩展外部程序存储器时EAPin31必须接高电平。悬空或者接地程序就烧不进去或者跑不起来。后面“避坑”那一章还会专门说这个。2.3 32 根 I/O 口P0/P1/P2/P3 脾气不一样40 根引脚里最热闹的是 32 根可编程 I/O分成四组每组 8 根端口引脚范围名称电气脾气P0Pin39 到 Pin32P0.0 到 P0.78 位双向 I/O内部无上拉用的时候一般要外接上拉排阻P1Pin1 到 Pin8P1.0 到 P1.78 位准双向 I/O内部有弱上拉P2Pin21 到 Pin28P2.0 到 P2.78 位准双向 I/O内部有弱上拉P3Pin10 到 Pin17P3.0 到 P3.78 位准双向 I/O部分引脚复用中断、串口等第二功能“准双向”这个词新手最容易懵。翻译成人话它内部有个弱上拉能输出高电平但这个高电平很“虚”拉不出多少电流可它拉低的能力很强能灌进比较大的电流。所以驱动 LED 时大家习惯把 LED 接在 5V 和引脚之间让引脚拉低来点亮——这是灌电流稳。反过来让引脚输出高电平去点亮 LED往往会暗得几乎看不见。P0 更特殊它是真正的双向口但内部没有上拉电阻输出高电平时相当于悬空所以你经常在电路图上看到 P0 口挂一排上拉电阻。P3 则是“兼职最多”的一组部分引脚同时是外部中断输入、定时器计数输入、串口收发脚开发产品时如果用到这些功能对应引脚就不能再当普通开关用了。2.4 最小系统是怎么凑出来的明白了功能分类最小系统就不神秘了。所谓最小系统就是让芯片能跑起来的最低配置清单如下电源Pin40 接 5VPin20 接地电源两端就近放一颗 0.1μF 去耦电容。时钟Pin18 和 Pin19 之间跨接晶振两端各一颗 10pF 到 30pF 电容到地。复位Pin9 接复位电路电容电阻加按键保证上电时能拉高再回低。运行模式Pin31EA接 5V告诉芯片读内部程序。下载口早期型号要靠编程器后来支持在系统编程的型号可以直接用下载线烧写这一步省了很多拔插芯片的麻烦。把这几样凑齐芯片就已经“活着”了虽然它还没干任何事。剩下来的 32 根 I/O就是你和它对话的接口——你想让它控制电机、交通灯、霓虹灯全靠这些引脚输出高低电平或者读入外部信号。想象空间是完整的剩下的只是怎么把它们接对。3. 第一步怎么迈数引脚、认方向、点亮第一颗灯概念清楚之后最怕的就是“知道但不敢动手”。这一章给你一条最短的动手路径先把引脚数对再搭一个只有一颗 LED 的电路最后写五行代码让它闪起来。整个过程不需要任何复杂工具一块芯片、一颗晶振、两颗电容、一颗电阻、一颗 LED 就够。3.1 先学会数引脚缺口和凹点就是你的起点数引脚这件事翻车率比想象中高。40 脚双列直插封装的计数规则是把芯片的缺口朝上1 脚在左上角缺口附近通常还有一个凹点标记从 1 脚开始逆时针数1 到 20 沿着左边一列往下20 在左下角21 在右下角继续往上数到 40 在右上角。按这个规则Pin20 是 GND正好在左下Pin40 是 VCC正好在右上。这两个位置很有辨识度你可以先找到它们再对照数据手册确认其他脚。我第一次接线时把芯片转了个方向结果整个编号全部镜像接上电直接不亮还以为是芯片坏了——血泪经验芯片插进面包板之前先用手机拍一张带缺口标记的正面照标好 1 脚和 40 脚再动手。3.2 第一个例子在 P1.0 上挂一颗 LED我们选 P1.0也就是 Pin1来点灯因为它属于准双向口内部有上拉接法容错率高最适合第一次动手。电路这样连5V 电源引出一根线接一颗 220Ω 到 1kΩ 的限流电阻。电阻另一端接 LED 的正极长脚。LED 的负极短脚接单片机的 P1.0也就是 Pin1。别忘了电源、晶振、复位、EA 那四组基础连接。这样接的意思是引脚输出低电平时电流从 5V 经过电阻、LED 流进引脚灯亮引脚输出高电平时两端电压差不够灯灭。之所以让引脚“拉低”来点亮是因为准双向口拉低能力强、拉高能力弱顺着它的脾气来电路才稳定。限流电阻不能省省了那一刻灯很亮但引脚和 LED 都在超负荷工作属于典型的省小钱坏大事。3.3 代码逐行拆为什么要先写 1 再写 0#include reg52.h // 引入 51 单片机的寄存器定义端口名字才能直接用 sbit LED P1^0; // 把 P1 口的第 0 位单独起个名字叫 LED读代码更直观 void delay(unsigned int n) // 一个很粗糙的延时函数作用就是耗时间 { unsigned int i; while (n--) for (i 0; i 120; i); // 空循环什么也不干纯粹拖时间 } void main(void) { while (1) // 单片机程序没有结束这回事必须一直循环 { LED 1; // P1.0 输出高电平灯灭 delay(500); // 停一会儿让人眼能分辨 LED 0; // P1.0 输出低电平灯亮 delay(500); // 再停一会儿 } }逐段说清楚。第一行引入头文件是为了让P1这种端口名能被编译器认识不同厂家的编译器头文件名略有差别用之前确认一下工程里的实际文件名。sbit LED P1^0;这一句是把 8 位端口里的第 0 位单独取出来赋一个有意义的名字你也可以叫它D1名字只是给人看的编译后指向的还是同一个引脚。delay函数没有任何技术含量就是让 CPU 空转转够一定次数大概就是几毫秒。这种延时时长不准受晶振频率影响很大但它足够让你看清灯的闪烁入门阶段不用纠结精度。后面学定时器才是正经做时间控制的路子。主函数里的while (1)是重点单片机程序不是“跑完就退出”它必须永远转下去一旦退出就会跑飞。循环体里先写 1 再写 0对应先灭后亮顺序其实无所谓关键是两次赋值之间要有延时否则闪烁速度太快人眼看起来就是一直亮着——这也是新手最常见的“我的灯怎么不闪”的原因之一。3.4 灯不亮时先查这三样程序烧进去但灯不亮别急着改代码先按顺序查硬件量电源万用表直流档测 Pin40 和 Pin20 之间是不是稳定的 5V。电压偏低可能是电源带不动或者线太细。看 EAPin31 是不是稳稳接在 5V 上。悬空是最常见的隐形杀手。查复位Pin9 在正常运行时应为低电平。如果一直是高电平芯片就一直在复位程序根本没机会跑。看 ALE量 Pin30 有没有脉冲输出。有脉冲说明芯片在工作问题在外部电路没脉冲说明芯片压根没起来。这个顺序的逻辑是“从供电到运行状态”一层层往外排。养成这个习惯比记住任何一行代码都值钱。4. AT89C205120 条腿的精简版怎么用不是所有产品都需要 32 个 I/O。做一个简单的电池供电小装置可能只用得上三五个引脚这时候 40 脚的芯片就显得又大又费电。精简版 51 单片机就是为这种场景准备的它砍掉了整整两组 I/O只留 20 个引脚体积小一半工作电压最低能到 2.7V用两节 5 号电池就能带起来。这一章讲清楚它少了什么、多了什么、什么时候该选它。4.1 少掉的 P0 和 P2 意味着什么精简版最直接的变化是P0 口和 P2 口被整个精简掉了只剩下 P1 整组 8 根加上 P3 里保留的一部分可用 I/O 大约是 15 根。对新手来说这个数字意味着写程序时的思维要跟着变——不能再随便写P0 0xFF因为那些端口在芯片上根本不存在。但少掉的不只是引脚还有一整类用法。P0 和 P2 在标准 51 上还有第二职业扩展外部存储器时P0 送低位地址和数据P2 送高位地址。精简版把这两组砍掉就等于明确告诉你“我不打算扩展外部存储器”程序和数据全在片内。这既是限制也是简化你不需要再操心地址锁存、片选这些事程序结构可以非常干净。所以选精简版的心态应该是先想清楚这个产品需要几个 I/O、要不要外扩存储两个答案都指向“小”它就合适。反过来如果你打算接一块液晶、一片存储芯片、一堆按键那 15 根线很快就会不够用老老实实上 40 脚的型号更省心。4.2 引脚对照表20 脚和 40 脚怎么对应入门阶段不必死记 20 脚的每一个编号按功能对号入座更实用功能标准 40 脚型号20 脚精简型号电源 / 地Pin40 / Pin20保留各一根晶振输入输出Pin19 / Pin18保留各一根复位Pin9保留一根P0 口Pin39 到 Pin32共 8 根没有P1 口Pin1 到 Pin8共 8 根整组保留P2 口Pin21 到 Pin28共 8 根没有P3 口Pin10 到 Pin17共 8 根只保留一部分串口、外部中断、定时器输入这些常用功能还在模拟比较器无有和 P1 的部分引脚复用这张表的使用方法是先按标准型号的思路设计功能再逐条检查“这一路信号用的端口在精简版上有没有”。凡是碰到 P0 或 P2 的一律改到 P1 或 P3 上去改完再编译。最容易犯的错不是接线而是程序里还写着 P0 和 P2编译能过下载也“成功”但引脚上什么都不会发生——因为那些引脚在物理上就不存在。4.3 模拟比较器这个小东西能省一颗芯片精简版最值钱的地方是它内部集成了一个模拟比较器。它的作用很朴素拿两个引脚上的电压比大小把结果告诉芯片内部。听起来简单但实际很省事。举个典型场景做一个电池供电的小装置你希望电池电压掉到某个值时给个提示。传统做法是外面再搭一颗比较器芯片加几个电阻分压占地方还费电。有了内部比较器你只要把电池电压分压后接到一个复用引脚另一个引脚接一个参考电平芯片自己就能判断“电压低了”程序里读到结果就去闪灯或者关机。对新手来说这一块可以先不深究寄存器怎么配先建立一个认知这颗芯片不是单纯的“少了引脚的 51”它多了一个能省掉外围器件的小工具。等你把点灯、按键这些练熟了再回头折腾它会顺很多。选型时如果发现自己的需求里恰好有“比电压”这类活那它就是加分项。4.4 什么时候选精简版什么时候别省一句话判断I/O 需求少于 15 根、不需要外扩存储器、希望用电池供电就选精简版。它的低工作电压和体积优势在小设备上是实打实的做便携产品时能少一堆电源转换的麻烦。反过来的情况也很清楚需要接多个数码管、矩阵键盘、液晶屏或者未来可能要扩存储那 40 脚标准型号更合适。省下的那点体积抵不过后期反复改板的成本。我第一次做小板子时为了“省地方”硬上精简版结果后期想加个显示模块I/O 直接不够只能重新画板。从那以后我的原则是先按需求算出 I/O 数量再往上留三成余量然后才决定用哪种封装。这个习惯比任何选型口诀都管用。5. 避坑清单新手最常翻车的五个现象与解法这一章单独拿出来讲是因为前面几章讲的是“应该怎样”而实际操作中出问题的往往不是不懂原理而是几个反复出现的固定坑。下面五条按“现象 → 原因 → 解决”写遇到问题可以当检查表用。5.1 现象一通电芯片就发烫程序毫无反应原因电源接反或者 VCC 与 GND 接错了引脚。40 脚芯片两边各 20 根引脚方向一反编号全部镜像本来该接 Pin40 的线接到了别处。也有人把 5V 直接加到了某个 I/O 上造成内部结构过流。解决立刻断电别抱着“再试一下”的心态发烫说明电流已经不正常了。然后用万用表二极管档或通断档从电源正极一路量到 Pin40从负极量到 Pin20确认没有短路。重新数引脚缺口朝上1 脚在左上逆时针数。养成“上电前先量电源两端电阻”的习惯能挡掉大部分损失。5.2 现象程序下载提示成功但电路一点动静都没有原因EA 引脚Pin31悬空或者接了低电平。这根线决定芯片读内部还是读外部程序存储器悬空时电平不确定芯片可能一直在等外部存储器里的指令而外部根本没有器件。解决把 Pin31 直接接到 5V。接的时候注意别和其他线虚接面包板上的孔用久了会松插进去要有点阻力才靠谱。接好后重新上电如果 ALE 脚Pin30能量到脉冲说明芯片已经在跑了。5.3 现象灯忽亮忽灭、程序时好时坏像“玄学”原因晶振不起振或者起振不稳定。常见原因有三个振荡电容取值偏大或偏小典型范围是 10pF 到 30pF、晶振离芯片太远走线太长、晶振引脚附近有干扰源。解决先把两颗电容换成 20pF 左右试试再把晶振尽量贴近芯片引线剪短。如果手头有示波器量一下 XTAL2 有没有稳定波形没有示波器就量 ALE 脚的脉冲频率间接判断时钟是否正常。这类问题最忌讳“改代码试试”因为它压根不是代码的事。5.4 现象P0 口接了 LED亮度极低几乎看不见原因P0 口内部没有上拉电阻输出高电平时相当于悬空拉电流能力极弱。很多人照着 P1 的接法直接搬到 P0 上结果就是“电路没错就是不亮”。解决给 P0 口外接一排上拉电阻常见 10kΩ 排阻或者干脆把 LED 挪到 P1、P2 上去。新手做实验时建议优先用 P1 练手它的准双向结构容错率最高能把“端口特性”这个变量先排除掉。5.5 现象精简版芯片上跑标准版的程序编译通过但没有输出原因程序里操作了 P0 或 P2 端口而精简版物理上没有这两组引脚。编译器不会报错因为它只认语法下载也不会报错因为程序确实写进去了只是写到了一个不存在的门上。解决全局搜索代码里的P0和P2逐个改到P1或保留的P3引脚上同时检查硬件接线是否跟着改。移植程序时最好先列一张“用到哪些引脚”的清单再和芯片实际引脚对照一遍别等烧进去才想起来。这一步花五分钟能省掉一晚上的自我怀疑。6. 接下来学什么从“会数引脚”到“能自己画最小系统”引脚认全了、灯点亮了接下来最有效的路径不是立刻去啃厚书而是按“能做出东西”的顺序往前推。下面这条线是我带新人时反复用的一条节奏大概是这样阶段练什么检验标准第一周最小系统搭熟反复拆装三遍不看图纸能独立接出电源、晶振、复位、EA第二周一个按键控制一颗灯按下亮、松开灭接触抖动问题能说清原因第三周定时器做精准闪烁闪灯周期不再靠空循环能用参数算出时间第四周中断响应按键主循环在忙别的按键依然能被立刻响应第五周串口收发一个字节电脑上能看到芯片发来的字符第六周接一个显示模块或传感器能把读到的数据变成看得见的东西推进的时候有三个具体建议。第一每换一个新外设先把引脚需求写下来再接线尤其是从 40 脚换到 20 脚或者反过来的时候这张纸能救命。第二永远保留一个“能跑通的最小工程”新功能在这个工程上加加坏了就退回去别在一个已经乱掉的工程里挣扎。第三学会用 ALE 脚和电源电压做第一轮判断这两项能快速把问题分成“芯片没工作”和“外部电路有问题”两大类排查范围立刻缩小一半。还有一点很多人忽略把这个资料里 40 脚和 20 脚的引脚功能对照表打印出来贴在工位上。刚开始你一定会记混哪根是复位、哪根是 EA贴一张纸比反复翻电子文档快得多。等你能不看表接完最小系统这张纸就可以收起来了。我第一次独立搭最小系统时因为没检查 EA 就把电通上对着不亮的灯折腾了整整一个晚上最后发现那根线一直悬在半空。从那以后我每次上电前都强制走一遍“量电源、看 EA、查复位、测 ALE”这四步再也没在这上面栽过跟头。希望帮到你也祝你的第一颗灯早点亮起来。这份把 40 脚和 20 脚逐根讲透的引脚整理稿已经放在下载区随时可以取下来对着板子一根根比对。本文还有配套的精品资源点击获取