当前位置: 首页 > web >正文

H_Prj06 8088单板机的串口

1.串口控芯片PC16550

2.电平转换,使用CH340G  232转换成USB

3.验证程序

; 串口控制LED程序 (18.432MHz时钟)
; 硬件配置:
;   PC16550 基地址: 100H 
;   8259 PIC 端口: 400H(命令), 402H(数据)
;   LED端口: 800H (0xFF亮, 0x00灭)
;   16550中断引脚连接8259的IR1 (中断类型码21H)ORG 100H            ; COM文件起始地址
JMP INIT            ; 跳转到初始化程序; 数据段
RECV_BYTE DB 0      ; 接收数据字节
LED_STATE DB 00H   ; LED初始状态(全亮)
INTR_MASK DB 0ffh     ; 保存原始中断屏蔽字; 16550寄存器偏移地址
UART_BASE EQU 100H
RBR_THR EQU UART_BASE + 0  ; 接收/发送寄存器
IER     EQU UART_BASE + 1  ; 中断使能寄存器
IIR_FCR EQU UART_BASE + 2  ; 中断标识/FIFO控制
LCR     EQU UART_BASE + 3  ; 线路控制寄存器
MCR     EQU UART_BASE + 4  ; 调制解调器控制寄存器
LSR     EQU UART_BASE + 5  ; 线路状态寄存器
DLL     EQU UART_BASE + 0  ; 除数锁存低字节 (DLAB=1)
DLM     EQU UART_BASE + 1  ; 除数锁存高字节 (DLAB=1); 8259端口
PIC_CMD EQU 400H
PIC_DATA EQU 402H; 中断服务程序(IR1)
UART_ISR PROC FARPUSH AXPUSH DX; 检查中断源MOV DX, IIR_FCRIN AL, DXTEST AL, 1        ; 检查是否有待处理中断JNZ ISR_EXIT      ; 无中断则退出; 仅处理接收数据中断TEST AL, 4        ; 检查是否为接收中断JNZ ISR_EXIT      ; 不是则退出; 读取接收到的数据MOV DX, RBR_THRIN AL, DXMOV [RECV_BYTE], AL; 根据接收字符控制LEDCMP AL, '1'       ; 接收到'1'?JE TURN_ONCMP AL, '0'       ; 接收到'0'?JE TURN_OFFJMP UPDATE_LED    ; 其他字符不改变状态TURN_ON:MOV [LED_STATE], 055H ; 设置全亮JMP UPDATE_LEDTURN_OFF:MOV [LED_STATE], 00H  ; 设置全灭UPDATE_LED:; 更新LED状态MOV DX, 800HMOV AL, [LED_STATE]OUT DX, AL; 回显接收到的字符MOV DX, RBR_THRMOV AL, [RECV_BYTE]OUT DX, ALISR_EXIT:; 发送EOI到8259MOV AL, 20HMOV DX, PIC_CMDOUT DX, ALPOP DXPOP AXIRET
UART_ISR ENDP; 初始化UART (波特率9600, 18.432MHz时钟)
INIT_UART:; 设置波特率除数(9600 @ 18.432MHz); 除数 = 18.432MHz / (16 * 9600) = 120 (78H)MOV DX, LCRMOV AL, 80H       ; 设置DLAB=1OUT DX, ALMOV DX, DLL       ; 除数锁存低字节MOV AL, 78H       ; 120 = 78HOUT DX, ALMOV DX, DLM       ; 除数锁存高字节MOV AL, 00H       ; 高位为0OUT DX, AL; 设置线路参数: 8位数据, 1停止位, 无校验MOV DX, LCRMOV AL, 03H       ; 8N1, DLAB=0OUT DX, AL; 启用FIFOMOV DX, IIR_FCRMOV AL, 0C7H      ; 启用FIFO, 14字节触发点OUT DX, AL; 设置调制解调器控制MOV DX, MCRMOV AL, 0BH       ; 启用OUT2(中断使能), RTS和DTROUT DX, AL; 启用接收数据中断MOV DX, IERMOV AL, 01H       ; 仅启用接收数据中断OUT DX, ALRET; 初始化8259
INIT_PIC:; 保存原始中断屏蔽字MOV DX, PIC_DATAIN AL, DXMOV [INTR_MASK], AL; 初始化8259MOV DX, PIC_CMDMOV AL, 13H       ; ICW1: 边沿触发, 级联, 需要ICW4OUT DX, ALMOV DX, PIC_DATAMOV AL, 20H       ; ICW2: 中断向量基值20HOUT DX, ALMOV AL, 01H       ; ICW4: 8086模式, 非缓冲, 正常EOIOUT DX, AL; 启用IR1中断MOV AL, [INTR_MASK]AND AL, 0FDH      ; 清除IR1屏蔽位(11111101)OUT DX, ALRET; 初始化LED
INIT_LED:MOV DX, 800HMOV AL, [LED_STATE] ; 初始状态(全亮)OUT DX, ALRET; 精确1秒延时子程序
; 输入: 无
; 输出: 无
; 使用寄存器: CX, DX
DELAY_1S PROCPUSH CXPUSH DX; 使用EMU8086的精确延时方法MOV CX, 05H      ; 外层循环次数 (调整此值可改变总延时)
DELAY_OUTER:MOV DX, 4FFFH    ; 内层循环计数器; 精确计时循环 (约0.066秒)
DELAY_INNER:NOP              ; 1周期NOP              ; 1周期NOP              ; 1周期DEC DX           ; 1周期JNZ DELAY_INNER  ; 4周期(跳转)/3周期(不跳)LOOP DELAY_OUTER ; 17/5周期; 微调延时 (约0.01秒)MOV CX, 0FFH
MICRO_DELAY:NOPNOPLOOP MICRO_DELAYPOP DXPOP CXRET
DELAY_1S ENDP; 发送单个字符
; 输入: AL = 要发送的字符
SEND_CHAR:PUSH DXPUSH AX; 保存字符MOV AH, ALSEND_WAIT:; 检查发送保持寄存器是否为空MOV DX, LSRIN AL, DXTEST AL, 20H      ; 检查THRE位(bit5)JZ SEND_WAIT      ; 不为空则等待; 发送字符MOV DX, RBR_THRMOV AL, AHOUT DX, ALPOP AXPOP DXRET; 发送字符串
; 输入: DS:SI = 字符串地址(以0结尾)
SEND_STRING:PUSH SIPUSH AXSEND_LOOP:LODSB             ; 从[DS:SI]加载字符到AL, SI++OR AL, AL         ; 检查是否结束(AL=0)JZ SEND_DONE      ; 是则结束CALL SEND_CHAR    ; 发送当前字符JMP SEND_LOOP     ; 继续发送SEND_DONE:POP AXPOP SIRET   ; 主初始化程序
INIT:CLI               ; 关中断; 设置中断向量(21H号中断)XOR AX, AXMOV ES, AXMOV DI, 21H * 4    ; 中断向量表地址MOV AX, OFFSET UART_ISRCLDSTOSW             ; 设置偏移地址MOV AX, CSSTOSW             ; 设置段地址; 初始化UARTCALL INIT_UART; 初始化8259; CALL INIT_PIC; 初始化LEDCALL INIT_LEDSTI               ; 开中断; 主循环(等待中断)
MAIN_LOOP:;HLT               ; 等待中断; 点亮LEDMOV DX, 800HMOV AL, 0FFhOUT DX, AL; 发送字符串MOV SI, OFFSET MESSAGECALL SEND_STRINGCALL DELAY_1S     ; 延时1秒; 熄灭LEDMOV AL,00HOUT DX, ALCALL DELAY_1S     ; 延时1秒                                               JMP MAIN_LOOP                 MESSAGE DB 'Hello Worl!     ',13,10, 0  ; 要发送的字符串 (以0结尾)DB   55H,55H,55H,55H,55HEND INIT             ; 程序结束点

