惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
MyScale Blog
MyScale Blog
博客园 - 【当耐特】
I
InfoQ
腾讯CDC
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
Vercel News
Vercel News
C
Check Point Blog
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
Y
Y Combinator Blog
D
Docker
MongoDB | Blog
MongoDB | Blog
量子位
博客园_首页

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog
[微机实验/TD-PITE] 8254 定时/计数器实验+选做实验 | Yester...
Yesterday17 · 2020-10-12 · via Yesterday17's Blog

ToC

  • 实验内容
  • 实验接线
  • 代码
  • 波形
    • 方式 0
    • 方式 1
    • 方式 2
    • 方式 3
  • 选做实验:手动控制输入时钟
  • 连线
    • 代码
    • 输出
  • 选做实验:周期为 1 的方波
  • 选做实验:控制 LED
    • 连线
    • 代码
    • 效果

实验内容

观察 8254 工作在方式 0、方式 1、方式 2 和方式 3 的波形。

实验接线

实验说明中使用的是计数器 1,但我的环境下计数器 1 之前不知道出了什么问题,无法正常使用。更换为计数器 0 则工作正常,因此以下实验均以计数器 0 实现。

现在发现好像是初值赋值的变量出问题了,但我懒得改了(

接线如下图:

CLK0 与时钟源的 18.432kHz 相连,GATE 与开关及 LED 现实单元的 K0 相连。

代码

C018254 EQU 0600H

C028254 EQU 0602H

C038254 EQU 0604H

CON8254 EQU 0606H

CODE SEGMENT

ASSUME CS:CODE

START PROC

MOV DX, CON8254

;; 01: COUNTER 1

;; 11: READ HIGHER 8 BYTES

;; THEN LOWER 8 BYTES

;; 000:WORK TYPE 0

;; 0: BINARY NUMBER

MOV AL, 00110000B

;;MOV AL, 00110010B

;;MOV AL, 00110100B

;;MOV AL, 00110110B

OUT DX, AL

MOV DX, C018254

MOV AL, 00H ;; LOWER 8 BYTES

OUT DX, AL

MOV AL, 48H ;; HIGHER 8 BYTES

OUT DX, AL

LO:

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

CODE ENDS

END START

这里值得注意的是我们将计数器初值设置成了 0x4800,这个值的十进制表示就是 18432,与时钟源的频率相同,即计数一秒。

波形

方式 0

GATE 输入设置为高电平,等待一秒后输出变为高电平。

方式 1

计数器在 GATE 边沿启动。书上说是上升沿,但其实下降沿也会触发。

方式 2

方式 2 我不清楚输出是否正确,仅作参考。

方式 3

方式 3 是方波输出,如下所示。

选做实验:手动控制输入时钟

连线

修改布线,将 CLK0KK1+ 相连,如下图所示:

代码

C018254 EQU 0600H

C028254 EQU 0602H

C038254 EQU 0604H

CON8254 EQU 0606H

CODE SEGMENT

ASSUME CS:CODE

START PROC

MOV DX, CON8254

MOV AL, 00110000B

OUT DX, AL

MOV DX, C018254

MOV AL, 08H ;; LOWER 8 BYTES

OUT DX, AL

MOV AL, 00H ;; HIGHER 8 BYTES

OUT DX, AL

LO:

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

CODE ENDS

END START

输出

连按 KK1 即可,待计数值归零时就会变为高电平。

选做实验:周期为 1 的方波

这个实验我们在基础实验的时候就已经做完了,这里就跳过了。

选做实验:控制 LED

连线

正常连接 8255 即可。OUT0 连接 MIR6,通过中断控制 LED 移动。

代码

C018254 EQU 0600H

C028254 EQU 0602H

C038254 EQU 0604H

CON8254 EQU 0606H

CODE SEGMENT

ASSUME CS:CODE

START PROC

MOV BX, 0;

;; INIT 8255

MOV DX, 0646H

MOV AL, 90H ;; 10010000B, INPUT FROM A & OUTPUT TO B

OUT DX, AL

;; MIR6

MOV AX, OFFSET MIR6 ;; PUT CS:IP TO INTERRUPT VECTOR ADDRESS

;; 6: 38H - 3BH

;; IP -> 38H

;; CS -> 3AH

MOV SI, 38H

MOV [SI], AX

MOV AX, CS

MOV SI, 3AH

MOV [SI], AX

;; --------------------------------------------------

;; INIT 8259

CLI

MOV AL, 11H

OUT 20H, AL

MOV AL, 08H

OUT 21H, AL

MOV AL, 04H

OUT 21H, AL

MOV AL, 07H

OUT 21H, AL

MOV AL, 2FH

OUT 21H, AL

STI

;; --------------------------------------------------

MOV DX, CON8254

;;MOV AL, 00110100B

MOV AL, 00110110B

OUT DX, AL

MOV DX, C018254

MOV AL, 00H ;; LOWER 8 BYTES

OUT DX, AL

MOV AL, 48H ;; HIGHER 8 BYTES

OUT DX, AL

MOV BX, 0

LO:

JMP LO

MOV AX, 4C00H

INT 21H

START ENDP

MIR6:

CMP BL, 0FFH

JE WRITE

SHL BL, 1

INC BL

WRITE:

MOV DX, 0642H

MOV AL, BL

OUT DX, AL

IRET

CODE ENDS

END START

效果