news 2026/9/6 16:14:52

基于8086的交通灯控制系统设计详解与调试实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于8086的交通灯控制系统设计详解与调试实践

简介:这是一份基于8086微处理器的交通灯控制系统课程设计说明书,面向微机原理与接口技术课程设计者及嵌入式系统入门学习者,系统展示了从任务分析、方案设计到软硬件联调的完整工程项目流程。资源为单个PDF文档,大小约944KB,结构清晰,依次包含课程设计任务书、摘要、系统总体方案、主要芯片选型介绍、硬件电路设计、控制程序流程图、汇编源程序以及调试与设计心得。已有139人学习浏览。文档以8086最小模式为核心,结合8255A并行接口与8253定时器/计数器,详细阐述了十字路口四个方向红、绿、黄灯的定时交替控制,并实现了LED数码管倒计时和紧急情况应急处理;文末附有可直接参考的完整控制程序,为读者理解汇编编程、I/O接口技术及硬件电路设计提供了可落地的范例。无论是用于课程设计撰写报告,还是自学8086汇编与微机接口知识,都能从中获得实用的设计思路和排错经验。

遇到8086别慌,这套交通灯控制系统设计思路可以直接抄

我是大学时被8086课程设计折磨过的人,当年为了搞懂交通灯控制系统,翻遍了图书馆的微机原理参考书,最后自己一步步把电路搭出来、程序调通的时候,那种感觉确实很有成就感。最近刚好整理资料,翻到之前这份《基于8086的交通灯控制系统设计》的PDF,重新梳理了一遍,发现里面很多细节当年没想明白,现在回头看才理解为什么老师总要拿交通灯当课程设计题目——麻雀虽小五脏俱全,8086的并行接口、定时器、中断、存储扩展全都能串起来练一遍。

这篇就结合实际操作经验,把整套设计从方案选型、硬件电路到软件流程完整过一遍,顺便把当年踩过的坑和排查方法一并整理出来。不管你是正在做课程设计的学生,还是想复习微机接口技术的开发者,这套思路都值得参考。

1. 项目整体思路与方案选型

1.1 为什么用8086做交通灯控制

很多人会问,现在随便一片单片机都能做交通灯控制,为什么还要守着8086这种老古董?这个问题当年我也问过自己。做课程设计不是选最先进的方案,而是选最能练到核心知识点的方案。8086作为经典的16位微处理器,它的地址数据总线时序、存储器接口、I/O接口扩展方式,是理解现代处理器工作方式的基础底座。

用8086做交通灯控制,核心不在于“能不能亮灯”,而在于让你把三样东西练熟:第一,搞清楚怎么用地址译码电路给外设分配端口地址;第二,弄清楚可编程定时器的初始化流程和工作方式配置;第三,弄明白并行接口芯片怎么和CPU衔接,怎么读状态、写控制字。这三块正好对应微机原理课程里最核心的接口技术内容。

1.2 系统构成的经典组合

这套系统的硬件组成围绕一个核心问题展开:8086怎么感知时间、怎么输出控制信号。我用的方案是8086CPU配合8253可编程定时器和8255可编程并行接口,再加上地址锁存器、译码器、LED指示灯和数码管显示电路。

为什么必须用定时器芯片?因为交通灯的红绿灯切换依赖精确的时间基准,不同方向的红灯、绿灯、黄灯持续时间各不相同,还要求循环往复执行。用软件延时当然也能实现定时,但CPU会被延时循环完全占用,没法同时处理按键输入、状态刷新这些任务。8253定时器芯片的好处是初始化之后就能独立计时,到时间自动向CPU发中断请求,CPU只需要在中断服务程序里管理状态切换就行——这就把CPU解放出来了。

8255在这里承担的角色是输出端口扩展。8086的I/O端口是16位的,但直接用数据总线去点亮LED也不合适,一方面总线驱动能力有限,另一方面如果显示和灯控状态要独立控制,就得靠8255把端口分开。我用8255的A口控制数码管的段码,B口控制方向指示灯的亮灭,C口做位选和按键输入,每个端口的功能边界很清晰,程序里维护起来也顺手。

1.3 方案选型的几个关键考量

