基于8086 微处理器,使用 Proteus 绘制硬件电路、接线、全程仿真,指导我逐接线完成以下课程...

Tạo vào: 7 tháng 7, 2026

Trả lời bằng GPT-5.5 Thinking bởi Chat01

Câu hỏi

基于8086 微处理器,使用 Proteus 绘制硬件电路、接线、全程仿真,指导我逐接线完成以下课程设计,接线程序设计的尽可能简单,最低限度完成要求即可。给出接线详细指南与汇编程序(给予MU8086编译器,采用8086 汇编语言编程,代码结构规范、带详细注释)
题目 5 温度采集监控报警系统
设计要求

  1. 采用8086+8255A+ADC0809 + 热敏电阻构成温度采集电路,Proteus 仿真环境搭建硬件;
  2. 利用电位器模拟热敏电阻温度变化,ADC0809 查询方式完成模数转换,不使用 8259 中断;
  3. 两位数码管实时动态显示当前温度数值;
  4. 可设置上限、下限温度阈值;
  5. 温度正常:绿灯常亮;超上限:红灯亮 + 蜂鸣器长鸣;低于下限:红黄交替闪烁 + 蜂鸣器间歇报警;
  6. 用汇编编程完成端口初始化、AD 读取、数值换算、数码管显示、阈值判断与声光报警逻辑。

Suy nghĩ

Ensuring accurate EOC timing

Our code should wait for the conversion to finish by monitoring EOC and waiting for it to go low before sampling data. To handle edge cases, after the START signal falls, it's important to delay until EOC is low and then wait for EOC to go high again. This ensures proper synchronization, even with fast conversions.

Improving ADC wait timing

To account for the ADC0809's conversion time (over 100us) and the CPU's fast loop, it’s important to ensure proper timing when waiting for completion. I’ll implement a routine to first check for EOC being low, then wait until it goes high. Adding a short delay after START helps avoid premature reads.

Thought for 2m 59s

Trả lời

下面这套方案按最低复杂度、能完成验收功能设计。核心思路是:** 8255A 的 PA 口复用**,平时输出数码管段码,采集 ADC 时临时改成输入读取 ADC0809 数据,这样一个 8255A 就够用。


一、总体方案

1. 端口地址分配

8086 外接 8 位 8255A,接在低 8 位数据总线 D0–D7 上,所以端口用偶地址

8255A 端口地址作用
PA60H复用:数码管段码输出 / ADC 数据输入
PB62H数码管位选 + 红绿黄灯 + 蜂鸣器
PC64HADC 控制线 + EOC 查询 + 按键输入
控制口66H8255A 工作方式控制

2. 8255A 各口功能

PA 口:复用

PA 位显示时ADC 读取时
PA0数码管 a 段ADC D0
PA1数码管 b 段ADC D1
PA2数码管 c 段ADC D2
PA3数码管 d 段ADC D3
PA4数码管 e 段ADC D4
PA5数码管 f 段ADC D5
PA6数码管 g 段ADC D6
PA7数码管 dp 段ADC D7

平时 PA 输出段码;读取 ADC 时,程序把 PA 改为输入,读完再改回输出。


PB 口:显示位选与报警输出

PB 位功能有效方式
PB0十位数码管公共端低电平有效
PB1个位数码管公共端低电平有效
PB2绿灯高电平亮
PB3红灯高电平亮
PB4黄灯高电平亮
PB5蜂鸣器高电平响
PB6备用不接
PB7备用不接

数码管建议使用共阴极数码管


PC 口:ADC 控制与按键

PC 位功能方向
PC0ADC0809 ALE + START输出
PC1ADC0809 OE输出
PC2备用输出
PC3备用输出
PC4ADC0809 EOC输入
PC5SET 设置键输入,低电平按下
PC6“+” 加键输入,低电平按下
PC7“-” 减键输入,低电平按下

二、Proteus 元件清单

建议放置以下元件:

元件数量说明
80861微处理器
8255A1并行接口
ADC08091模数转换
POT-HG 电位器1模拟热敏电阻温度变化
7SEG-COM-CATHODE2共阴极数码管
LED-RED1红灯
LED-YELLOW1黄灯
LED-GREEN1绿灯
BUZZER1有源蜂鸣器
BUTTON3SET、+、-
RES 330Ω若干数码管、LED 限流
RES 10kΩ3按键上拉
CLOCK1给 ADC0809 提供时钟
74LS3731地址锁存
74LS1381地址译码

