功能:
0.本项目采用STC89C52作为单片机系统的控制MCU
1.检测到有人且伸手,水龙头加热并出水5s
2.若无人时,有异物遮挡红外光电传感器也不出水
3.系统采用两路继电器分别控制加热设备和出水设备,这里采用的是功率电阻和5V小水泵模拟演示,更加真实具体的体现了整个工作流程。
4.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB :
主程序:
#include "reg52.h"
#include <intrins.h>
#include "delay.h"
#define uint unsigned int
#define uchar unsigned char
sbit RELAY_HEAT = P2^2;
sbit RELAY_WATER = P2^1;
sbit BODY_PIN = P2^0;
sbit HAND_PIN = P3^3;
void Timer0_Init(void); //定时器0初始化
bit waterFlag = 0; //出水标志
unsigned char waterDelay = 0;
unsigned char bodyDelay = 0;
/*----------------------------------------------------------------------------------
main()_程序入口
----------------------------------------------------------------------------------*/
void main(void)
{
Timer0_Init();
RELAY_WATER = 1; //关闭出水
RELAY_HEAT = 1; //关闭加热
while (1)
{
if (BODY_PIN == 0)
{
bodyDelay = 10; //有人
}
if (HAND_PIN == 0 && bodyDelay != 0) //有人且伸手
{
DelayMs(20); //延时再次确认
if (HAND_PIN == 0)
{
waterFlag = 1; //出水
waterDelay = 10;
}
}
if (waterFlag == 1 && waterDelay != 0) //出热水
{
RELAY_WATER = 0; // 打开出水
RELAY_HEAT = 0; // 打开加热
}
else
{
RELAY_WATER = 1; // 关闭出水
RELAY_HEAT = 1; // 关闭加热
}
}
}
/************************* 定时器0初始化 *************************/
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536 - 9216) / 256; //重新赋值 10ms
TL0 = (65536 - 9216) % 256;
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器计数打开
// PT0 = 1; //高优先级
}
/************************* 定时器0中断处理 *************************/
void Timer0_Interrupt(void) interrupt 1
{
static unsigned int time10ms = 0;
TH0 = (65536 - 9216) / 256; //重新赋值 10ms
TL0 = (65536 - 9216) % 256;
time10ms++;
if (time10ms > 50)
{
if (bodyDelay > 0) //人体检测倒计时
{
bodyDelay--;
}
if (waterDelay > 0) //出水倒计时
{
waterDelay--;
}
else
{
waterFlag = 0;
}
time10ms = 0;
}
}