选型阶段有一个容易被忽略但很关键的决策点:系统工作频率和分频系数的确定。8086的最低工作频率受时钟电路限制,但8253定时器的计数时钟频率可以根据需要单独设定。我直接把8253的CLK0接在系统时钟分频后的信号上,通过初始化时装入不同的计数初值,得到需要的定时周期。

另一个考量是I/O端口地址分配。8086的I/O地址空间有64KB,但实际系统根本用不了这么多。我用74LS138译码器把I/O地址空间分成几个区块,8253和8255各自占一个区块,避免了地址冲突。地址线A5~A7接译码器选择端,A0~A4用于芯片内部寄存器选择,这样每个内部寄存器都有了唯一的端口地址。

选型时还需要考虑驱动能力的问题。8086数据总线的驱动电流有限,直接挂多个LED或者数码管会导致电平被拉低、亮度不足。所以我在8255的输出端口和LED显示电路之间加了74LS245总线驱动芯片,实验中发现加与不加差别非常大——不加驱动芯片的时候,LED亮度明显偏暗,数码管的笔画还会出现缺笔的问题。

2. 硬件电路设计详解

2.1 地址译码与端口分配

电路设计的第一步是确定地址空间划分。这里以我的实际电路为例,地址总线A5、A6、A7接到74LS138的C、B、A端,G1接高电平,G2A和G2B接M/IO信号,确保只有在访问I/O空间时译码器才工作。74LS138的输出Y0~Y7就对应了8个不同的I/O区块,每块包含32个端口地址。

实际端口的分配如下表所示,这个表当年是我画PCB之前反复核对过的,做课程设计的朋友可以直接照抄:

芯片片选信号端口地址范围用途说明
8253Y000H~07H计数器0、1、2和8253控制寄存器
8255Y108H~0FHA口、B口、C口和8255控制寄存器
备用Y2~Y710H~FFH预留扩展空间

8253内部有4个端口:计数器0、计数器1、计数器2和控制寄存器。8255内部也有4个端口:A口、B口、C口和控制寄存器。A0、A1两根地址线接芯片的A0和A1引脚,用来区分内部寄存器,端口地址就在基础地址上偏移。

这里有个容易踩的坑:8086的I/O读写时序中,地址信号先于读写信号有效,但译码器的输出和M/IO信号同步到达芯片的片选端时,如果芯片的读写时序参数不匹配,经常出现访问不稳定。如果实测中发现偶发读写错误,建议检查一下片选信号是否需要加RC延迟或者用74LS32等门电路做一下逻辑整形。

2.2 8253定时器的工作方式配置

8253定时器是我这套系统里最核心的器件之一。8253内部有三个独立的16位计数器,每个计数器都有六种工作方式可选。交通灯控制需要产生周期性的定时中断,所以我选择了方式3——方波发生器。

方式3的特点是:装入计数初值后,输出端自动产生连续方波,前半周期输出高电平,后半周期输出低电平。当计数初值为偶数时,高低电平各占一半;为奇数时,高电平多一个时钟周期。用方式3的好处是输出信号可以直接接到8259中断控制器的IRQ端作为中断请求信号,不需要额外电路再做脉冲整形。

定时器初值的计算是硬件设计中的关键步骤。假设8253的输入时钟频率是1MHz(1微秒一个时钟周期),需要产生1秒的定时周期,那么计数初值就是1MHz×1秒=1,000,000,这个数值超过了16位计数器65535的上限。所以直接定时1秒是不可行的,实际工程中用的是10ms定时的方式:初值取10000,每10ms产生一次方波中断,软件里设置一个计数器变量,累加100次就是1秒,累加到对应方向的红灯时间就执行状态切换。

计数器初始化必须按固定顺序操作:先向控制寄存器写入控制字(选择哪个计数器、什么工作方式、计数初值格式是二进制还是BCD),再向计数器端口写入初值的低8位和高8位。控制字的D7D6位选择计数器编号,D5D4位选择读写方式,D3D2D1位决定工作方式,D0位决定计数格式。以计数器0、方式3、先读低字节再读高字节、二进制计数为例,控制字是00110110B,也就是36H。

2.3 8255并行接口与信号输出电路

8255并行接口芯片有3个8位的I/O端口:A口、B口和C口。C口还可以分成高4位和低4位分别使用。我配置8255工作在方式0,也就是基本的输入输出模式,三个端口全部设为输出。控制字是10000000B,也就是80H——最高位1表示方式设置有效,A组和B组都工作在方式0,A口、B口、C口全部是输出。

