ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Proteus仿真LED点阵公交路牌:74HC595与ULN2803驱动设计

Proteus仿真LED点阵公交路牌:74HC595与ULN2803驱动设计 简介这是一份基于Proteus仿真的LED点阵屏滚动显示工程针对公交车信息显示场景面向单片机初学者与电子设计爱好者帮助掌握16×16点阵的驱动原理和动态扫描逻辑。资源共23个文件压缩包约82KB包含1616.C源码、16×16点阵_2.DSN仿真电路、Keil工程文件UV2、OBJ、HEX、STARTUP启动代码以及备份和中间产物可完整还原编译、仿真与调试流程。已有217人学习下载。文件中的读我.txt和电路图有助于理解单片机与点阵屏的引脚连接代码涵盖字符取模、行扫描、位移算法与延时控制可在Proteus中直接观察滚动效果并灵活调整速度。适合作为嵌入式入门、单片机课程设计或公交点阵屏项目的参考范例在动手前低成本验证设计思路。1. LED 点阵仿真用 Proteus 跑公交路牌验证的其实是时序公交车的路牌屏本质就是 16×16 的 LED 点阵拼成文字屏靠行扫描和视觉暂留把字稳住。在 Proteus 里把它仿真出来的价值不是交一张看着像样的原理图而是把扫描时序、滚动速度和驱动芯片选型在烧录之前全部验证掉。标题里的 PROTUES 是 Proteus 的常见手误led.zip 如果是你手里的工程文件按本文重搭一遍往往比慢慢核对别人的连线更快。文章面向三类人单片机初学者想把点阵驱动跑通工程师要预研屏驱方案以及在 Proteus 里做课程设计和样机验证的人。下文按 51 单片机 74HC595 ULN2803 的经典方案展开先把原理说透再从零搭出 16×16 屏最后调滚动参数。2. 点阵屏扫描原理与驱动选型16×16 的 32 根控制线是怎么定的2.1 8×8 模块的电气结构共阳和共阴决定行列驱动形态单块 8×8 点阵内部是 64 只 LED行线和列线分别引出总共 16 个引脚。共阳模块把一行 8 只 LED 的阳极并在一起形成行线列线是阴极点亮条件是行线为高、对应列线为低共阴模块则相反。公交流水牌这类产品几乎都选共阳因为行线要输出整行电流用 PNP 管或 PMOS 从电源侧选通比低端灌电流更容易做宽电流余量。Proteus 里对应 MATRIX-8X8-RED 这类点阵模型。共阴模块在仿真里也能跑但数据逻辑完全相反接线前务必双击器件确认 common 脚定义否则整屏反色还以为是电路错。16×16 屏就是把四块 8×8 拼成 2×2上排两块的对应行线合并下排同理左列两块的对应列线合并。合并结果是 16 行、16 列共 32 个控制端点。Proteus 里四块模块手工拉线会非常乱建议用总线把行线、列线分别汇成 Bus配合网络标签 R0R15、C0C15 命名后续改线和仿真观察都省事。2.2 行扫描与视觉暂留刷新率下限由行驻留时间决定LED 点阵任意时刻只点亮一行其他 15 行全灭16 行轮流扫完后靠视觉暂留叠成完整画面。一轮扫描用时 T 16 × t_row就是刷新周期。无闪烁底线是 60Hz即 T ≤ 16.7ms所以单行驻留 t_row 必须小于 1ms。工程上常用 200μs1ms对应刷新率 312Hz62.5Hz。这个公式后面调参直接套不要凭感觉改 delay。还要注意占空比每行实际点亮时间只有 1/16所以平均亮度天然偏低仿真里看着偏暗是正常的不是电路故障。2.3 驱动芯片选型两片 74HC595 级联送列74HC154 译码选行列数据需要 16 位并行输出最省 IO 的做法是两片 74HC595 级联。数据从第一片 DS 串行移入16 个移位时钟后推进到第二片再用 ST_CP 上升沿同步锁存到输出脚整屏只占 3 根 IOSH_CP、ST_CP、DS。驱动电流由外部承担595 输出接 ULN2803 达林顿阵列它是反相低电平输出恰好匹配共阳模块列低点亮的逻辑——595 输出 1ULN2803 对应脚拉低LED 导通。行选用一个 74HC154 四线十六线译码器P2 低四位输入16 个译码输出各接一只 8550 的基极。选中行输出低电平把 8550 导通将整行拉到 VCC。这套拓扑没有时序竞争Proteus 仿真最稳值得作为默认方案。3. 在 Proteus 里搭 16×16 公交车点阵屏元件清单到扫描代码3.1 元件清单与 Proteus 库名对照Proteus 8 的元件库检索名和口头叫法有差异按这张表取件型号后缀不强求库里有同名器件就能用。元件Proteus 库内检索名数量作用AT89C51AT89C511主控配 12MHz 晶振74HC59574HC5952列数据级联每片 8 位74HC15474HC15414-16 行译码ULN2803ULN2803A2列驱动每片 8 路8550QPNP 或 855016行选开关PNP8×8 点阵MATRIX-8X8-RED4拼 16×16电阻 220ΩRES16行线限流电阻 1kΩRES168550 基极限流注意MATRIX-8X8-RED 一般按共阳处理但不同版本模型定义有出入放置后双击确认 row 引脚接 VCC 还是 GND。极性判断错整屏数据都要取反浪费的时间远大于检查的 10 秒。3.2 级联与行列接线先连 595 再连 154最后挂点阵接线按信号流走避免漏线。两片 595 的 SH_CP、ST_CP 各自并接分别来自 P3.0、P3.1第一片 DS 接 P3.2第一片的 Q7 接第二片的 DS完成级联。两片 595 的 OE 接地使能输出MR 接 VCC 取消复位这两个控制脚最容易被忽略漏接的典型症状是输出全高或全低。每片 595 的 QAQH 接一片 ULN2803 的输入 18ULN2803 的 COM 接地输出接列线 C0C15。行选侧74HC154 的 A、B、C、D 输入端接 P2.0P2.3两个使能端按数据手册接有效电平通常 G1 接低、G2 接低或接译码使能信号。Y0Y15 各经 1kΩ 接一只 8550 的基极8550 发射极接 VCC集电极经 220Ω 接到行线 R0R15。这里最容易犯的错是把 154 输出直接接行线——154 输出低电平有效驱动不了共阳行线必须经 PNP 反相做电平转移。四块 8×8 摆放成 2×2 后用网络标签完成行列合并。全部命名后再运行比对着原理图数导线可靠得多。首次仿真建议先只放一块 8×8 最小系统跑通确认 64 个点能逐行点亮再扩到四块点阵数量翻倍后 Proteus 渲染开销明显上升直接全屏排错成本高。3.3 扫描驱动代码定时器中断里选行送列扫描放进定时器中断主循环只负责算帧数据刷新率才恒定不会被滚动逻辑的耗时干扰。12MHz 晶振下8051 一个机器周期 1μs定时器 0 用方式 1装载 0xFC18 得到 1ms 中断#include REGX51.H sbit SH_CP P3^0; /* 74HC595 移位时钟 */ sbit ST_CP P3^1; /* 74HC595 锁存时钟 */ sbit DS P3^2; /* 74HC595 串行数据 */ unsigned char scan_buf[32]; /* 当前帧点阵16 行 × 16 列 */ void hc595_word(unsigned int dat) { unsigned char i; for (i 0; i 16; i) { DS (dat 0x8000) ? 1 : 0; /* 高位先出 */ SH_CP 0; SH_CP 1; /* 上升沿移入 1 位 */ dat 1; } ST_CP 0; ST_CP 1; /* 上升沿锁存到输出 */ } void timer0_isr(void) interrupt 1 /* 1ms 周期行扫描 */ { static unsigned char row 0; TH0 0xFC; TL0 0x18; /* 12MHz 下重装 1ms */ P2 (P2 0xF0) | row; /* 低 4 位送入行译码 */ hc595_word(scan_buf[row*2] 8 | scan_buf[row*21]); if (row 16) row 0; /* 扫完 16 行回到第 0 行 */ } void main(void) { unsigned char i; for (i 0; i 32; i) scan_buf[i] 0xFF; /* 全亮自检 */ TMOD 0x01; TH0 0xFC; TL0 0x18; ET0 1; EA 1; TR0 1; while (1); }代码逻辑中断每 1ms 选通一行把 scan_buf 里该行 16 位列数据经两片 595 送出。595 数据高位在前对应 C15C0如果屏幕左右镜像把 8 |的拼接顺序互换即可不必动接线。自检阶段填 0xFF 让 16 行全亮能亮就说明行选、列驱、扫描通路完整再换成真实字模。提示单缓冲下主循环写 scan_buf 与中断读 scan_buf 存在竞争。教学代码影响不大严谨做法是双缓冲——中断只读当前帧主循环在帧标志置位后更新下一帧。这个点在你之后做灰度或多级亮度时会是必踩的坑。3.4 仿真速度设置与最小点亮验证Proteus 的仿真速度在 System → Set Animation Options 里调整选 Real Time 模式让闪烁表现接近实物只关心逻辑结果时可以关闭动画细节释放 CPU。AT89C51 的晶振在元件属性里设为 12MHz。上点阵之前先放一个单 LED 加限流电阻加 51 的最小点亮工程确认 Proteus 仿真环境本身正常避免把环境问题误判成驱动代码问题。全亮自检通过后再写入一块 16×16 的静态汉字确认字形无镜像、无缺行最后才上滚动逻辑。4. 点阵屏滚动显示的缓冲设计、速度换算与取模对齐4.1 滚动窗口位偏移取列不要整字节跳滚动本质是让可见窗口在一段更长的点阵数据上逐列左移。整条线路文字按 16 行 × N 列存成行优先数组每个元素保存一行的 8 位数据。可见窗口宽 16 列窗口起始列 cur_col 每次变化时重取 16 列。难点在于 cur_col 不一定是 8 的倍数取窗口必须跨字节移位#define TEXT_COLS 96 /* 文字总宽 96 列约 6 个字 */ unsigned char code line_buf[16][12]; /* 16 行 × 12 字节 96 位 */ unsigned char scan_buf[32]; /* 可见窗口 16 列 */ void scroll_window(unsigned char col) /* col 为窗口起始列 */ { unsigned char row, idx, off; for (row 0; row 16; row) { idx col 3; /* 起始列所在字节 */ off col 7; /* 字节内位偏移 */ scan_buf[row*2] (line_buf[row][idx] off) | (line_buf[row][idx1] (8 - off)); scan_buf[row*21] (line_buf[row][idx1] off) | (line_buf[row][idx2] (8 - off)); } }这个函数把第 col 列起的 16 列窗口拼进 scan_buf。off 为 0 时右段 8得到 0结果由左段单独组成逻辑自洽。注意 line_buf 每行要留两个字节余量否则窗口接近右边界时idx2会越界读。如果只做整字切换按 16 列一跳的翻页效果可以完全跳过位偏移逻辑直接按字索引拷贝但公交路牌那种平滑左移必须走这个跨字节窗口。4.2 滚动速度按帧数分频不按 delay 调主循环判断帧标志累到设定帧数才让 cur_col 加 1。刷新率 62.5Hz即每 16ms 一帧速度换算如下移动 1 列所需帧数等效列/秒约合汉字/秒适用场景162.53.9抢眼的跑马灯415.61.0公交路牌常用87.80.5长句慢速滚动实际公交车路牌不会整屏高速滚而是K1路 开往火车站这类信息每 0.51 秒滚过一个汉字宽度所以默认按每 4 帧推进 1 列。分频控制放在主循环里#define MOVE_EVERY_FRAMES 4 unsigned char frame_cnt 0, cur_col 0; void main(void) { /* 定时器初始化同前 */ while (1) { if (frame_flag) { frame_flag 0; if (frame_cnt MOVE_EVERY_FRAMES) { frame_cnt 0; scroll_window(cur_col); if (cur_col TEXT_COLS - 15) cur_col 0; } } } }窗口起始列最大可到 TEXT_COLS - 16因此代码在自增后判断是否到达 TEXT_COLS - 15到达即回 0 形成循环。注意 scan_buf 只在真正移动的那一帧更新中间 3 帧重复显示当前画面——移动速度和显示刷新率是两个概念前者由这里的帧间隔决定后者始终是 62.5Hz。用 delay 调滚动速度的问题在于滚动耗时和扫描中断互相叠加刷新率会抖动等效速度也不可计算。4.3 汉字取模参数和 line_buf 的字节序对齐字模工具按 16×16、阴码、逐行式、顺向取模。阴码表示 1 为点亮与 scan_buf 的驱动逻辑一致逐行式保证数据按行存放对应line_buf[row]的访问方式顺向指每字节高位在前MSB 为最左列与 595 高位先出的移位方向吻合。取出的 32 字节按行填进 line_buf每行前 8 位放第 0 字节、后 8 位放第 1 字节正好对齐 scroll_window 里 idx 和 idx1 的拼接。若取模设为逆向文字会镜像滚动方向也会反过来这时优先改取模参数不要改代码。4.4 滚动故障对照总线驱动问题优先查时序现象原因处理整行常亮或常灭154 译码输入或 8550 基极接线虚接查 P2 低四位到 154 连线8550 的 E、C 是否接反列数据左右乱飞两片 595 级联方向接反调换第一片 Q7 与第二片 DS 的接法滚动有拖影行驻留偏长或新旧帧数据混用驻留压到 1ms 内滚动更新放主循环文字镜像取模顺向/逆向与硬件相反改取模设置或交换 595 高低字节Proteus 明显卡顿四块点阵全动画仿真先用单屏验证逻辑再放慢动画速度这些现象里最容易误判的是前两类它们本质是总线驱动问题即 595 的移位锁存时序或行选译码时序不对而不是字模数据错。排查固定顺序先查 595 的 OE 和 MR 两个控制脚再量 ST_CP 是否有稳定周期脉冲最后才怀疑数据内容。时序对了乱码和拖影通常同时消失。5. 用虚拟示波器核对扫描波形再把刷新率调到不闪5.1 在 Proteus 里量 ST_CP 与行选信号Proteus 左侧工具栏进入 Virtual Instruments Mode把示波器 OSCILLOSCOPE 拖到原理图探针分别挂到 ST_CP 和 154 的 Y0 输出。运行后应看到 ST_CP 每 1ms 一个脉冲、16 个一组Y0 上则是 16ms 周期的低电平脉冲。脉冲间距不均说明定时器重装值不准或中断里耗时过大Y0 高电平宽度明显大于 1ms说明 hc595_word 拖慢了中断行驻留实际已经大于设定值。这一步花两分钟能省掉后面所有为什么闪烁的猜测。5.2 刷新率和中断耗时的上限核算软件移位在 12MHz 8051 上每位移约 10 个机器周期16 位发两片共 32 次移位加上位判断和锁存中断服务整体约 320400μs。这意味着行驻留设 200μs 不现实中断还没退出下一轮就开始了。可用下限约 500μs对应 125Hz 刷新视觉完全够用默认 1ms 对应 62.5Hz 最稳妥。想再压低驻留只能换硬件 SPI 或 MAX7219 这类专用驱动芯片靠定时器软移位到不了 100μs 量级。5.3 从 16×16 扩到 16×64 长条屏的改法长条屏 64 列行线仍是 16 根列线扩到 64 根595 从 2 片变 8 片级联scan_buf 从 32 字节变 128 字节hc595_word 改成循环送 8 个字节。滚动窗口宽 64 列cur_col 上界改为 TEXT_COLS - 63。硬件上每列约 20mA64 列全亮时单行电流 1.28AProteus 不校验电流所以照跑实际制板必须按行电流重选 8550 封装和 220Ω 限流电阻功率这是仿真与实物差异最大的地方。扩展时保持行选不变、列级联加长的结构扫描代码只需改窗口宽度和送列循环其余时序逻辑不动。本文还有配套的精品资源点击获取
返回列表