本次果题设计采用人发出的声音控制信号,即可方便及 时地打开和关闭声控照明装置,并有防误触发而具有的自动延时关闭功能,并设 有手动开关,使其应用更加方便。 主要设计内容如下: ①设计系统总体方案。 ②设计声控电路。 ③设计光控电路。 ④设计延时电路。 指标: ①声音响度必须在20dB以上才能响应; ②利用光敏电阻对光照环境信号进行采集与处理; ③延迟时间大于5秒; ④光控优先级大于声控; ⑤电路能通过计算机仿真并实现相应的功能。
时间: 2025-08-03 10:02:22 浏览: 4
<think>我们面对的是一个完整的单片机系统设计问题,需要从硬件原理图设计到软件编程实现。用户要求实现声光双控延迟照明装置,具体指标包括:1.声控:响应20dB以上声音(在Proteus中可用信号发生器或按钮模拟)2.光控:光敏电阻采集光照(暗时触发)3.延时:大于5秒的延迟时间4.控制逻辑:光控优先级高于声控(即光线强时不响应声音,只有在光线暗且检测到声音时触发)我们使用AT89C51单片机,在Keil中编写C语言代码,在Proteus中绘制原理图并仿真。方案概述:1.硬件部分(Proteus原理图):-单片机:AT89C51-声音检测:使用麦克风传感器(Proteus中可用模拟信号源或按钮,通过比较器输出高低电平)-光照检测:光敏电阻与电阻分压,通过比较器输出高低电平(暗时为低电平)-执行器:继电器控制照明灯(或LED模拟)-指示灯:一个LED指示继电器状态(照明灯亮时亮)2.软件部分(Keil代码):-初始化:设置定时器(用于延时),设置输入输出口-主循环:检测两个传感器(光敏和声音)的状态-逻辑:当且仅当光敏传感器指示暗(低电平)且声音传感器检测到声音(高电平)时,触发继电器并启动定时器-定时器中断:计时达到延时时间(大于5秒)后关闭继电器3.特殊要求:光控优先级高于声控(在硬件电路中,当光线强时,光敏传感器输出高电平,程序会忽略声音信号)具体实现:一、Proteus原理图设计:1.单片机最小系统:AT89C51、晶振(12MHz)、复位电路(10uF电容+10K电阻)2.光敏电阻电路:-光敏电阻(LDR)和一个固定电阻(如10K)串联接在VCC和GND之间,中间抽头接到比较器的正相输入端(例如LM393)-比较器的反相输入端接一个可调电阻(设置阈值),比较器输出接单片机的P3.3(低电平代表光线暗)3.声音检测电路:-使用麦克风传感器(在Proteus中可以用一个按钮来模拟,或者使用信号源通过整流滤波后接比较器)-比较器输出接单片机的P3.2(高电平代表检测到声音)4.输出控制:-单片机的P1.0接一个三极管(如2N2222)的基极,三极管驱动继电器线圈-继电器线圈两端并联续流二极管-继电器的常开触点接照明灯(或LED串)5.状态指示灯:单片机的P1.1接一个LED(串联限流电阻)到地。二、Keil代码设计:1.定义引脚:-sbitLightSensor=P3^3;//光敏传感器输入(低电平表示光线暗)-sbitSoundSensor=P3^2;//声音传感器输入(高电平表示有声音)-sbitRelay=P1^0;//继电器控制-sbitLED=P1^1;//状态指示2.定时器初始化:定时器0工作在模式1(16位定时器),12MHz晶振下,50ms中断一次。3.全局变量:用于计数延时时间(50ms中断一次,100次中断即5秒,但用户要求大于5秒,可以设置120次即6秒)。4.主循环:不断检测传感器状态,当满足条件(光暗且有声音)时,启动继电器,同时开启定时器。5.中断服务函数:每次中断计数加1,当达到预设值时关闭继电器和指示灯,并停止定时器。三、控制逻辑细节:-光敏传感器:光线暗时输出低电平(因为比较器在光敏电阻分压低于阈值时输出低电平)-声音传感器:检测到声音(超过20dB)时输出高电平(通过比较器将声音信号转换成高电平脉冲)-由于光控优先级高于声控,所以只有在光线暗的时候才可能触发。光线强(LightSensor为高电平)时,即使有声音也不触发。代码修改说明:原引用代码已经基本满足要求,但需要根据实际连接修改引脚,并调整延时时间。我们将原代码修改如下:1.将声音传感器改为P3.2(INT0引脚,也可以用作普通IO),光敏传感器改为P3.3(INT1)2.定时器中断中,延时次数设定为120(120次×50ms=6秒,大于5秒)3.在主循环中,我们只检测两个条件同时满足时触发,并启动定时器(但要注意,在定时器运行过程中,不应重复触发,所以需要加入继电器状态判断?)4.但原程序有一个问题:在延时期间,如果再次触发,会重置delay_count=0,从而重新开始计时。这可能导致灯一直亮(只要在亮灯期间不断有声音)。根据一般需求,我们希望每次触发都能重新开始计时(即延时时间从最后一次触发开始算起)。所以,我们修改逻辑:在定时器中断中,我们只在继电器开启状态下才计数,并且每次触发时(即使灯已经亮了)也会重置计数为0并重新计时(即重新从0开始计数)。这样,只要在灯亮期间有声音,灯就会继续亮6秒。但这里要注意:如果用户要求只在第一次触发时计时,后续触发不重新计时,则不能重置。根据声控灯的实际应用,通常是在亮灯期间再次检测到声音则重新计时。所以这里采用重置计数的逻辑。因此,在主循环中,只要检测到光线暗和有声音,就执行:Relay=1;LED=1;delay_count=0;//重置计数TR0=1;//启动定时器(如果已经启动,重新启动没关系,但这里我们每次重置计数,所以即使计时器在运行,也会重新开始计时)但是,这样会导致在灯亮期间,即使定时器正在运行,也会被重置delay_count=0,然后从0开始重新计时。所以,程序如下:</think>
### AT89C51声光双控照明装置设计方案
#### 一、系统方案
本设计采用AT89C51单片机为核心控制器,实现声光双控延迟照明系统。系统框架如下:
```
$$ \text{传感器层} \xrightarrow{\text{信号采集}} \text{单片机控制层} \xrightarrow{\text{驱动执行}} \text{照明层} $$
```
#### 二、硬件原理设计(Proteus 8)
1. **主控电路**:
- AT89C51单片机
- 12MHz晶振
- 10μF电解电容 + 10kΩ电阻复位电路
2. **声控电路**:
```mermaid
graph LR
A[麦克风] --> B[LM358放大电路]
B --> C[LM393比较器]
C --> D[AT89C51 P3.2]
```
- 参数计算:
$$ V_{ref} = \frac{R_2}{R_1 + R_2} \times V_{cc} $$
20dB声音对应约100mV峰峰值,通过放大电路实现≥2.5V触发电压
3. **光控电路**:
- 光敏电阻GL5528与10kΩ电阻分压
```proteus
Vcc ──┰── LDR ────┬── P3.3
└── 10k ───┴── GND
```
- 光照阈值:环境光强>100lux时输出高电平
4. **驱动电路**:
- 继电器控制接口:P1.0 → 2N2222 → 5V继电器线圈
- LED状态指示:P1.1 → 220Ω → LED
#### 三、软件设计(Keil UVision5)
```c
#include <reg51.h>
// 引脚定义
#define SOUND_SENSOR P3_2 // 声控输入
#define LIGHT_SENSOR P3_3 // 光控输入
#define RELAY_PIN P1_0 // 继电器控制
#define LED_PIN P1_1 // 状态指示灯
// 全局变量
unsigned int delay_count = 0;
// 定时器0初始化
void Timer0_Init() {
TMOD |= 0x01; // 模式1
TH0 = 0x3C; // 50ms定时初值(12MHz)
TL0 = 0xB0;
ET0 = 1; // 定时器0中断允许
EA = 1; // 总中断允许
}
// 主函数
void main() {
Timer0_Init();
RELAY_PIN = 0; // 初始关闭继电器
LED_PIN = 0; // 初始关闭指示灯
while(1) {
// 光控优先:光线不足且声音触发
if(!LIGHT_SENSOR && SOUND_SENSOR) {
RELAY_PIN = 1; // 开启继电器
LED_PIN = 1; // 开启指示灯
delay_count = 0; // 延时计数复位
TR0 = 1; // 启动定时器
}
}
}
// 定时器0中断服务
void Timer0_ISR() interrupt 1 {
TH0 = 0x3C; // 重装初值
TL0 = 0xB0;
if(RELAY_PIN) {
delay_count++;
// 延时6秒(120×50ms=6000ms)
if(delay_count >= 120) {
RELAY_PIN = 0; // 关闭继电器
LED_PIN = 0; // 关闭指示灯
TR0 = 0; // 停止定时器
}
}
}
```
#### 四、关键指标实现
1. **声控响应**:
- LM358两级放大增益设置:
$$ A_v = 1 + \frac{R_f}{R_i} \geq 100 $$
- Proteus测试:信号发生器输入100mV/1kHz正弦波可触发
2. **光控优先**:
- 硬件实现:光敏电阻分压电路
- 软件逻辑:`if(!LIGHT_SENSOR && SOUND_SENSOR)`
3. **延时控制**:
- 时基计算:
$$ T = \frac{(65536 - 15536) \times 12}{12 \times 10^6} = 0.05s $$
- 延时时间:120 × 50ms = 6s(>5s)
#### 五、Proteus仿真步骤
1. 创建原理图:
- AT89C51 + 声/光传感器模块 + 继电器模块
2. 加载程序:
```mermaid
graph TB
A[Keil编译HEX文件] --> B[Proteus MCU属性]
B --> C[设置晶振12MHz]
C --> D[启动仿真]
```
3. 测试场景:
- 光强<100lux + 声压>20dB → 亮灯6秒
- 光强>100lux + 声压>20dB → 无响应
#### 六、性能优化建议
1. 功耗优化:
- 空闲模式启用:`PCON |= 0x01;`
- 中断唤醒:设置IE寄存器相应位
2. 抗干扰设计:
- 声音信号添加RC滤波($f_c = \frac{1}{2\pi RC} \approx 1kHz$)
- 光敏信号添加电容滤波
阅读全文
相关推荐




