接下来是端口功能的划分。A口驱动两个数码管的段码,B口的PA0~PA5控制南北和东西方向的红黄绿LED灯,C口低4位做数码管的位选信号。

B口和LED灯之间的驱动电路需要重点说明。8255的每个I/O引脚在输出高电平时能提供的电流很小,在输出低电平时吸收电流的能力相对更强。所以LED灯采用低电平点亮的方式——也就是常说的灌电流方式。LED的正极通过限流电阻接+5V,负极接8255的引脚,引脚输出低电平时LED点亮。限流电阻的阻值根据LED工作电流计算,LED的工作电流取10mA,导通压降约2V,限流电阻就是(5V-2V-0.3V)/10mA,约270欧姆,实际取300欧姆即可。这样既保证亮度,又不会过流损坏芯片引脚。

数码管的驱动是另一个容易疏忽的环节。市面上常见的共阴数码管如果直接用8255引脚驱动,很多时候亮度不够,特别是多位一起刷新的时候。我试过在A口输出端加ULN2803达林顿驱动芯片来驱动数码管的段码,效果立竿见影,笔画清晰没有重影。这里要注意的是ULN2803内部有续流二极管,它实际上是一个反相驱动器——输入高电平时输出低电平,所以8255输出的段码需要取反之后才能得到正确的显示效果。这个细节当时就让我在调试时多花了半天时间。

2.4 数码管动态扫描显示电路

交通灯控制系统中,数码管用来显示红绿灯的倒计时秒数。我用两个两位一体共阴数码管分别显示南北方向和东西方向的剩余时间。因为系统里只有8255的A口输出段码,C口输出位选信号,所以必须用动态扫描的方式。

动态扫描的原理是人眼视觉暂留效应:四位数字轮流点亮,每个位点亮时间为2ms左右,四个位循环一次也就8ms,刷新频率约125Hz,人眼看起来就是四个数字同时稳定显示。扫描顺序是:先选中第一位,把对应的段码输出到A口,延时2ms,然后切换到位选信号选第二位,更新段码,再延时……循环往复。

基于8086做动态扫描时,一个重要的考量是时间基准。如果扫描延时不准确,会导致显示亮度不均或者闪烁。我建议直接使用定时器中断的10ms基准,每次中断刷新一位数码管,四次中断完成一个完整扫描周期,这样扫描时序和秒计数逻辑完全同步,显示亮度均匀,也不会额外占用CPU执行延时循环。

3. 软件流程设计与核心代码实现

3.1 交通灯状态机的设计

软件设计的核心是状态机。交通灯系统不是简单的“红灯→绿灯”两步走,而是需要考虑双向车流的协调切换。十字路口的典型时序是:南北方向绿灯通行,东西方向红灯禁行;然后南北方向绿灯结束转为黄灯;黄灯结束,南北方向红灯,东西方向绿灯;再东西方向黄灯……如此循环。

我把整个运行过程划分为4个状态,每个状态对应一组灯状态和持续时间:

状态编号南北方向东西方向持续时间
S0绿灯红灯30秒
S1黄灯红灯5秒
S2红灯绿灯30秒
S3红灯黄灯5秒

状态切换的触发条件是倒计时计数到零。程序设计上不需要在每个状态的代码里写死延时,而是维护一个全局变量second_count,每秒减一,减到零就切换到下一个状态。

状态机的好处是逻辑清晰、扩展方便,如果后续要增加左转信号、行人信号,只需要增加状态和对应的灯输出映射即可。这也是为什么我建议在设计初期就把状态表用表格或者宏定义明确列出来,而不是直接散落在代码里。状态的跳转关系固定,代码维护成本会低很多。

3.2 主程序框架与中断服务程序

主程序的核心工作是初始化和后台循环。初始化部分包括:8253定时器初始化、8255并行接口初始化、中断向量表设置、初始状态显示刷新。后台循环主要做动态扫描刷新和状态值的检测。

汇编代码的框架大致如下,我用的是8086汇编语言,MASM编译器可以直接编译:

