使用 STC89C52 / AT89C52 + 红外人体感应 + SG90 舵机,非常适合课程设计 / 毕业设计 / 智能家居 DIY。
一、系统功能说明
人体靠近 → 自动开盖
延时 3~5 秒 → 自动关盖
支持手动按键开盖
低功耗待机(可扩展)
二、硬件连接(标准接法)
| 模块 | 51 单片机 |
|---|---|
| 红外人体感应 HC-SR501 | P3.2(INT0) |
| 按键 | P3.3 |
| 舵机 SG90 | P1.0 |
| 蜂鸣器(可选) | P1.1 |
| LED 指示灯 | P1.2 |
三、核心工作原理
- HC‑SR501:检测到人体 → 输出高电平
- 定时器0:产生 20ms 舵机 PWM
- 角度控制 :
- 0° → 0.5ms
- 90° → 1.5ms
- 180° → 2.5ms
四、源程序(Keil C )
main.c(可直接编译)
c
#include <reg52.h>
typedef unsigned char uchar;
typedef unsigned int uint;
sbit SERVO = P1^0; // 舵机信号
sbit IR = P3^2; // 红外人体
sbit KEY = P3^3; // 手动按键
sbit LED = P1^2; // 指示灯
uchar count = 0;
uchar angle = 0; // 舵机角度控制
bit open_flag = 0;
/* 延时 ms */
void DelayMs(uint ms)
{
uint i, j;
for(i = ms; i > 0; i--)
for(j = 110; j > 0; j--);
}
/* 定时器0初始化(20ms PWM) */
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0xB8; // 20ms
TL0 = 0x00;
ET0 = 1;
EA = 1;
TR0 = 1;
}
/* 舵机角度设置(0~180) */
void Servo_SetAngle(uchar ang)
{
angle = ang;
}
/* 开盖 */
void Trash_Open(void)
{
Servo_SetAngle(180);
LED = 1;
}
/* 关盖 */
void Trash_Close(void)
{
Servo_SetAngle(0);
LED = 0;
}
/* 定时器中断 */
void Timer0_ISR(void) interrupt 1
{
TH0 = 0xB8;
TL0 = 0x00;
count++;
if(count >= 40) count = 0;
if(count < angle / 9 + 5)
SERVO = 1;
else
SERVO = 0;
}
/* 主函数 */
void main(void)
{
Timer0_Init();
Trash_Close();
while(1)
{
if(IR == 1 || KEY == 0) // 红外或按键触发
{
Trash_Open();
DelayMs(3000); // 开盖延时
Trash_Close();
}
}
}
五、HC‑SR501 红外模块设置
| 跳线 | 设置 |
|---|---|
| 触发方式 | 单次触发 |
| 延时 | 最小 |
| 灵敏度 | 中档 |
参考代码 基于51单片机的红外智能垃圾桶源程序和原理图 www.youwenfan.com/contentcst/182092.html
六、舵机角度对照表
| 角度 | 高电平时间 | 占空比 |
|---|---|---|
| 0° | 0.5 ms | 2.5% |
| 90° | 1.5 ms | 7.5% |
| 180° | 2.5 ms | 12.5% |
七、常见问题排查
| 问题 | 原因 |
|---|---|
| 舵机不转 | 电源功率不足 |
| 一直开盖 | 红外感应太灵敏 |
| 垃圾桶抖动 | 舵机供电不稳 |
| 误触发 | 环境热风干扰 |
建议:舵机单独供电,GND 与 51 共地