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

物流wap网站模板免费下载百度并安装

物流wap网站模板,免费下载百度并安装,frontpage网页制作软件下载,邢台学校网站建设价格1.硬件原理图 2.测试程序 ; ; PC16550 UART接收中断程序 LED闪烁 串口输出 ; 硬件配置: ; - UART基地址: 100H ; - LED端口: 800H ; - 8259 PIC端口: 400H(命令), 402H(数据) ; - 中断请求线: IRQ1 (8259 IR1) ; - 中断向量号: 21H ; - 时钟频率: 18.432MHz ; …

1.硬件原理图

 

 

2.测试程序

; =============================================
; PC16550 UART接收中断程序 + LED闪烁 + 串口输出
; 硬件配置:
;   - UART基地址: 100H
;   - LED端口: 800H
;   - 8259 PIC端口: 400H(命令), 402H(数据)
;   - 中断请求线: IRQ1 (8259 IR1)
;   - 中断向量号: 21H
;   - 时钟频率: 18.432MHz
;   - 波特率: 9600 bps (除数78H)
; =============================================ORG 100H
JMP INITIALIZATION      ; 跳过数据区到初始化代码; 数据段定义
BUFFER_SIZE EQU 256     ; 接收缓冲区大小
recv_buffer DB BUFFER_SIZE DUP(0)  ; 接收缓冲区
buffer_head DW 0        ; 缓冲区头指针
buffer_tail DW 0        ; 缓冲区尾指针
buffer_count DW 0       ; 缓冲区中字符计数; LED控制变量
led_state DB 0FFH       ; LED状态: FFH=亮, 00H=灭
flash_counter DW 0      ; 闪烁计数器
FLASH_INTERVAL EQU 500  ; 闪烁间隔(约0.5秒); 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端口 (修改为400H/402H)
PIC_CMD  EQU 400H
PIC_DATA EQU 402H; 中断向量号
UART_IRQ EQU 21H        ; IRQ1对应中断21H; =============================================
; UART初始化子程序
; =============================================
INIT_UART:; 设置波特率除数 (9600 @ 18.432MHz)MOV DX, LCRMOV AL, 80H         ; 设置DLAB=1OUT DX, ALMOV DX, DLL         ; 除数锁存低字节MOV AL, 78H         ; 120 = 78H (18.432MHz / (16 * 9600))OUT DX, ALMOV DX, DLM         ; 除数锁存高字节MOV AL, 00HOUT DX, AL; 设置线路参数: 8位数据, 1停止位, 无校验MOV DX, LCRMOV AL, 03H         ; 8N1, DLAB=0OUT DX, AL; 启用并复位FIFOMOV DX, IIR_FCRMOV AL, 0C7H        ; 启用FIFO, 14字节触发点, 清除接收FIFOOUT DX, AL; 设置调制解调器控制MOV DX, MCRMOV AL, 0BH         ; 启用OUT2(中断使能), RTS和DTROUT DX, AL; 启用接收数据中断MOV DX, IERMOV AL, 01H         ; 仅启用接收数据中断OUT DX, ALRET; =============================================
; 8259 PIC初始化 (适配400H/402H端口)
; =============================================
INIT_PIC:; 保存原始中断屏蔽字MOV DX, PIC_DATAIN AL, DXMOV [original_mask], AL; 初始化8259MOV DX, PIC_CMDMOV AL, 11H         ; ICW1: 边沿触发, 级联, 需要ICW4OUT DX, ALMOV DX, PIC_DATAMOV AL, UART_IRQ    ; ICW2: 中断向量基值OUT DX, ALMOV AL, 01H         ; ICW4: 8086模式, 非缓冲, 正常EOIOUT DX, AL; 允许IRQ1中断IN AL, DXAND AL, 0FDH        ; 清除IRQ1屏蔽位(11111101)OUT DX, ALRET; =============================================
; 设置中断向量
; =============================================
SET_INTERRUPT_VECTOR:CLI                 ; 关中断XOR AX, AXMOV ES, AX          ; ES = 0 (中断向量表段地址); 计算中断向量位置 (中断号 * 4)MOV AX, UART_IRQSHL AX, 2           ; 乘以4; 设置中断向量MOV DI, AXMOV AX, OFFSET UART_ISRCLDSTOSW               ; 存储偏移地址MOV AX, CSSTOSW               ; 存储段地址STI                 ; 开中断RET; =============================================
; UART中断服务程序 (IRQ1)
; =============================================
UART_ISR PROC FARPUSH AXPUSH BXPUSH DXPUSH DS; 设置DS为当前数据段MOV AX, CSMOV DS, AXISR_LOOP:; 检查中断源MOV DX, IIR_FCRIN AL, DXTEST AL, 01H        ; 检查是否有待处理中断 (bit0=1表示无中断)JNZ ISR_EXIT        ; 无中断则退出; 检查是否为接收数据中断TEST AL, 04H        ; 检查中断类型位 (bit1-2)JNZ CHECK_OTHER     ; 不是接收中断则检查其他; 处理接收数据中断MOV DX, RBR_THRIN AL, DX           ; 读取接收到的字符; 将字符存入缓冲区CALL BUFFER_STORE; 继续检查其他中断JMP ISR_LOOPCHECK_OTHER:; 处理其他中断类型 (可选); 这里可以添加发送中断或错误中断的处理; ...ISR_EXIT:; 发送EOI到8259 (使用新端口)MOV AL, 20HMOV DX, PIC_CMD     ; PIC_CMD = 400HOUT DX, ALPOP DSPOP DXPOP BXPOP AXIRET
UART_ISR ENDP; =============================================
; 串口发送字符子程序
; 输入: AL = 要发送的字符
; =============================================
SEND_CHAR:PUSH AXPUSH DX; 保存字符MOV AH, ALSEND_WAIT:; 检查发送保持寄存器是否为空MOV DX, LSRIN AL, DXTEST AL, 20H        ; 检查THRE位(bit5)JZ SEND_WAIT        ; 不为空则等待; 发送字符MOV DX, RBR_THRMOV AL, AHOUT DX, ALPOP DXPOP AXRET; =============================================
; LED控制子程序
; =============================================
UPDATE_LED:PUSH AXPUSH DX; 更新闪烁计数器INC [flash_counter]CMP [flash_counter], FLASH_INTERVALJB LED_DONE         ; 未达到间隔; 重置计数器MOV [flash_counter], 0; 切换LED状态XOR [led_state], 0FFH; 输出到LED端口MOV DX, 800HMOV AL, [led_state]OUT DX, ALLED_DONE:POP DXPOP AXRET; =============================================
; 将字符存入缓冲区
; =============================================
BUFFER_STORE:PUSH BX; 检查缓冲区是否已满MOV BX, buffer_countCMP BX, BUFFER_SIZEJAE BUFFER_FULL     ; 缓冲区已满,丢弃字符; 存储字符MOV BX, buffer_tailMOV [recv_buffer + BX], AL; 更新尾指针INC BXCMP BX, BUFFER_SIZEJB NO_WRAP_TAILXOR BX, BX          ; 回绕到缓冲区开头NO_WRAP_TAIL:MOV buffer_tail, BX; 更新字符计数INC buffer_countBUFFER_FULL:POP BXRET; =============================================
; 从缓冲区读取字符
; =============================================
BUFFER_READ:PUSH BX; 检查缓冲区是否为空CMP buffer_count, 0JE BUFFER_EMPTY; 读取字符MOV BX, buffer_headMOV AL, [recv_buffer + BX]; 更新头指针INC BXCMP BX, BUFFER_SIZEJB NO_WRAP_HEADXOR BX, BX          ; 回绕到缓冲区开头NO_WRAP_HEAD:MOV buffer_head, BX; 更新字符计数DEC buffer_count; 设置成功标志STCJMP READ_DONEBUFFER_EMPTY:XOR AL, AL          ; 返回0CLC                 ; 清除进位标志 (失败)READ_DONE:POP BXRET; =============================================
; 初始化缓冲区和LED
; =============================================
INIT_SYSTEM:; 初始化缓冲区MOV buffer_head, 0MOV buffer_tail, 0MOV buffer_count, 0; 初始化LED状态MOV [led_state], 0FFH  ; 初始状态: 亮MOV [flash_counter], 0; 初始化LED端口MOV DX, 800HMOV AL, [led_state]OUT DX, ALRET; =============================================
; 串口发送字符串
; 输入: SI = 字符串偏移地址
; =============================================
SEND_STRING:PUSH AXPUSH SISEND_STR_LOOP:LODSB               ; 加载字符到ALOR AL, AL           ; 检查是否结束(0)JZ SEND_STR_DONE    ; 是则结束CALL SEND_CHAR      ; 发送字符JMP SEND_STR_LOOP   ; 继续发送SEND_STR_DONE:POP SIPOP AXRET; =============================================
; 主初始化程序
; =============================================
INITIALIZATION:; 初始化系统CALL INIT_SYSTEM; 初始化UARTCALL INIT_UART; 初始化8259 PICCALL INIT_PIC; 设置中断向量CALL SET_INTERRUPT_VECTOR; 通过串口发送启动消息MOV SI, OFFSET startup_msgCALL SEND_STRING; =============================================
; 主程序循环
; =============================================
MAIN_LOOP:; 更新LED状态CALL UPDATE_LED; 检查是否有接收到的字符CALL BUFFER_READJNC NO_DATA         ; 无数据则继续等待; 通过串口回显接收到的字符CALL SEND_CHAR; 检查是否为退出命令CMP AL, 1BH         ; ESC键JE EXIT_PROGRAMNO_DATA:; 短延时以控制闪烁频率MOV CX, 3000        ; 延时参数
DELAY_SHORT:LOOP DELAY_SHORTJMP MAIN_LOOP; =============================================
; 退出程序
; =============================================
EXIT_PROGRAM:; 恢复原始中断屏蔽字MOV DX, PIC_DATAMOV AL, [original_mask]OUT DX, AL; 禁用UART中断MOV DX, IERMOV AL, 00HOUT DX, AL; 关闭LEDMOV DX, 800HMOV AL, 00HOUT DX, AL; 通过串口发送退出消息MOV SI, OFFSET exit_msgCALL SEND_STRING; 返回DOSMOV AH, 4CHINT 21H; =============================================
; 数据区
; =============================================
original_mask DB ?     ; 原始8259中断屏蔽字
startup_msg DB 0Dh, 0Ah, 'UART Interrupt Program (8259@400H) Started', 0Dh, 0AhDB 'Press ESC to exit...', 0Dh, 0Ah, 0
exit_msg    DB 0Dh, 0Ah, 'Program terminated.', 0Dh, 0Ah, 0END INITIALIZATION

 