8086 最小系统的 ROM/RAM、时钟、复位部分,如果老师已经给了模板,直接用模板即可;本设计重点是 8255A、ADC0809、数码管和报警部分。


三、8086 与 8255A 接线

1. 8086 地址锁存

8086 的 AD0–AD7 是地址/数据复用线,因此要用 74LS373 锁存低 8 位地址。

808674LS373
AD0D0
AD1D1
AD2D2
AD3D3
AD4D4
AD5D5
AD6D6
AD7D7
ALELE
74LS373 OE接 GND

74LS373 的输出记为 LA0–LA7。


2. 8255A 数据线

80868255A
AD0D0
AD1D1
AD2D2
AD3D3
AD4D4
AD5D5
AD6D6
AD7D7

3. 8255A 地址线

因为 8255A 接在 8086 低 8 位数据总线上,并使用偶地址,所以:

8255A连接
A0LA1
A1LA2

这样地址对应关系为:

地址8255A 内部寄存器
60HPA
62HPB
64HPC
66H控制寄存器

4. 8255A 读写控制

80868255A
RDRD
WRWR
RESETRESET

5. 8255A 片选译码

使用 74LS138 译码,使 8255A 占用 60H–67H 地址范围。

60H = 0110 0000B

连接方式:

74LS138 引脚连接
ALA3
BLA4
CLA5
G1LA6
G2ALA7
G2B8086 的 M/IO 信号

74LS138 的 Y4 输出接 8255A 的 CS。

说明:如果你的 Proteus 中 8086 引脚名称是 M/IO,通常 I/O 周期为低电平,可以直接接 G2B;如果你使用的模板中信号极性不同,需要按模板调整片选逻辑。


四、ADC0809 接线

1. 模拟输入

用电位器模拟温度:

电位器连接
一端+5V
另一端GND
中间滑动端ADC0809 IN0

ADC0809 参考电压:

ADC0809连接
VREF++5V
VREF-GND
VCC+5V
GNDGND

这样 ADC 输出 0–255,对应显示温度 00–99。


2. ADC0809 通道选择

只用 IN0,因此通道地址固定为 000:

ADC0809连接
ADD AGND
ADD BGND
ADD CGND

3. ADC0809 数据线

ADC08098255A
D0PA0
D1PA1
D2PA2
D3PA3
D4PA4
D5PA5
D6PA6
D7PA7

注意:ADC0809 的 OE 必须由 PC1 控制,平时 OE=0,避免和数码管段码输出冲突。


4. ADC0809 控制线

ADC08098255A
ALEPC0
STARTPC0
OEPC1
EOCPC4
CLKProteus CLOCK 输出

CLOCK 建议设置为 500kHz 左右。


五、数码管接线

使用两个共阴极数码管

1. 段线连接

两个数码管的同名段并联。

8255A PA数码管段
PA0a
PA1b
PA2c
PA3d
PA4e
PA5f
PA6g
PA7dp

每条段线串联一个 330Ω 电阻。


2. 位选连接

8255A PB数码管
PB0十位数码管公共阴极
PB1个位数码管公共阴极

本程序采用低电平选通:

PB0PB1状态
01显示十位
10显示个位
11两位全灭

六、LED 与蜂鸣器接线

1. LED

8255A PB连接
PB2330Ω 电阻 → 绿 LED 正极
PB3330Ω 电阻 → 红 LED 正极
PB4330Ω 电阻 → 黄 LED 正极

LED 负极接 GND。


2. 蜂鸣器

8255A PB蜂鸣器
PB5有源蜂鸣器正极
GND有源蜂鸣器负极

建议用 Proteus 的 ACTIVE BUZZER 或普通 BUZZER。若实际硬件中蜂鸣器电流较大,需要加三极管驱动。


七、按键接线

三个按键分别接 PC5、PC6、PC7,采用低电平按下。

按键连接
SET 一端PC5
SET 另一端GND
“+” 一端PC6
“+” 另一端GND
“-” 一端PC7
“-” 另一端GND

每个 PC 输入端都要用 10kΩ 电阻上拉到 +5V。

PC5 / PC6 / PC710kΩ → +5V

八、按键功能说明

默认阈值:

阈值初值
下限温度20
上限温度70

按键功能:

操作功能
正常状态显示当前温度
按 SET 一次设置上限阈值,十位小数点亮
按 SET 两次设置下限阈值,个位小数点亮
按 SET 三次返回显示当前温度
按 “+”当前阈值加 1
按 “-”当前阈值减 1

九、报警逻辑

温度状态显示与报警
下限 ≤ 当前温度 ≤ 上限绿灯常亮
当前温度 > 上限红灯亮,蜂鸣器长鸣
当前温度 < 下限红灯、黄灯交替闪烁,蜂鸣器间歇报警

十、MU8086 / 8086 汇编程序

下面代码采用 8086 汇编,结构尽量简单,适合 MU8086 / EMU8086 风格编译。端口地址与上面硬件接线一致。

asm
;========================================================= ; 题目:8086 + 8255A + ADC0809 温度采集监控报警系统 ; 功能: ; 1. ADC0809 查询方式采集模拟温度 ; 2. 两位数码管动态显示温度 00~99 ; 3. SET / + / - 设置上下限阈值 ; 4. 正常绿灯亮 ; 5. 超上限红灯亮 + 蜂鸣器长鸣 ; 6. 低于下限红黄交替闪烁 + 蜂鸣器间歇报警 ; ; 端口地址: ; PA = 60H ; PB = 62H ; PC = 64H ; CTRL = 66H ;========================================================= ORG 100H JMP START ;========================================================= ; 8255A 端口地址定义 ;========================================================= PORTA EQU 060H PORTB EQU 062H PORTC EQU 064H CTRL_PORT EQU 066H ;========================================================= ; 8255A 控制字 ; ; CTRL_DISPLAY = 88H ; PA 输出:用于数码管段码 ; PB 输出:用于位选、LED、蜂鸣器 ; PC 高四位输入:PC4 EOC,PC5~PC7 按键 ; PC 低四位输出:PC0 START/ALE,PC1 OE ; ; CTRL_ADCIN = 98H ; PA 输入:用于读取 ADC0809 数据 ; 其余不变 ;========================================================= CTRL_DISPLAY EQU 088H CTRL_ADCIN EQU 098H ;========================================================= ; PB 位定义 ;========================================================= DIGIT_TEN EQU 00000010B ; PB0=0, PB1=1,选通十位 DIGIT_ONE EQU 00000001B ; PB0=1, PB1=0,选通个位 DIGIT_OFF EQU 00000011B ; PB0=1, PB1=1,两位全灭 GREEN_BIT EQU 00000100B ; PB2 RED_BIT EQU 00001000B ; PB3 YELLOW_BIT EQU 00010000B ; PB4 BUZZER_BIT EQU 00100000B ; PB5 ;========================================================= ; PC 位定义 ;========================================================= ADC_START_ALE EQU 00000001B ; PC0 ADC_OE EQU 00000010B ; PC1 EOC_BIT EQU 00010000B ; PC4 KEY_SET EQU 00100000B ; PC5 KEY_PLUS EQU 01000000B ; PC6 KEY_MINUS EQU 10000000B ; PC7 ;========================================================= ; 数据区 ;========================================================= ADC_RAW DB 0 ; ADC 原始值,0~255 TEMP_VAL DB 0 ; 当前温度,0~99 UPPER_TH DB 70 ; 上限温度阈值,默认 70 LOWER_TH DB 20 ; 下限温度阈值,默认 20 MODE_VAL DB 0 ; 0=显示温度,1=设置上限,2=设置下限 LAST_KEYS DB 0 ; 上一次按键状态,用于检测新按下 TENS_DIG DB 0 ; 十位 ONES_DIG DB 0 ; 个位 ALARM_BITS DB 0 ; 当前报警输出位,保存 PB2~PB5 BLINK_CNT DB 0 ; 闪烁计数 BLINK_FLAG DB 0 ; 闪烁状态标志 ;========================================================= ; 共阴极数码管段码表 ; 位定义:PA0=a, PA1=b, PA2=c, PA3=d, ; PA4=e, PA5=f, PA6=g, PA7=dp ;========================================================= SEG_TAB DB 03FH ; 0 DB 006H ; 1 DB 05BH ; 2 DB 04FH ; 3 DB 066H ; 4 DB 06DH ; 5 DB 07DH ; 6 DB 007H ; 7 DB 07FH ; 8 DB 06FH ; 9 ;========================================================= ; 主程序入口 ;========================================================= START: PUSH CS POP DS CALL INIT_8255 MAIN_LOOP: CALL READ_ADC ; 读取 ADC0809 CALL ADC_TO_TEMP ; ADC 值换算成 00~99 温度 CALL KEY_SCAN ; 扫描按键,设置上下限 CALL UPDATE_ALARM ; 根据温度更新报警状态 ; 根据当前模式决定数码管显示内容 MOV AL, MODE_VAL CMP AL, 0 JE SHOW_TEMP CMP AL, 1 JE SHOW_UPPER ; MODE_VAL = 2,显示下限阈值 MOV AL, LOWER_TH JMP DISPLAY_VALUE SHOW_UPPER: MOV AL, UPPER_TH JMP DISPLAY_VALUE SHOW_TEMP: MOV AL, TEMP_VAL DISPLAY_VALUE: CALL SPLIT_DIGITS ; 动态刷新一段时间,再重新采样 MOV CX, 80 REFRESH_LOOP: CALL DISPLAY_TWO_DIGITS LOOP REFRESH_LOOP JMP MAIN_LOOP ;========================================================= ; 初始化 8255A ;========================================================= INIT_8255 PROC MOV AL, CTRL_DISPLAY OUT CTRL_PORT, AL ; 关闭两个数码管,报警输出清零 MOV AL, DIGIT_OFF OUT PORTB, AL ; PC0、PC1 输出低电平 MOV AL, 00H OUT PORTC, AL RET INIT_8255 ENDP ;========================================================= ; 读取 ADC0809 ; ; 步骤: ; 1. PA 改为输入 ; 2. PC0 产生 START/ALE 脉冲 ; 3. 查询 EOC ; 4. PC1 置 1,打开 OE ; 5. 从 PA 读取 ADC 数据 ; 6. 关闭 OE,PA 改回输出 ;========================================================= READ_ADC PROC ; 两个数码管先关闭,防止读取 ADC 时乱显示 MOV AL, ALARM_BITS OR AL, DIGIT_OFF OUT PORTB, AL ; PA 改为输入,准备读取 ADC 数据 MOV AL, CTRL_ADCIN OUT CTRL_PORT, AL ; OE=0,START/ALE=0 MOV AL, 00H OUT PORTC, AL ; PC0 输出一个高脉冲,同时作为 ALE 和 START MOV AL, ADC_START_ALE OUT PORTC, AL NOP NOP MOV AL, 00H OUT PORTC, AL ; 等待 EOC 先变低,表示正在转换 WAIT_EOC_LOW: IN AL, PORTC TEST AL, EOC_BIT JNZ WAIT_EOC_LOW ; 等待 EOC 变高,表示转换完成 WAIT_EOC_HIGH: IN AL, PORTC TEST AL, EOC_BIT JZ WAIT_EOC_HIGH ; 打开 ADC 输出允许 OE MOV AL, ADC_OE OUT PORTC, AL NOP NOP ; 读取 ADC 数据 IN AL, PORTA MOV ADC_RAW, AL ; 关闭 OE MOV AL, 00H OUT PORTC, AL ; PA 改回输出,用于数码管显示 MOV AL, CTRL_DISPLAY OUT CTRL_PORT, AL ; 恢复 PB 输出状态 MOV AL, ALARM_BITS OR AL, DIGIT_OFF OUT PORTB, AL RET READ_ADC ENDP ;========================================================= ; ADC 值换算温度 ; ; ADC_RAW = 0~255 ; TEMP_VAL = ADC_RAW * 100 / 256 ; ; 这里直接取乘法结果高 8 位,近似完成 /256。 ; 显示范围约为 00~99。 ;========================================================= ADC_TO_TEMP PROC MOV AL, ADC_RAW MOV BL, 100 MUL BL ; AX = AL * BL ; AX / 256 的整数部分就是 AH MOV AL, AH MOV TEMP_VAL, AL RET ADC_TO_TEMP ENDP ;========================================================= ; 按键扫描 ; ; PC5 = SET,低电平按下 ; PC6 = +,低电平按下 ; PC7 = -,低电平按下 ; ; SET:0 -> 1 -> 2 -> 0 ; MODE=0:显示当前温度 ; MODE=1:设置上限 ; MODE=2:设置下限 ;========================================================= KEY_SCAN PROC IN AL, PORTC ; 按键低电平有效,取反后,按下为 1 NOT AL AND AL, 0E0H ; 只保留 PC5~PC7 MOV BL, AL ; BL = 当前按下状态 ; 检测“新按下”的按键 MOV AL, LAST_KEYS NOT AL AND AL, BL ; AL = 当前按下且上次未按下 MOV DL, AL MOV LAST_KEYS, BL ;--------------------------------------------- ; SET 键:切换模式 ;--------------------------------------------- TEST DL, KEY_SET JZ CHECK_PLUS MOV AL, MODE_VAL INC AL CMP AL, 3 JB SAVE_MODE MOV AL, 0 SAVE_MODE: MOV MODE_VAL, AL ;--------------------------------------------- ; “+” 键 ;--------------------------------------------- CHECK_PLUS: TEST DL, KEY_PLUS JZ CHECK_MINUS MOV AL, MODE_VAL CMP AL, 1 JE INC_UPPER CMP AL, 2 JE INC_LOWER JMP CHECK_MINUS INC_UPPER: MOV AL, UPPER_TH CMP AL, 99 JAE CHECK_MINUS INC AL MOV UPPER_TH, AL JMP CHECK_MINUS INC_LOWER: ; 下限不能大于等于上限 MOV AL, LOWER_TH MOV AH, UPPER_TH DEC AH CMP AL, AH JAE CHECK_MINUS INC AL MOV LOWER_TH, AL ;--------------------------------------------- ; “-” 键 ;--------------------------------------------- CHECK_MINUS: TEST DL, KEY_MINUS JZ KEY_DONE MOV AL, MODE_VAL CMP AL, 1 JE DEC_UPPER CMP AL, 2 JE DEC_LOWER JMP KEY_DONE DEC_UPPER: ; 上限必须大于下限 MOV AL, UPPER_TH MOV AH, LOWER_TH INC AH CMP AL, AH JBE KEY_DONE DEC AL MOV UPPER_TH, AL JMP KEY_DONE DEC_LOWER: MOV AL, LOWER_TH CMP AL, 0 JBE KEY_DONE DEC AL MOV LOWER_TH, AL KEY_DONE: RET KEY_SCAN ENDP ;========================================================= ; 更新报警状态 ; ; 正常:绿灯亮 ; 超上限:红灯亮 + 蜂鸣器长鸣 ; 低于下限:红黄交替闪烁 + 蜂鸣器间歇报警 ;========================================================= UPDATE_ALARM PROC ; 闪烁计数,用于低温报警 MOV AL, BLINK_CNT INC AL MOV BLINK_CNT, AL CMP AL, 4 JB CHECK_TEMP_STATE MOV BLINK_CNT, 0 MOV AL, BLINK_FLAG XOR AL, 1 MOV BLINK_FLAG, AL CHECK_TEMP_STATE: MOV AL, TEMP_VAL ; 判断是否超上限 CMP AL, UPPER_TH JA HIGH_ALARM ; 判断是否低于下限 CMP AL, LOWER_TH JB LOW_ALARM NORMAL_STATE: MOV AL, GREEN_BIT MOV ALARM_BITS, AL RET HIGH_ALARM: MOV AL, RED_BIT OR AL, BUZZER_BIT MOV ALARM_BITS, AL RET LOW_ALARM: MOV AL, BLINK_FLAG CMP AL, 0 JE LOW_RED ; 闪烁状态 1:黄灯亮,蜂鸣器响 MOV AL, YELLOW_BIT OR AL, BUZZER_BIT MOV ALARM_BITS, AL RET LOW_RED: ; 闪烁状态 0:红灯亮,蜂鸣器不响 MOV AL, RED_BIT MOV ALARM_BITS, AL RET UPDATE_ALARM ENDP ;========================================================= ; 将 AL 中的 0~99 数值拆分成十位和个位 ;========================================================= SPLIT_DIGITS PROC MOV AH, 0 MOV BL, 10 DIV BL ; AL=十位,AH=个位 MOV TENS_DIG, AL MOV ONES_DIG, AH RET SPLIT_DIGITS ENDP ;========================================================= ; 动态显示两位数码管 ; ; MODE=1:十位小数点亮,表示正在设置上限 ; MODE=2:个位小数点亮,表示正在设置下限 ;========================================================= DISPLAY_TWO_DIGITS PROC PUSH AX PUSH BX PUSH CX PUSH DX ;---------------------------- ; 显示十位 ;---------------------------- MOV AL, TENS_DIG CALL GET_SEG_CODE ; 设置上限模式:十位小数点亮 MOV AH, MODE_VAL CMP AH, 1 JNE NO_DP_TEN OR AL, 080H NO_DP_TEN: OUT PORTA, AL MOV AL, ALARM_BITS OR AL, DIGIT_TEN OUT PORTB, AL CALL SHORT_DELAY ; 关位,防止重影 MOV AL, ALARM_BITS OR AL, DIGIT_OFF OUT PORTB, AL ;---------------------------- ; 显示个位 ;---------------------------- MOV AL, ONES_DIG CALL GET_SEG_CODE ; 设置下限模式:个位小数点亮 MOV AH, MODE_VAL CMP AH, 2 JNE NO_DP_ONE OR AL, 080H NO_DP_ONE: OUT PORTA, AL MOV AL, ALARM_BITS OR AL, DIGIT_ONE OUT PORTB, AL CALL SHORT_DELAY ; 关位 MOV AL, ALARM_BITS OR AL, DIGIT_OFF OUT PORTB, AL POP DX POP CX POP BX POP AX RET DISPLAY_TWO_DIGITS ENDP ;========================================================= ; 查表获得数码管段码 ; 输入:AL = 0~9 ; 输出:AL = 段码 ;========================================================= GET_SEG_CODE PROC PUSH BX MOV BX, OFFSET SEG_TAB XLAT POP BX RET GET_SEG_CODE ENDP ;========================================================= ; 短延时,用于数码管动态扫描 ; 如果数码管闪烁,可适当增大 CX 初值 ; 如果仿真太慢,可适当减小 CX 初值 ;========================================================= SHORT_DELAY PROC PUSH CX MOV CX, 0400H DLY1: NOP LOOP DLY1 POP CX RET SHORT_DELAY ENDP ;========================================================= ; 程序结束:本系统为循环程序,不返回 DOS ;========================================================= END

十一、Proteus 调试顺序

建议按下面顺序检查,避免一上来全接导致不好排错:

第一步:只测 8255A + 数码管

先不接 ADC0809,把程序中 TEMP_VAL 固定为 25,看数码管能否显示 25

如果不亮,优先检查:

  1. 是否使用共阴极数码管;
  2. PA0–PA6 是否对应 a–g;
  3. PB0、PB1 是否接到公共阴极;
  4. 位选是否低电平有效。

第二步:接入 ADC0809

转动电位器,观察显示是否从 0099 变化。

如果卡住不变,检查:

  1. ADC0809 是否有 CLK;
  2. VREF+ 是否接 +5V;
  3. VREF- 是否接 GND;
  4. OE 是否接 PC1;
  5. EOC 是否接 PC4;
  6. START 和 ALE 是否都接 PC0;
  7. ADC D0–D7 是否接 PA0–PA7。

第三步:测试报警

默认阈值为:

asm
UPPER_TH DB 70 LOWER_TH DB 20

转动电位器:

显示值现象
20–70绿灯亮
大于 70红灯亮,蜂鸣器长鸣
小于 20红黄交替闪烁,蜂鸣器间歇响

第四步:测试阈值设置

按键测试:

  1. 按 SET 一次:显示上限阈值,十位小数点亮;
  2. 按 “+” 或 “-”:修改上限;
  3. 再按 SET:显示下限阈值,个位小数点亮;
  4. 按 “+” 或 “-”:修改下限;
  5. 再按 SET:回到当前温度显示。

十二、容易出错的地方

最容易错的是这几个:

  1. 8255A 的 A0、A1 不要接 LA0、LA1,而要接 LA1、LA2。
    因为 8086 接 8 位外设时使用偶地址。

  2. ADC0809 的数据线和数码管段线共用 PA 口时,OE 必须受控。
    显示时 OE=0;读取 ADC 时 PA 改输入,OE=1。

  3. 数码管必须选共阴极。
    如果你用共阳极,段码和位选逻辑都要取反。

  4. 按键必须上拉。
    PC5、PC6、PC7 不接上拉电阻会漂移,程序会误判按键。

  5. 蜂鸣器建议用有源蜂鸣器。
    本程序只输出高低电平,不产生音频方波。验收报警功能用有源蜂鸣器最简单。

Chia sẻ Q&A này