ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

零基础学51单片机:从点灯到智能小车的完整路径

零基础学51单片机:从点灯到智能小车的完整路径 如果你是从零开始学单片机又正好刷到“51单片机”这个关键词那我猜你现在大概处于这么个状态听说过Arduino也听说过STM32但总感觉直接上手那些不太踏实想从更底层的东西开始打基础。这个感觉是对的。51单片机这玩意儿虽然诞生几十年了芯片本身性能放在今天也确实不够看但它在“讲清楚单片机到底是怎么工作的”这件事上依然是最好的教材没有之一。这篇东西我不打算给你念PPT式的教程而是站在“带过不少新人、自己也踩过无数坑”的角度把51单片机从选芯片、搭环境、写点灯程序一直到定时器、串口、传感器、做小车综合项目的完整路径捋一遍。你照着这个顺序走会比漫无目的地刷视频高效很多。里面涉及的流水灯、数码管、LCD1602、温度报警器、倒车雷达这些热门关键词也都会穿插在对应的阶段里讲明白保证你学完一个项目能自己变出三个项目来。1. 为什么2024年了还在学51这芯片到底能干嘛先把这个最扎心的问题说清楚。每次我一提51总有人跳出来说“都什么年代了还学这个直接上STM32不香吗”。香是香但你要搞清楚一个逻辑STM32是Cortex-M3/M4内核主频几十上百兆外设多到能砸死人你拿它学点灯和拿大炮打蚊子没区别而且很容易迷失在浩如烟海的寄存器库里最后点个灯成功就觉得自己会了实际上对单片机本身还是一头雾水。51单片机最大的价值在于它足够简单简单到你能把每一个模块的每一个细节都看清楚。你去看市面上所有单片机教程第一课几乎都是点灯。为什么因为点灯是硬件世界里的“Hello World”它牵涉到引脚配置、电平高低、电流方向、程序烧录整个闭环流程。51的学习路径就是把这一套最小闭环一点点扩大从点灯扩展到按键输入从按键扩展到数码管显示从数码管扩展到定时器中断再从中断扩展到串口通信。每加一个模块你都能清楚地知道它在芯片内部是怎么运作的除了配置好寄存器之外的底层逻辑是什么。这就像学车。你直接学开赛车也能开但你对路况、对车辆机械原理的感知是缺失的。你先开一辆手动挡老捷达把离合、换挡、半坡起步练得滚瓜烂熟以后再去开什么车都游刃有余。51就是那辆老捷达它老但它能让你真正学会“开车”这件事而不只是会“踩油门”。再往实际了说51单片机在工业控制、小家电、教学实验、电子竞赛里面依然大量存在。很多温度报警器、电子秤、电动窗帘控制器、智能小车的底层控制板里面跑的就是一颗几块钱的51单片机。成本低、稳定性强、开发资料多这是它在商业上依然拥有生命力的原因。你学完了它并不是学了一个“古董知识”而是掌握了一类低端控制芯片的通用开发思路以后切到STC的其他型号、甚至切到合泰、松翰这类国产8位机基本是无缝衔接的。所以别被“过时”这两个字劝退。51单片机在今天的作用不是拿来造火箭而是拿来给你造地基。地基打得越扎实后面盖楼的速度才越快。2. 入门阶段的硬件选型与环境搭建方向明确了接下来就是动手前的准备。硬件选型和软件环境这两块我见过太多人在第一步就磨叽半天其实真没必要纠结照着下面这套组合拳来是最省钱的路线。2.1 芯片与开发板的三种形态怎么选51单片机虽然叫“51”但市面上流行的型号很多最经典的是Atmel的AT89C52国产替代最火的是STC公司的STC89C52RC。我给你的建议是直接选STC89C52RC因为它有两个天然优势第一支持串口下载程序不需要额外的编程器一根USB转TTL线就能搞定第二资料多到爆炸不管是视频教程还是代码例程十有八九都拿它当主角。至于开发板形态目前常见的有三种形态特点适合人群面包板芯片杜邦线成本最低所有电路自己搭对原理理解最深有一定电子基础、想彻底搞懂硬件的玩家集成开发板如普中、金沙滩板载LED、数码管、按键、LCD接口、蜂鸣器等到手即用绝大多数零基础新手最小系统板外设模块板子很小外设通过杜邦线连接灵活性强已经完成入门想做综合项目的人我自己带新人的经验是如果你是纯小白直接买一块集成开发板别犹豫。自己从面包板搭最小系统当然很酷但一开始的挫败感会非常大很多人就是在反复的飞线接触不良中放弃了学习。用集成板先把程序逻辑跑通建立自信心等你需要做智能小车、倒车雷达这类项目的时候再买最小系统板和传感器模块自己接那时候你对电路已经有感觉了。2.2 软件环境Keil、烧录工具、仿真软件一条龙软件这边主要三件套Keil C51、STC-ISP、Proteus。Keil C51是写代码和编译的IDE它是一家德国公司的产品专门做嵌入式开发工具你用的版本可能是C51 V9.x或者新版C51。请务必注意你安装的是C51版别装成MDK-ARM版那是给STM32用的装错了编译51程序会报错。这个坑我每年都要帮人排好几次。STC-ISP是宏晶官方出的烧录软件作用是把编译生成的.hex文件写进单片机。它的一个额外功能是可以生成定时器初值的计算代码这个对于新手来说简直是救命的。后面讲到定时器的时候你就知道它有多好用。Proteus是仿真软件可以在电脑上虚拟搭建电路不需要实物就能跑程序。它的价值在于当你手头没有某个传感器模块或者不敢确定电路接法的时候先用它在电脑上验证一遍。很多人在做“基于51单片机的温度报警器设计”这类课设时就是靠Proteus完成全部验证的。不过我要提醒一句仿真终究是仿真实物搭建时你可能遇到晶振不起振、杜邦线接触不良、电源电流不够等奇奇怪怪的问题这些在Proteus里都遇不到。所以建议的做法是“仿真验证逻辑实物验证世界”。还有个易被忽略的小东西CH340驱动。你的USB转TTL下载线或者开发板上的USB芯片大概率是CH340Windows系统有时候不会自动识别它需要手动装驱动。烧录不成功十有八九是驱动没装好或者烧录软件里串口号选错了。2.3 Keil工程创建的三个关键配置创建一个51工程核心操作就三步但每一步都有一个容易出错的配置项新建工程时选择芯片型号STC89C52在Keil默认列表里没有可以选“Atmel”下的“AT89C52”代替功能兼容不影响使用。写代码前必须勾选“Generate HEX File”选项这个选项在Options for Target - Output里。不勾选的话烧录软件拿不到.hex文件等于白写。添加Startup.a51文件时新手容易忽略其实Keil会在你新建工程时自动询问是否添加选择“是”就行了。环境这块撑死了折腾你一天。如果超过一天还没搞定大概率是下载线的RX/TX接反了。STC单片机下载是“单片机RX接USB线的TX单片机TX接USB线的RX”交叉连接这个“交叉”两个字记死了很多人的下载失败都源于此。3. 从点亮一颗LED到玩转点阵屏环境就没问题了第一个程序来了。热搜词里你也能看到“51单片机点亮一个led灯程序流程图”和“8*8点阵”是高频词这两个确实是向嵌入式世界打招呼的最佳方式。这一节我直接把代码、硬件原理、以及从这里延伸出来的点阵屏一口气讲透。3.1 点亮LED的硬件原理和程序流程图先说硬件原理。LED灯珠发光的条件说穿了就是两端要有足够的电压差让电流流过它。51单片机IO口输出高电平时电压接近5V输出低电平时接近0V所以只要把一个LED的一端接在某个IO口上另一端通过一个限流电阻接地低电平点亮接法当IO口输出低电平也就是为0的时候电流就从5V电源经限流电阻和LED流入单片机引脚LED就亮了。这个“低电平点亮”是51单片机开发板最常用的接法因为它比“高电平点亮”更容易理解而且51的IO口灌电流能力比拉电流能力强点亮效果更稳定。那程序怎么写看下面这个最简代码#include reg52.h sbit LED1 P2^0; // 把LED1映射到P2口的第0位 void main() { LED1 0; // 输出低电平点亮LED while(1); // 死循环让程序停在这里 }这段代码的逻辑用流程图表示就三步定义引脚、拉低电平、原地循环。几乎所有的51程序都是这个骨架只是把“LED10”替换成更复杂的功能而已。我对新人的要求是这个流程图一定要自己画一遍因为往后你写按键扫描、写传感器读取脑子里都离不开“初始化→执行功能→循环”这个基本框架。3.2 从点亮到流水灯延时函数的核心地位点灯成功后下一步几乎都是做流水灯。也就是让8个LED轮流亮灭看起来像水在流动。这个功能的核心就是延时让每个灯亮一段时间再切换下一个时间间隔的控制就靠延时函数。#include reg52.h #define uchar unsigned char #define uint unsigned int void delay(uint ms) { uint i, j; for(i ms; i 0; i--) for(j 110; j 0; j--); } void main() { uchar i, led; while(1) { led 0xFE; // 低电平点亮1111 1110第一个LED亮 for(i 0; i 8; i) { P2 led; delay(200); led (led 1) | 0x01; // 左移一位点亮下一个灯 } } }这里面最值得讲的是延时函数的写法。for(j 110; j 0; j--);这个数字110不是拍脑袋想出来的它跟你的晶振频率、编译器优化等级都有关系。在12MHz晶振下这个嵌套循环跑一遍大约是1ms。但如果你换了个编译器优化或者改了晶振延时就不准了。所以更可靠的做法是用定时器做延时这个后面会说。现在你要理解的是单片机没有“sleep”函数延时的本质就是让CPU空转。这个理解很重要因为它关系到后面你会学到的一个概念如果CPU一直在空转延时它就没空去扫描键盘、读取传感器了。所以才有“定时器中断”这种不必占用CPU的延时方案。3.3 点阵屏8x8点阵的原理与进阶玩法点阵屏是流水灯的自然延伸。搜索引擎里“8X8点阵箭头动态显示”“点阵屏蔡徐坤”这些关键词特别有意思说明很多人已经玩出花来了。一颗8x8点阵屏由64个LED按8行8列排列16个引脚控制其中8根控制行8根控制列。要显示一个图案原理上就是同时驱动多颗LED把需要的LED点亮不需要的熄灭利用人眼视觉暂留效应快速循环刷新每一行你就看到了完整的图案。核心代码如下所示unsigned char code arrow_array[8] { 0x18, // 00011000 0x3C, // 00111100 0x7E, // 01111110 0xFF, // 11111111 0x3C, // 00111100 0x3C, // 00111100 0x3C, // 00111100 0x3C, // 00111100 };这段数组存的是一个箭头图案每行一个字节二进制位为1的对应的LED就亮。动态显示箭头滚动本质就是每隔一段时间把这个数组的整体位置偏移一列。点阵屏玩到这里你对“用数组表示图案”这个思想就有了概念后面做贪吃蛇、俄罗斯方块底层逻辑都是同一套。点阵屏有个经验性的坑驱动电流问题。8x8点阵全亮的时候总电流可能超过100mA直接借51单片机IO口是带不动的容易导致电压跌落。正确的做法是用74HC595移位寄存器或ULN2803驱动芯片来扩展驱动能力。这也是为什么你在很多智能小车电路图里会看到一堆595芯片的原因。4. 定时器、中断和数码管单片机性能的真正试金石点灯是新手村接下来这个阶段才是真正拉开差距的地方。定时器和中断是51单片机学习中最抽象、也最重要的两个概念。你可以不懂怎么画PCB但绝不能不懂定时器中断。这部分内容吃透你就从“会用”变成了“懂一点原理”。4.1 定时器的本质就是一个计数器很多教材把定时器讲得玄乎其玄我看着都累。说白了定时器的硬件原理就是一个加法计数器它不停地从0往上加加到最大值8位模式是25616位模式是65535时溢出产生中断。你只要告诉它“从哪个数开始加”以及“加多少溢出”就可以精确控制溢出时间。这里牵涉到四个工作模式寄存器TMOD、TCON里的几个位以及初值计算。比如你要做一个1ms的定时晶振12MHz那么机器周期就是1微秒12MHz/12分频定时器每加1耗时1微秒。想要1ms溢出需要计数1000次而16位定时器的最大值是65536所以初值就是65536-100064536换成十六进制就是0xFC18。你可以手动算也可以直接用STC-ISP烧录软件里的“定时器计算器”功能自动生成推荐后者新手先别在初值计算上浪费时间先把原理走通。4.2 中断单片机响应外部事件的机制中断这个概念用生活类比最好理解你正在厨房做饭主程序执行突然电话响了中断请求你停下做饭去接电话进入中断服务函数接完电话回去继续做饭恢复主程序执行。单片机做的事情完全一样而且这个“接电话”不影响你原本锅里炒着的菜因为现场状态断点会被自动保存处理完再恢复。51单片机有5个中断源外部中断0/1、定时器0/1、串口中断。最常用的就是定时器中断。它的代码框架长这样void main() { TMOD 0x01; // 设置定时器0为模式116位定时 TH0 0xFC; // 赋初值高8位 TL0 0x18; // 赋初值低8位 EA 1; // 打开总中断 ET0 1; // 打开定时器0中断 TR0 1; // 启动定时器 while(1) { // 主循环里该干嘛干嘛定时任务在中断里完成 } } void timer0_isr() interrupt 1 { // 定时器0中断服务函数 // 在这里做需要定时做的事 }有一种典型的应用就是做一个1秒的电子时钟。由于定时器每次溢出就是50ms或设定的定时长度在中断里每进20次就表示1秒到了秒数加1并更新显示。这个思路看似简单但它是整个“电子时钟”“电子秒表”“万年历”项目的核心骨架。你在热搜里看到的“51单片机电子时钟”“基于51单片机的电子秒表”这些课设题本质上都是把这个中断计数逻辑再做些外围扩展。4.3 数码管显示动态扫描是外设驱动的第一课和定时器最搭的外设就是数码管。它是一个7段带小数点8段LED封装在一起构成的显示器件通过让不同段亮灭来组成0-9的数字。如果8个数码管每个都单独接I/O口显示那需要8*864个引脚单片机根本不够用。于是就有了“动态扫描”技术同一时刻只让一个数码管显示轮流点亮每个数码管只要刷新速度够快大于50Hz也就是每20ms内完成一次全轮扫描人的眼睛因为视觉暂留效应会看到所有数码管同时显示的不同数字。动态扫描的代码核心是一个数组查表的逻辑这里以共阴极数码管为例unsigned char code table[] { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F, // 9 };三个关键点全是实战经验扫描循环之间必须加很小的延时1-2ms不然切换太快会出现显示暗度不均。切换下一个数码管之前先关闭所有段选信号这叫“消隐”否则会出现拖影模糊肉眼看着数字像带了一层残影。这个细节是最多人忽略也是电赛答辩时最容易被老师挑刺的问题。数码管引脚控制一般也要经过驱动芯片如74HC573锁存器因为它需要20mA级别电流直接用引脚驱动会发暗或损坏芯片。5. 串口通信与LCD1602让你的单片机具备“交互”能力学到这里单片机在你手里已经会点灯、会倒计时、会显示数字了但它还像个埋头干活的哑巴你是看不到它内心的。串口通信和LCD1602就是两种让单片机“开口说话”的方式也是你做温度报警器、电子秤项目时数据能看到的关键环节。5.1 串口最简单的设备间通信方式串口通信的本质是“发信人和收信人之间约定好一个规则按位传送数据”就像两个人约好用摩斯密码交流啪嗒啪嗒地按出一个字符一个字符。51的串口把数据一位一位地往外发送接收方再一位一位地拼接还原成完整的字节。串口通信最重要的参数是波特率它表示每秒传多少位。常用的波特率是9600或4800。波特率不是随便设的它需要通过定时器1产生。前面的“定时器初值计算”在这里用到在12MHz晶振下波特率9600需要设置定时器1为模式2、自动重装8位初值为253。具体程序如下void UART_Init() { TMOD 0x0F; // 清空定时器1模式位 TMOD | 0x20; // 定时器1设为模式28位自动重装 TH1 0xFD; // 设置波特率9600 TL1 0xFD; TR1 1; // 启动定时器1 SCON 0x50; // 串口模式1允许接收 EA 1; // 开总中断 ES 1; // 开串口中断 } void UART_SendByte(unsigned char dat) { SBUF dat; // 把数据写入发送缓冲区 while(!TI); // 等待发送完成标志 TI 0; // 清除发送完成标志 }串口通信是51学习中最接近“计算机”概念的一环也是后面通过ESP8266模块让单片机联网、通过蓝牙模块控制小车的基础。掌握了串口你会发现单片机不再是孤岛它可以和电脑、手机、WiFi模块自由对话。调试时有个经验把电脑自带的“串口助手”或“SSCOM”打开设置好波特率就能看到单片机发来的数据。如果收到的是乱码先别急着怀疑程序90%的可能原因是电脑上选的波特率和程序里设置的波特率不一致或者晶振是11.0592MHz没对准。除了这俩基本不会出别的乱子。5.2 LCD1602显示字符型信息的主力如果串口是“打电话”那LCD1602就是“写纸条”。它是一种只能显示字母、数字和符号的液晶模块两行每行16个字符。电子时钟、万年历、倒车雷达这类项目最终的显示归宿基本都是它。LCD1602的驱动逻辑说穿了也简单初始化进入8位模式然后每次发送数据或命令时通过RS引脚告诉它“我发的是命令还是数据”通过E引脚给一个脉冲表示“可以读取了”。但它的时序图看着比较吓人所以很多教材都给封装库新手不用深究时序原理直接调用现成的LCD_Init()和LCD_WriteString()函数就行。我要提醒你几个LCD1602的血泪教训对比度调节电位器一定要接不接或者接到极端位置LCD上是什么都看不到的。这个电位器调到偏一点的位置最合适通常在10K左右。LCD1602的16个引脚里VL第三脚最容易被忽略但它恰恰是决定显示清晰度的关键。程序初始化时必须执行延时而且延时时间要足够特别是上电后要等待15ms以上。如果初始化太快LCD还没准备好就会出现花屏或者不显示的问题。我用这个模块做温度报警器的显示端时就栽过这个坑程序逻辑没问题温度传感器读数也正常但屏幕就是白屏。折腾了一个晚上最后发现是上电初始化延时不够LCD还没来得及就绪。换言之后加了个20ms延时立即解决。经验换来的教训LCD1602的“慢热期”是玄学宁愿多等也不能催它。6. 从传感器到综合项目温度报警、倒车雷达、智能小车的完整路径到这里你已经具备了单片机开发的核心能力IO控制、定时中断、显示、通信。剩下的就是把这些能力组合起来做真正的综合项目。这块内容非常关键因为不管是课程设计、毕业设计还是你以后想参加电子设计竞赛考的都是你的“组合能力”而不是单个知识点。6.1 温度传感器与报警器项目需要知道的事“基于51单片机的温度报警器设计”是课设第一大热门题。核心硬件就四个部分温度传感器DS18B20、单片机、显示器件数码管或LCD1602、报警器件蜂鸣器。DS18B20这个传感器有点意思它用的是单总线协议意思就是“一根线既传数据又传时钟”。它的时序要求非常严格尤其是初始化时序里的480us低脉冲和60us延时拉得不准确就读不到数据。所以当你发现读上来的温度一直是85度这是DS18B20的上电默认值时别改传感器了多半是你时序里的延时少了几个微秒。整体程序设计思路可以这样拆解主循环里不断调用DS18B20读取温度的函数把它转换为可读的十进制温度。同时不停扫描按键判断用户是否在设置阈值。把当前温度和阈值做比较如果当前温度高于上限或者低于下限就打开蜂鸣器报警。显示采用动态扫描或者LCD刷新确保温度实时更新。这个项目里最大的坑是“实时性撕裂”。如果你在读取DS18B20的延时里没有考虑数码管的动态扫描你会发现一个现象温度一旦刷新数码管亮度就变暗或闪烁。思路其实很简单——把显示刷新放在定时器中断里跑主循环只负责读温度和判断报警这样就实现了“干活的归干活显示的归显示”。6.2 倒车雷达用超声波传感器测距这也是一个特别经典的“避障”项目。硬件核心是HC-SR04超声波传感器它发送一束超声波碰到障碍物反射回来传感器记录下从发出到接收的时间。距离速度*时间/2。声音在空气中的速度大约是340m/s所以只要测到时间差就能算出距离。HC-SR04的使用方式网上资料都烂大街了但我发现很多新手容易忽略一个关键问题精度和实时性的权衡。超声波的检测距离有限有效范围约2cm-400cm代码里的循环等待如果太短会漏掉远距离的回波信号如果太长又会导致测距一次耗时太长数码管或屏幕刷新变卡。实际测试下来设置一个30ms的等待上限是比较靠谱的折中方案超过这个时间没有回波就认为前方无障碍物。倒车雷达的报警策略也有讲究我最常用的分档是距离大于1米绿色或蜂鸣器不响距离介于30cm到1米每秒响一声距离小于30cm急促滴滴声。这个分档逻辑移植到智能小车上就是避障策略的雏形。6.3 智能小车所有基础模块的终极阅兵“51单片机智能小车”这个关键词我觉得是所有51入门项目里含金量最高的。它是一个把前面所有模块全用上的综合工程电机驱动、PWM调速、循迹传感器、红外避障、蓝牙通信。这一套做下来你对整个51体系才算真正融会贯通。先说电机驱动。小车常用的驱动芯片是L298N它的作用是“把小电流的控制信号放大成大电流来驱动电机”。这个算是个大功率外围芯片需要9V-12V的外部电源独立供电。很多人第一次搞小车的时候会犯一个错直接把电机接在单片机的5V引脚上结果电机一转单片机就复位重启了——因为大电流拉垮了电源电压。正确的接法是电机电源独立单片机电源和电机电源共地控制信号接单片机IO口。再说电机调速。用的是PWM脉冲宽度调制技术简单说就是让电机快速开关通过改变开和关的比例占空比来控制有效电压的高低从而实现转速调节。51单片机没有硬件PWM模块需要用软件模拟——就是让一个IO口在定时器中断里按比例翻转高低电平。占空比越大电机转得越快。循迹则是利用红外对管来判断黑线位置。当传感器在白地上时红外光反射强烈输出低电平当传感器在黑线上时红外光被吸收输出高电平。左右两个传感器一比较就知道小车是偏左还是偏右然后控制左右轮差速转弯。这套算法可以说是PID控制算法的简化版。我的建议是智能小车不要一上来就做全功能。先做“四轮跑起来”再做“沿单条黑线循迹”再加“超声波避障”最后加“蓝牙遥控”。每一个阶段的功能验证通过后再加新功能。这是一个串行化调试的思维模式急不得。我见过太多人一上来就想实现所有功能结果代码逻辑一团乱麻最后哪里都调不通。6.4 更远一步电子秤与智能窗帘中隐藏的共性最后再聊两个热搜词“51单片机电子秤”和“基于51单片机的智能窗帘控制系统设计”。这俩看似八竿子打不着但它们的技术栈高度一致都涉及一个你还没接触过的概念模拟量采集。电子秤用到的HX711压力传感器芯片输出的是24位的数字信号它本身不涉及模拟量到数字量的转换芯片因为传感器信号已经被HX711内部的24位ADC精细量化。而智能窗帘的光敏电阻或雨滴传感器则往往直接使用51内置的ADC接口或外加PCF8591的ADC芯片来读取模拟量。这个阶段的核心认知是51单片机的IO口只能识别“高”或“低”两种数字状态。现实世界中温度、压力、光照、声音都是连续的模拟量你需要通过ADC芯片把它们转成数字量才能被单片机识别。搞清楚了这个“模拟世界→数字世界”的转换逻辑再去看电子秤和智能窗帘的项目你会发现它们都是在干同一件事读某个传感器的模拟量做阈值或公式计算控制某个执行机构蜂鸣器报警、电机拉窗帘。所以这类项目不用每个都从头啃一遍你只要做过其中一个其余的都是“换个传感器、换套计算公式”的换皮操作。7. 新手绕不开的坑我的故障排查顺序学习单片机的过程说穿了就是不断调试纠错的过程。根据我带新人的经验程序跑不起来的故障多半集中在以下几类而且排查顺序几乎可以固定下来故障现象优先排查具体操作烧录不进去串口与驱动检查CH340驱动、串口号、USB线是否数据线、STC-ISP是否选对型号程序运行没反应晶振、复位电路晶振两脚对地接20-30pF电容复位电路是否正常上拉电平异常/发热电源短路万用表测5V和GND之间电阻排查PCB铜箔、杜邦线短接显示屏花屏/白屏时序与供电检查初始化延时、对比度电位器、背光供电传感器读数诡异时序与噪声检查信号线长度、上拉电阻、延时是否足够精确执行机构不动作驱动能力确认是否经过驱动芯片供电是否独立共地是否接好程序逻辑“乱跑”全局变量冲突检查中断里调用延时函数、循环里等待标志位死等这里有一条新手最容易犯的高危禁忌中断服务函数里绝对不能调用delay延时函数。因为中断打断的是主程序延时函数会占用大量中断时间导致主程序或者其他中断响应不过来轻则功能错乱重则程序看起来像卡死。如果发现程序在添加中断后就行为诡异第一反应不是查代码逻辑而是查中断函数里有没有延时、有没有过长的循环体。另一个价值连城的排查习惯是硬件查一处动一处。很多人改代码和查硬件是同时进行的一会儿改程序一会儿拔线最后代码改得面目全非硬件也换了好几根线出了问题根本不知道是谁干的。正确的做法是每次只改动一个变量改完就跑一次测试记录结果再动下一个。这个习惯无论是入门还是以后做复杂的嵌入式开发都能让你保存大量无谓的时间。接触51单片机也快十年了从最早跟着视频教程点亮第一颗LED到后来拿它参加智能车竞赛、帮别人做课设系统这颗小小的芯片几乎贯穿了我的技术学习和工作经历。如果你现在还在犹豫要不要从51学起我给你的建议很干脆不要犹豫先买一块最便宜的开发板跟着上述顺序把点灯、定时器、串口这三个门槛跨过去。当你亲手做出一台能循迹避障的小车看着它自己稳稳地跑完一圈黑线的时候那种成就感真的会让人上瘾。到那时候你再去学STM32、学ARM Linux都会发现曾经在51上扎下的底子成了你走得比别人快的最坚实的那块垫脚石。
返回列表