4.验证结果

 

http://www.xdnf.cn/news/12523.html

相关文章:

  • 贝叶斯网络_TomatoSCI分析日记
  • vanna+deepseek+chainlit 实现自然语言转SQL的精度调优
  • 一种全新的非对称加密算法
  • 豪斯多夫距离 (Hausdorff Distance)在机器人轨迹规划中的应用
  • Kubernetes指标实现有效的集群监控和优化
  • 免费批量图片格式转换工具
  • usbutils工具的使用帮助
  • 【时时三省】(C语言基础)局部变量和全局变量
  • CSDN文章下载到本地的完整指南
  • 88.实现查看收藏功能的前端实现
  • 43道Java多线程高频题整理(附答案背诵版)
  • [蓝桥杯]解谜游戏
  • Tongweb配置跳过扫描应用jar的配置指引(by lqw)
  • 大模型如何革新用户价值、内容匹配与ROI预估
  • C语言字符数组初始化的5种方法(附带实例)
  • 鲲鹏麒麟服务器自制Nacos镜像并部署
  • Linux系统:ELF文件的定义与加载以及动静态链接
  • C++——红黑树
  • 三类 Telegram 账号的风控差异分析与使用建议
  • GWO-LSSVM-Adaboost灰狼算法GWO优化最小二乘支持向量机LSSVM分类预测!
  • python fbx sdk
  • 更新雅可比矩阵的非线性部分笔记
  • 和芯 SL6341 (内置FLASH) 国产USB 3.0HUB芯片 替代 GL3510 VL817
  • 区块链技术相关
  • mybatis中判断等于字符串的条件怎么写
  • ingress-nginx 开启 Prometheus 监控 + Grafana 查看指标
  • 《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
  • Python爬虫实战:研究mechanize库相关技术
  • 深入解析JVM工作原理:从字节码到机器指令的全过程
  • 四叉树在空间结构建模中的应用