; 初始化段寄存器和栈 MOV AX, DATA_SEG MOV DS, AX MOV AX, STACK_SEG MOV SS, AX ; 初始化8255: A口B口C口全部输出 MOV DX, 0BH ; 8255控制寄存器端口 MOV AL, 80H ; 方式0,三个端口全部输出 OUT DX, AL ; 初始化8253: 计数器0方式3 MOV DX, 07H ; 8253控制寄存器端口 MOV AL, 36H ; 计数器0方式3二进制计数 OUT DX, AL MOV DX, 00H ; 计数器0端口 MOV AL, 10H ; 初值低字节,10000的十六进制是2710H OUT DX, AL MOV AL, 27H ; 初值高字节 OUT DX, AL

中断服务程序是系统的核心动作执行者。每10ms进入一次中断,中断服务程序执行以下逻辑:对10ms计数变量加1,如果累计到了100次,说明1秒过去了,秒计数减1,同时更新数码管的显示缓冲。在这个过程中还要检查秒计数是否归零,归零就执行状态切换。

INT_SERVE PROC FAR PUSH AX PUSH DX INC COUNT_10MS ; 10ms计数加1 CMP COUNT_10MS, 100 ; 是否到1秒 JNE DISPLAY_REFRESH ; 未到1秒直接刷新显示 MOV COUNT_10MS, 0 ; 重置10ms计数 DEC SECOND_COUNT ; 秒数减1 CMP SECOND_COUNT, 0 ; 判断是否归零 JNE DISPLAY_REFRESH CALL STATE_TRANSIT ; 执行状态切换 DISPLAY_REFRESH: ; 根据当前状态输出灯信号 MOV DX, 09H ; 8255 B口端口 MOV AL, CURRENT_LIGHT OUT DX, AL POP DX POP AX IRET INT_SERVE ENDP

这里有几个关键的编程细节。第一,中断服务程序里必须保护好现场,只用到的寄存器要压栈保存,用完之后恢复;第二,中断服务程序要尽量精简,不能做耗时太长的操作,所以我把数码管扫描也放到主循环里,中断只做计秒和状态更新;第三,主循环必须周期性地执行STI开中断指令,确保中断能被及时响应,如果长时间关中断,定时器中断信号会被挂起,秒计数就会丢。

3.3 中断向量表的设置方法

8086的中断向量表位于内存最低地址的1KB空间,每个中断向量占4个字节,包含中断服务程序的段地址和偏移地址。8253定时器中断通常连接到8259A中断控制器的IR0,对应的中断类型号是08H。

设置中断向量表有两种思路:一种是用DOS功能调用,在实模式下用INT 21H的25H号功能设置中断向量,这是最省事的方式;另一种是直接往内存地址0000:0020H处写入服务程序的入口地址。我用的是第一种方式,代码更简洁可靠:

PUSH DS MOV AX, SEG INT_SERVE MOV DS, AX MOV DX, OFFSET INT_SERVE MOV AH, 25H ; DOS设置中断向量功能 MOV AL, 08H ; 中断类型号 INT 21H POP DS

如果不用DOS环境(比如在纯裸机环境下调试),就需要直接操作内存。先把中断向量表的段地址0000H装入DS,偏移地址0020H装入BX,再把服务程序的偏移地址写入[ BX],最后把段地址写入[ BX+2]。两种方式都可以,关键是要确保服务程序的入口地址计算正确,否则中断触发时程序会跳到一个错误的位置,直接导致系统崩溃。

3.4 倒计时显示与灯状态的联动逻辑

倒计时显示和灯状态切换的联动是整个系统的直观效果所在。状态切换时,不仅要改变LED灯的亮灭,还要把当前状态的持续时间加载到秒计数器里,同时在数码管上显示剩余秒数。

状态切换的伪代码如下:

STATE_TRANSIT: ; 根据当前状态决定下一个状态 CMP CURRENT_STATE, 0 JE GO_STATE_1 CMP CURRENT_STATE, 1 JE GO_STATE_2 CMP CURRENT_STATE, 2 JE GO_STATE_3 ; 状态3切换到状态0 MOV SECOND_COUNT, 30 MOV CURRENT_LIGHT, 南北绿东西红 MOV CURRENT_STATE, 0 RET

