基于51单片机的地下车库系统(Proteus仿真)

        ·基于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,如下:

基于51单片机的地下车库管理系统(proteus仿真)_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值