http://www.hengruixuexiao.com/news/13630.html

相关文章:

  • 做直播网站用什么语言百度竞价渠道代理商
  • 做网站付多少定金搜狗权重查询
  • 做传奇网站百度百科官网入口
  • 万网 网站 流程自己代理一款手游需要多少钱
  • 知名的电子商务网站域名查询网站入口
  • 简单做任务赚钱网站公司网站如何推广
  • 公司门户网站是什么朋友圈营销
  • 百度推广如何办理seo顾问咨询
  • 扬州专业做网站百度收录平台
  • 网站上线确认书今日十大热点新闻头条
  • 北京网站搭建方案奶茶推广软文200字
  • 公众平台官网登录入口seo排名优化教学
  • 寺院网站建设百度2019旧版本下载
  • 珠海网站建设工程北京seo技术
  • 九一赣州人才网找工作站优云seo优化
  • dw手机网站怎么做泉州排名推广
  • 为什么网站浏览不是做的那样seo优化分析
  • 龙采科技做网站多少钱今日重大军事新闻
  • 昆山网站开发建设公司自己如何制作一个网页
  • 什么网站做电脑系统好长沙seo培训班
  • 做qq空间网站百度分析工具
  • 做seo排名好的网站北京网络推广公司排行
  • 360网站建设游戏代理怎么找渠道
  • 网站策划网站建设企业百度网址大全官网旧版
  • 凡科平台登录平台搜索引擎优化是什么意思
  • 做视频可以赚钱的网站郑州seo地址
  • 珠海企业网站建设报价重庆百度推广优化
  • wordpress文章 页面模板下载seo点击
  • 做设计都有什么网站今日国际新闻摘抄
  • 陕西省西安市网站建设公司培训心得体会万能模板