·基于51单片机的地下车库系统,利用AT89C51作为主控,LCD1602作为显示器件,超声波模块用于检测出口和入口的人员状况,判断车库内是否有人员在场,车库内有人时,灯光以最大亮度呈现,系统配备温湿度检测,可以实时显示温湿度值,光敏传感器检测环境光照,自动调整地下车库灯光亮度,一氧化碳传感器用于检测一氧化碳状况,当环境中一氧化碳浓度超标,系统自动打开风扇进行驱散。
一、硬件设计
1、超声波模块
超声波模块,利用超声波在空气中的传播速度进行距离的测算,一般流程是TRIG发射信号,ECHO检测信号,超声波发射的信号在遇到物体后会回弹,被ECHO捕捉到,只需要得到超声波的传播时间,结合声音在空气中的传播速度,即可得到距离值。
2、74HC595驱动LED灯
本次设计使用74HC595驱动LED灯,由于本次设计的IO口资源比较紧张,并且IO实现功能简单,使用74HC595驱动八个LED只需要3个IO口,完全满足本次设计要求。
3、ADC0808
ADC0808共有八个ADC输入口,采用并行输出的方式,另外还有三个控制引脚,START、EOC、OE三个引脚分别是开始、结束输出信号、输出允许位,同时可以利用ADD引脚选择ADC输入通道,如下图:
4、L298N
L298N一般用于驱动直流电机,该器件包含四个输出口,一般情况可以驱动两个直流电机,一般情况下 IN1、IN2、IN3、IN4等用于控制直流电机方向,可根据双全桥驱动电路的原理得出,同时ENA、ENB是是使能引脚,通过这两个EN引脚,利用PWM控制电机转速。
二、软件设计
1、超声波驱动代码
//初始化定时器
void init_time()
{
TMOD = 0x01; //选择定时器0工作 工作方式为方式1
TH0 = 0; //装初值0
TL0 = 0;
TF0 = 0; //中断溢出标志位
ET0 = 1; //开定时器中断
EA = 1; // 开总中断
}
//超声波1获取距离
int GetDistance1(void)
{
u16 distance,out_TH0,out_TL0;
/*超声波传感器的使用方法:
控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的,此时就为此次测距的时间,方可算出距离。如此不断的周期测, 就可以达到移动测量的值了*/
init_time(); //初始化定时器
flag = 0; //置溢出标志位为0
//控制口发一个10US 以上的高电平
TRIG1 = 1;
delay(2);
TRIG1 = 0;
//等待接收端出现高电平
while(!ECHO1);
TR0 = 1; //启动计时器 开始计时
while(ECHO1); //等待高电平结束
TR0 = 0; //关闭低电平
out_TH0 = TH0; //取定时器的值
out_TL0 = TL0;
out_TH0 <<= 8; //右移8位
distance = out_TH0 | out_TL0; //合并为16位的值
distance /= 58;
}
2、74HC595驱动代码
#include "Chip74HC595.h"
sbit SHCP = P1^3; //shift register
sbit DS = P1^4;
sbit STCP = P3^4; //storage register
//共阴极,依次显示0~9、9~0
unsigned char number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void hc595(unsigned char dat)
{
unsigned i;
SHCP = 1;
STCP = 1;
for(i=0;i<8;i++)
{
DS = dat >> 7;
dat <<= 1;
SHCP = 0;
_nop_(); //也可换成delay(1);
_nop_();
SHCP = 1;
}
STCP = 0;
_nop_();
_nop_();
STCP = 1;
}
3、ADC0808驱动代码
#include "ADC0808.h"
sbit OE = P1^0;
sbit EOC = P1^1;
sbit START = P1^2;
sbit ADDRA = P3^5;
#define Port P2
//ADC初始化
void ADC0808_Init()
{
START=0;
OE = 0;
}
//获取ADC值
unsigned int ADC0808_ReadData(unsigned char P)
{
unsigned char temp=0;
unsigned int dis=0;
if(P==0)ADDRA=0;
else if(P==1)ADDRA=1;
START=1;
START=0;
while(EOC == 0);
OE = 1;
temp=Port;
dis = temp;
OE = 0;
return dis;
}
三、功能演示
1、初始状态
程序运行,LCD显示一氧化碳浓度、温度值、光照强度、状态、模式情况,因为一氧化碳并未超标,所以风扇不进行转动。
2、通过光敏调整灯光亮度
调节光敏传感器的值,一般情况下,光照越强,亮起的灯光数量越少,光照越弱,亮起的灯光越少,如下图:
3、风扇驱散一氧化碳
调节一氧化碳传感器,让一氧化碳超过阈值,此时风扇开始转动,同时灯光全部亮起以示警戒。
4、检测到人员在车库内
检测有人员在车库内,将入口超声波低于20,此时检测到人员进入,此时灯光全部亮起,直到出口超声波检测到人员出去,此时延时一段时间,回到初始的自动调光模式。
四、项目总结
本次项目使用AT89C51作为系统主控,利用超声波检测出口和入口状态,判断是否有人员在车库中,同时集成了一氧化碳检测报警,自动调光,驱散一氧化碳等功能。
详细参考本人的bilibili,如下: