基于8086 微处理器,使用 Proteus 绘制硬件电路、接线、全程仿真,指导我逐接线完成以下课程...
創建於:2026年7月7日
使用 GPT-5.5 Thinking 回答 Chat01
創建於:2026年7月7日
使用 GPT-5.5 Thinking 回答 Chat01
基于8086 微处理器,使用 Proteus 绘制硬件电路、接线、全程仿真,指导我逐接线完成以下课程设计,接线程序设计的尽可能简单,最低限度完成要求即可。给出接线详细指南与汇编程序(给予MU8086编译器,采用8086 汇编语言编程,代码结构规范、带详细注释)
题目 5 温度采集监控报警系统
设计要求
下面这套方案按最低复杂度、能完成验收功能设计。核心思路是:** 8255A 的 PA 口复用**,平时输出数码管段码,采集 ADC 时临时改成输入读取 ADC0809 数据,这样一个 8255A 就够用。
8086 外接 8 位 8255A,接在低 8 位数据总线 D0–D7 上,所以端口用偶地址:
| 8255A 端口 | 地址 | 作用 |
|---|---|---|
| PA | 60H | 复用:数码管段码输出 / ADC 数据输入 |
| PB | 62H | 数码管位选 + 红绿黄灯 + 蜂鸣器 |
| PC | 64H | ADC 控制线 + EOC 查询 + 按键输入 |
| 控制口 | 66H | 8255A 工作方式控制 |
| 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 位 | 功能 | 有效方式 |
|---|---|---|
| PB0 | 十位数码管公共端 | 低电平有效 |
| PB1 | 个位数码管公共端 | 低电平有效 |
| PB2 | 绿灯 | 高电平亮 |
| PB3 | 红灯 | 高电平亮 |
| PB4 | 黄灯 | 高电平亮 |
| PB5 | 蜂鸣器 | 高电平响 |
| PB6 | 备用 | 不接 |
| PB7 | 备用 | 不接 |
数码管建议使用共阴极数码管。
| PC 位 | 功能 | 方向 |
|---|---|---|
| PC0 | ADC0809 ALE + START | 输出 |
| PC1 | ADC0809 OE | 输出 |
| PC2 | 备用 | 输出 |
| PC3 | 备用 | 输出 |
| PC4 | ADC0809 EOC | 输入 |
| PC5 | SET 设置键 | 输入,低电平按下 |
| PC6 | “+” 加键 | 输入,低电平按下 |
| PC7 | “-” 减键 | 输入,低电平按下 |
建议放置以下元件:
| 元件 | 数量 | 说明 |
|---|---|---|
| 8086 | 1 | 微处理器 |
| 8255A | 1 | 并行接口 |
| ADC0809 | 1 | 模数转换 |
| POT-HG 电位器 | 1 | 模拟热敏电阻温度变化 |
| 7SEG-COM-CATHODE | 2 | 共阴极数码管 |
| LED-RED | 1 | 红灯 |
| LED-YELLOW | 1 | 黄灯 |
| LED-GREEN | 1 | 绿灯 |
| BUZZER | 1 | 有源蜂鸣器 |
| BUTTON | 3 | SET、+、- |
| RES 330Ω | 若干 | 数码管、LED 限流 |
| RES 10kΩ | 3 | 按键上拉 |
| CLOCK | 1 | 给 ADC0809 提供时钟 |
| 74LS373 | 1 | 地址锁存 |
| 74LS138 | 1 | 地址译码 |
8086 最小系统的 ROM/RAM、时钟、复位部分,如果老师已经给了模板,直接用模板即可;本设计重点是 8255A、ADC0809、数码管和报警部分。
8086 的 AD0–AD7 是地址/数据复用线,因此要用 74LS373 锁存低 8 位地址。
| 8086 | 74LS373 |
|---|---|
| AD0 | D0 |
| AD1 | D1 |
| AD2 | D2 |
| AD3 | D3 |
| AD4 | D4 |
| AD5 | D5 |
| AD6 | D6 |
| AD7 | D7 |
| ALE | LE |
| 74LS373 OE | 接 GND |
74LS373 的输出记为 LA0–LA7。
| 8086 | 8255A |
|---|---|
| AD0 | D0 |
| AD1 | D1 |
| AD2 | D2 |
| AD3 | D3 |
| AD4 | D4 |
| AD5 | D5 |
| AD6 | D6 |
| AD7 | D7 |
因为 8255A 接在 8086 低 8 位数据总线上,并使用偶地址,所以:
| 8255A | 连接 |
|---|---|
| A0 | LA1 |
| A1 | LA2 |
这样地址对应关系为:
| 地址 | 8255A 内部寄存器 |
|---|---|
| 60H | PA |
| 62H | PB |
| 64H | PC |
| 66H | 控制寄存器 |
| 8086 | 8255A |
|---|---|
| RD | RD |
| WR | WR |
| RESET | RESET |
使用 74LS138 译码,使 8255A 占用 60H–67H 地址范围。
60H = 0110 0000B
连接方式:
| 74LS138 引脚 | 连接 |
|---|---|
| A | LA3 |
| B | LA4 |
| C | LA5 |
| G1 | LA6 |
| G2A | LA7 |
| G2B | 8086 的 M/IO 信号 |
74LS138 的 Y4 输出接 8255A 的 CS。
说明:如果你的 Proteus 中 8086 引脚名称是 M/IO,通常 I/O 周期为低电平,可以直接接 G2B;如果你使用的模板中信号极性不同,需要按模板调整片选逻辑。
用电位器模拟温度:
| 电位器 | 连接 |
|---|---|
| 一端 | +5V |
| 另一端 | GND |
| 中间滑动端 | ADC0809 IN0 |
ADC0809 参考电压:
| ADC0809 | 连接 |
|---|---|
| VREF+ | +5V |
| VREF- | GND |
| VCC | +5V |
| GND | GND |
这样 ADC 输出 0–255,对应显示温度 00–99。
只用 IN0,因此通道地址固定为 000:
| ADC0809 | 连接 |
|---|---|
| ADD A | GND |
| ADD B | GND |
| ADD C | GND |
| ADC0809 | 8255A |
|---|---|
| D0 | PA0 |
| D1 | PA1 |
| D2 | PA2 |
| D3 | PA3 |
| D4 | PA4 |
| D5 | PA5 |
| D6 | PA6 |
| D7 | PA7 |
注意:ADC0809 的 OE 必须由 PC1 控制,平时 OE=0,避免和数码管段码输出冲突。
| ADC0809 | 8255A |
|---|---|
| ALE | PC0 |
| START | PC0 |
| OE | PC1 |
| EOC | PC4 |
| CLK | Proteus CLOCK 输出 |
CLOCK 建议设置为 500kHz 左右。
使用两个共阴极数码管。
两个数码管的同名段并联。
| 8255A PA | 数码管段 |
|---|---|
| PA0 | a |
| PA1 | b |
| PA2 | c |
| PA3 | d |
| PA4 | e |
| PA5 | f |
| PA6 | g |
| PA7 | dp |
每条段线串联一个 330Ω 电阻。
| 8255A PB | 数码管 |
|---|---|
| PB0 | 十位数码管公共阴极 |
| PB1 | 个位数码管公共阴极 |
本程序采用低电平选通:
| PB0 | PB1 | 状态 |
|---|---|---|
| 0 | 1 | 显示十位 |
| 1 | 0 | 显示个位 |
| 1 | 1 | 两位全灭 |
| 8255A PB | 连接 |
|---|---|
| PB2 | 330Ω 电阻 → 绿 LED 正极 |
| PB3 | 330Ω 电阻 → 红 LED 正极 |
| PB4 | 330Ω 电阻 → 黄 LED 正极 |
LED 负极接 GND。
| 8255A PB | 蜂鸣器 |
|---|---|
| PB5 | 有源蜂鸣器正极 |
| GND | 有源蜂鸣器负极 |
建议用 Proteus 的 ACTIVE BUZZER 或普通 BUZZER。若实际硬件中蜂鸣器电流较大,需要加三极管驱动。
三个按键分别接 PC5、PC6、PC7,采用低电平按下。
| 按键 | 连接 |
|---|---|
| SET 一端 | PC5 |
| SET 另一端 | GND |
| “+” 一端 | PC6 |
| “+” 另一端 | GND |
| “-” 一端 | PC7 |
| “-” 另一端 | GND |
每个 PC 输入端都要用 10kΩ 电阻上拉到 +5V。
| PC5 / PC6 / PC7 | 10kΩ → +5V |
|---|
默认阈值:
| 阈值 | 初值 |
|---|---|
| 下限温度 | 20 |
| 上限温度 | 70 |
按键功能:
| 操作 | 功能 |
|---|---|
| 正常状态 | 显示当前温度 |
| 按 SET 一次 | 设置上限阈值,十位小数点亮 |
| 按 SET 两次 | 设置下限阈值,个位小数点亮 |
| 按 SET 三次 | 返回显示当前温度 |
| 按 “+” | 当前阈值加 1 |
| 按 “-” | 当前阈值减 1 |
| 温度状态 | 显示与报警 |
|---|---|
| 下限 ≤ 当前温度 ≤ 上限 | 绿灯常亮 |
| 当前温度 > 上限 | 红灯亮,蜂鸣器长鸣 |
| 当前温度 < 下限 | 红灯、黄灯交替闪烁,蜂鸣器间歇报警 |
下面代码采用 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
建议按下面顺序检查,避免一上来全接导致不好排错:
先不接 ADC0809,把程序中 TEMP_VAL 固定为 25,看数码管能否显示 25。
如果不亮,优先检查:
转动电位器,观察显示是否从 00 到 99 变化。
如果卡住不变,检查:
默认阈值为:
asmUPPER_TH DB 70 LOWER_TH DB 20
转动电位器:
| 显示值 | 现象 |
|---|---|
| 20–70 | 绿灯亮 |
| 大于 70 | 红灯亮,蜂鸣器长鸣 |
| 小于 20 | 红黄交替闪烁,蜂鸣器间歇响 |
按键测试:
最容易错的是这几个:
8255A 的 A0、A1 不要接 LA0、LA1,而要接 LA1、LA2。
因为 8086 接 8 位外设时使用偶地址。
ADC0809 的数据线和数码管段线共用 PA 口时,OE 必须受控。
显示时 OE=0;读取 ADC 时 PA 改输入,OE=1。
数码管必须选共阴极。
如果你用共阳极,段码和位选逻辑都要取反。
按键必须上拉。
PC5、PC6、PC7 不接上拉电阻会漂移,程序会误判按键。
蜂鸣器建议用有源蜂鸣器。
本程序只输出高低电平,不产生音频方波。验收报警功能用有源蜂鸣器最简单。