灯状态和数码管显示需要同步更新。当南北方向为绿灯时,南北方向的数码管显示当前剩余的绿灯秒数,东西方向显示对应的红灯秒数。我的做法是在显示缓冲区同时存储两组数据,一组是南北方向的剩余秒数,一组是东西方向的剩余秒数,动态扫描时按位提取并转换成7段码,然后输出到A口。

7段码转换查表法最简单直接。定义一个常量表,下标为0~9,对应存储这10个数字的段码。段码的编码规则取决于数码管是共阴还是共阳,以及段码线和8255引脚的连接顺序。我在代码里维护了两套表——一套用于正常驱动,一套用于ULN2803反相之后的显示,调试时可以通过选择正确的表来适配实际电路。

4. 调试方法与问题排查实录

4.1 硬件调试的排查顺序

这套系统从我画完电路到最终稳定运行,前后花了差不多一周时间,其中大部分时间花在了排查硬件问题上。调试顺序非常关键,我总结了一套流程:先电源,再时钟,然后总线信号,最后外设芯片。

电源是最基础的检查项。上电后用万用表测量各芯片的VCC和GND引脚,确认电压在4.75V到5.25V范围内。然后检查晶振电路,用示波器观察8086的CLK引脚是否有稳定的时钟信号输出。如果示波器显示无波形,大概率是晶振没起振,此时要检查晶振旁边的两个负载电容是否焊反或者虚焊。紧接着检查地址锁存器74LS373的输出,确认地址信号在被锁存之后没有毛刺。

总线信号正常之后,再逐块检查外设芯片。8255的检测方法是:往A口输出一个已知数据,比如55H或者AAH,用万用表测量对应引脚的电平,如果电平不匹配,问题可能出在地址译码或者8255本身损坏。8253的检测方法类似,初始化后测量OUT0引脚的波形,如果示波器能看到规则方波,说明定时器工作正常。

4.2 程序调试的常见坑点

程序层面的坑和硬件层面的坑往往互相纠缠。我遇到的最典型的问题是定时器初值算对了,但LED灯的反应速度不对,后来发现是中断服务程序的现场保护寄存器不够完整,导致某些寄存器被服务程序修改后主程序里用到了脏数据,整个逻辑就乱了。

中断现场保护这个坑几乎所有人都会踩一遍。记住一个原则:中断服务程序里用到的每一个寄存器都要压栈保存,用完再恢复。如果中断服务程序调用了子程序,子程序用到的寄存器也要统一管理。否则就会出现“明明逻辑没问题,但每次跑一段时间就异常”的诡异问题。

另一个很常见的坑是端口地址的错误。8255和8253的端口地址由译码电路决定,但8086的I/O空间访问有一个特殊性:当A0为0时访问偶数地址,A0为1时访问奇数地址,而8086的数据线D0~D7只在BHE有效时与高8位数据总线相连。很多人在计算端口地址时忽略了这一点,导致实际访问的寄存器和预期不一致。解决办法是设计地址译码时固定用A0来区分16位端口的高低位,外设芯片的A0、A1接8086的A0、A1,但要注意只使用低8位数据线进行I/O读写。

动态扫描的显示效果问题也值得单独说。如果数码管出现明显的亮度不均或者闪烁,优先检查扫描周期是否太长。扫描周期超过20ms就会出现肉眼可感知的闪烁。我用10ms定时中断刷新一次,四个位十六进制的扫描周期正好是40ms,如果按这个时节拍来,实际上刷新频率已经低到25Hz了,对应的是闪烁感。所以我最后把刷新逻辑改成:每次10ms中断刷新一位,四个位分四轮,实际每位点亮的间隔是40ms,但因为每位点亮时长占整个周期的四分之一,整体感知上还是有闪烁的。如果需要彻底消除闪烁,要加密为每个位扫描2ms左右,也就是用主循环里的精确延时或者第二个定时器来实现。后来我的做法是:秒计数中断仍然是10ms一次,但显示扫描放在主循环里用软件延时配合循环变量轮询,每个位保持大约2ms的持续时间,整体流畅很多。

4.3 常见问题速查表

把调试过程和后来帮同学排查问题的经验整理成一张速查表,供各位参照:

现象可能原因排查方法
上电后数码管全灭8255初始化失败或段码表错误用万用表测8255的A口输出引脚电平,逐个端口输出55H测试
数码管显示乱码段码表取反逻辑错误或ULN2803接线不对单独测试一位数码管,逐个段码对比显示内容
灯亮但不切换中断没有正确触发或状态切换条件不满足在状态切换处加断点或临时翻转一个测试LED
灯切换太快定时器初值配置错误或时钟频率不对用示波器测量8253 OUT0引脚的实际方波周期
倒计时显示不动秒计数逻辑错误或数码管位选信号不切换检查C口位选信号的时序波形
偶发死机中断现场保护不完整或堆栈溢出检查中断服务程序压栈和出栈是否配对,检查堆栈段大小

4.4 一个值得复现的调试案例

最后分享一个印象深刻的排查过程,这能帮你在遇到类似问题时少走弯路。当时系统能正常运行,但每次运行到30秒左右就出现数码管乱跳的现象,LED灯状态倒是稳定的。检查了所有硬件信号都正常,最后用软件单步跟踪发现问题是状态切换时我直接修改了数码管的位选端口C口的值,但C口同时也被主循环的动态扫描逻辑使用,两个地方互相干扰,导致显示数据错乱。

这个问题在设计阶段完全可以避免。把数码管的位选信号改用独立的锁存器控制,或者把C口的功能完全分配给数码管扫描,不再复用给其他信号。我最后的做法是:C口低4位专用于位选,A口专用于段码,LED灯控制全部走B口。这样每个端口职责单一,软件上就不需要处理同时访问一个端口的冲突了。

如果把这次设计重新做一遍,我会把状态机部分再抽象一层,让交通灯的状态表成为纯数据配置,这样调整红绿灯时长只需要改数据表而不需要改动控制逻辑。这个思路无论对课程设计还是实际项目,都有长远的借鉴价值。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 16:14:46

食物相克是真是假?一份理性版饮食搭配清单

简介:这份「食物相克对照表完整版.doc」是一份面向日常饮食健康与营养搭配研究者的参考文档,系统整理了菠菜与乳酪、羊肉与醋、胡萝卜与白萝卜、牛奶与韭菜等数十种常见食材搭配禁忌,并逐一说明同食可能引发的消化不良、营养流失、腹胀便秘等…

作者头像 李华
网站建设 2026/9/6 16:11:38

麦弗逊悬架设计:静挠度与动挠度计算及SolidWorks建模

简介:面向车辆工程专业本科生、研究生及新能源汽车底盘工程师的悬架设计学习资料,以大众ID.3为研究对象,系统梳理前麦弗逊式独立悬架的参数计算与优化方法。内容涵盖静挠度、动挠度、悬架刚度等核心参数分析,以及导向机构、螺旋弹…

作者头像 李华
网站建设 2026/9/6 16:11:35

Cua 计算机使用代理指南:把 AI 关进沙箱桌面里快速上手

Cua 计算机使用代理指南:把 AI 关进沙箱桌面里快速上手 【免费下载链接】cua Scale computer-use 2.0 with open-source drivers, cross-OS fleets, and benchmarks for training, evaluation, and data generation. 项目地址: https://gitcode.com/GitHub_Trendi…

作者头像 李华
网站建设 2026/9/6 16:11:31

三轴转台内环控制系统实战:从建模到仿真全解析

简介:《三轴转台内环控制系统——基于哈工大自动控制原理》PDF文档,是面向自动控制原理课程大作业设计的完整技术报告,适合哈工大及相关高校学生参考三轴转台内环控制系统的建模、校正与验证方法。内容围绕最大角速度400/s、动态跟踪误差不超…

作者头像 李华
网站建设 2026/9/6 16:11:23

基于PLC的自动送料装车控制系统设计:从工艺到上位监控完整指南

简介:一份基于PLC的自动送料装车控制系统设计说明文档,面向机电一体化、工业自动化等专业学生及现场工程师,围绕物料输送与装车场景,系统阐述以PLC为核心的控制方案,并结合组态王软件实现监控仿真的完整思路。资源为1个…

作者头像 李华
网站建设 2026/9/6 16:11:17

Umi-OCR:3 分钟跑通的离线 OCR,把截图里的文字变出来

Umi-OCR:3 分钟跑通的离线 OCR,把截图里的文字变出来 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内…

作者头像 李华