首页 > 其他分享 >15【Proteus仿真】基于51单片机的智能车位锁系统(电流检测、电压检测、红外检测、灯光报警)

15【Proteus仿真】基于51单片机的智能车位锁系统(电流检测、电压检测、红外检测、灯光报警)

时间:2024-09-20 11:54:39浏览次数:3  
标签:15 检测 void 51 motor1 LCD sbit CLK1 nop

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

基于STC89C51单片机,具有复位电路和晶振电路;
1.按下升起的按键后,然后用GP2D12红外传感器判断车辆是否在位,若不在位,升降杆高度为0,L298N驱动电机顺时针运转,升降杆起升,高度慢慢提高;假设提高到10,电机停止;高度通过LCD1602显示屏显示;
2.按下下降的按键后,用GP2D12红外传感器判断车辆是否在位,若不在位,还得判断高度,高度为10的话,L298N驱动电机逆时针转动,升降杆下降,检测高度为0,电机停止;5S后再判断GP2D12红外传感器判断车辆是否在位,若不在位,L298N驱动电机顺时针转动,升杆,升到最高处停止;高度通过LCD1602显示屏显示;
3.滑动变阻器连接ADC0832数模转换器,体现电流,电流过大,电机停止,蜂鸣器报警,灯光亮起,5S后没有任何信号,全部不显示;滑动变阻器连接ADC0832数模转换器,体现电压,若电压过低,则蜂鸣器发出警告,但不影响其他工作;电流和电压通过LCD1602显示屏显示;
在这此中,将电压和电流测量加入外部中断,周期每隔50ms检测,1S内检测20次,保证随时生效;

仿真图 :

编辑

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

单片机STC895C1
电机是L298N驱动器,驱动直流电机
红外传感器:GP2D12型号
数模转换器:ADC0832
显示屏:LCD1602显示屏

全部资源包括:

编辑

三、程序编程

/*全部代码看页尾*/

#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned  int
typedef unsigned char u8;
typedef unsigned int  u16;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit CS  = P1^0;        //红外传感器
sbit CLK = P1^1;
sbit DIO = P1^2;
sbit CS1  = P3^5;        //电流
sbit CLK1 = P3^6;
sbit DIO1 = P3^7;
sbit CS2  = P3^2;        //电压
sbit CLK2 = P3^3;
sbit DIO2 = P3^4;
sbit motor1_EN  = P1^7;
sbit motor1_IN1 = P1^5;
sbit motor1_IN2 = P1^6;
sbit key1 = P1^3;
sbit key2 = P1^4;
sbit LED  = P2^4;
sbit BEEP = P2^3;

/*变量定义*/
static int flag = 0 , flag2 = 0,flag3 = 0;
int gaodu= 0;					
static 	char u,DL,DY;
unsigned char count;

/*函数定义*/
void anjianpd();//按键函数定义
void MOTORRIGHT_MOVE();
void MOTORLEFT_MOVE();
void MOTOR_STOP();
void gdpdss();
void gdpdxj();
void dianpd();
void dianpd1();
void pdsq();

uchar get\_AD\_Res()          //ADC0832启动读取红外的值
{
	uchar i, data1=0, data2=0;
	CS=0;
	
	CLK=0;DIO=1;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	CLK=1;\_nop\_();
	
	CLK=0;DIO=0;\_nop\_();
	CLK=1;\_nop\_();
	
	CLK=0;DIO=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO<<i;
		CLK=1;\_nop\_();
		CLK=0;\_nop\_();
	}
	CS=1;
	
	return(data1 == data2)?data1:0;
}

uchar get\_AD\_Res1()          //ADC0832启动读取电流值
{
	uchar i, data1=0, data2=0;
	CS1=0;
	
	CLK1=0;DIO1=1;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=0;\_nop\_();
	CLK1=1;\_nop\_();
	
	CLK1=0;DIO1=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO1; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO1<<i;
		CLK1=1;\_nop\_();
		CLK1=0;\_nop\_();
	}
	CS1=1;
	
	return(data1 == data2)?data1:0;
}

uchar get\_AD\_Res2()          //ADC0832启动读取电压值
{
	uchar i, data1=0, data2=0;
	CS2=0;
	
	CLK2=0;DIO2=1;\_nop\_();
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=1;\_nop\_(); 
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=0;\_nop\_();
	CLK2=1;\_nop\_();
	
	CLK2=0;DIO2=1;\_nop\_(); 
	
	for(i=0; i<8; i++)
	{
		CLK2=1;\_nop\_();
		CLK2=0;\_nop\_();
		data1=(data1<<1)|(uchar)DIO2; 
	}
	
	for(i=0; i<8; i++)
	{
		data2=data2|(uchar)DIO2<<i;
		CLK2=1;\_nop\_();
		CLK2=0;\_nop\_();
	}
	CS2=1;
	
	return(data1 == data2)?data1:0;
}

void Time1Init()
{
	TMOD |= 0x10;
	TH1   = (65536-57567)/256;
	TL1   = (65536-57567)%256;
	EA    = 1;
	ET1   = 1;
	TR1   = 1;
}

void Time1Start() interrupt 3
{
    static	u16 count = 0;      //定义计数变量
	TH1   = (65536-57567)/256;
	TL1   = (65536-57567)%256;
	count++;
	if(count == 10)//达到1s
	{
		count = 0; 
	    dianpd();              //电流电压检测
		u=get\_AD\_Res();	
	
		if(flag2 == 1)
		{
		 dianpd1();
		}

		if(flag3 == 1)
		{
		  pdsq();
		}

	}
}

void main()					  //主函数
{	
	Time1Init();        //定时器1初始化
	LCD_Init();         //显示屏初始化
	LCD_ShowString(1,1,"HIGH:");
	LCD_ShowString(2,1,"DL:");
	LCD_ShowString(2,10,"DY:");

	while(1)
	{
	    if(flag == 0)
		{
	    anjianpd();         //按键判断
		}
	}
	
}

void anjianpd()
{
 if(key1 == 0)	   //升起按键
 {
  Delay(150);
  if(key1 == 0)
  {
   	u=get\_AD\_Res();	   //判断车位是否在位
	if(u <= 100 && gaodu == 0)	   //车辆不在位并且高度为0
	{
	  MOTORRIGHT_MOVE(); //顺时针转动
	  gdpdss(); //高度上升
	  if(gaodu>=10)
	  {
	   MOTOR_STOP();  //电机停止
	  }
	}
  }
 }

 if(key2 == 0)	 //下降按键
 {
  Delay(150);
  if(key2 == 0)
  {
    u=get\_AD\_Res();
   	if(u <= 100 && gaodu == 10)	   //车辆不在位并且高度为0
	{
	  MOTORLEFT_MOVE(); //逆时针转动
	  gdpdxj(); //高度判断下降
	  if(gaodu==0)
	  {
	   MOTOR_STOP();  //电机停止
	   Delay(5000);  //延时
	   flag3 = 1; 
	  }
	}
  }
 }
}

void gdpdss()
{
 while(gaodu<=9)
 {
  ++gaodu;
  LCD_ShowNum(1,6,gaodu,3);
  Delay(500);
 }
}

void gdpdxj()
{
  while(gaodu > 0)
  {
  --gaodu;
  LCD_ShowNum(1,6,gaodu,3);
  Delay(500);
  }
}
void MOTORRIGHT_MOVE()	  //顺时针转动
{
   	  motor1_EN = 1;
	  motor1_IN1 = 1;
	  motor1_IN2 = 0;
}

void MOTORLEFT_MOVE()	  //逆时针转动
{
   	  motor1_EN = 1;
	  motor1_IN1 = 0;
	  motor1_IN2 = 1;
}

void MOTOR_STOP()	    //停止转动
{
   	  motor1_EN = 0;
	  motor1_IN1 = 0;
	  motor1_IN2 = 0;
}

void dianpd() //电流电压检测
{
  	    DL = get\_AD\_Res1();	//读取电流
		DY = get\_AD\_Res2(); //读取电压
		LCD_ShowNum(2,4,DL,3);
		LCD_ShowNum(2,14,DY,3);
		

		if(DL > 80)  //电流过大
		{
		  MOTOR_STOP(); //所有电机停止
		  BEEP = 1   ;  //蜂鸣器报警
		  LED  = 1   ;  //LED灯亮起
		  Delay(5000);  //延时
		  flag2 = 1;
		}
		else 
		{
		  BEEP = 0   ; 
		  LED  = 0   ;  
		}

		if(DY < 50 ) //电压过低
		{
		  BEEP = 1   ;  //蜂鸣器报价
		  LED  = 1   ;  //LED灯亮起
		}
		else 
		{
		 BEEP = 0   ;  
		 LED  = 0  ;   
		}
}

void dianpd1()
{
        DL = get\_AD\_Res1();	//读取电流
	   	LCD_ShowNum(2,4,DL,3);
 	    if(DL>80)
		  {
		  EA = 0;
		  BEEP = 0   ;  
		  LED  = 0   ;  
		  LCD_ShowString(1,1,"                "); //清屏
		  LCD_ShowString(2,1,"                "); //清屏
		  flag = 1;
		  }
		  else 
		  {
		   flag2 = 0;
		  }
}

void pdsq()
{
    if(u <= 100)   //如果车辆不在位
	  {
	    MOTORRIGHT_MOVE(); //顺时针转动
	    gdpdss(); //高度上升
	    if(gaodu>=10)
	    {
	     MOTOR_STOP();  //电机停止
	    }
	  }
}

四、实现现象

具体动态效果看B站演示视频:

基于51单片机的智能车位锁系统_哔哩哔哩_bilibili

全部资料(源程序、仿真文件、安装包、演示视频):

链接:https://pan.baidu.com/s/1X7RqBHxeeJ00zkdAV_Ysdw 
提取码:diw9 
–来自百度网盘超级会员V4的分享

标签:15,检测,void,51,motor1,LCD,sbit,CLK1,nop
From: https://blog.csdn.net/szq0419/article/details/142380544

相关文章

  • CF1526F Median Queries 题解
    Description本题是一道交互题。给定\(n\),你需要猜测一个长度为\(n\)的排列\(p\)(即\(p\)包含所有\(1\)到\(n\)的整数各一次)。已知\(p\)满足\(p_1<p_2\)。当然,你可以进行询问,每次询问你需要给定三个互不相同的整数\(a,b,c\),交互器会返回\(|p_a-p_b|,|p_b-p_c|,|p_......
  • 中国信通院携手合合信息发布《文本图像篡改检测系统技术要求》
    Deepfake(深度伪造)技术野蛮生长,引发了一系列负面后果。在韩国通讯软件Telegram上,某私密聊天室成员利用女性照片非法合成色情照片和视频,影响极为恶劣。除了普通的受害者,知名人士也难以逃脱图像伪造的“魔爪”,某视频网站上,由AI合成的马斯克等名人为虚假投资做背书的视频泛滥成灾。不......
  • 51c视觉~YOLO~合集1
    1、Yolo8(一)YOLOv8和OpenCV实现货架上的物体计数们将根据检测到的物体的坐标数据获得的见解确定货架的数量以及货架上的物体数量。    我们使用SKU110K数据集来构建我的目标检测模型。此数据集包含商店货架上对象的边界框注释,并且由一个名为“object”的类组成。    由于......
  • 安全帽识别算法、安全帽智能识别、不戴安全帽检测算法
    不戴安全帽检测算法是一种基于人工智能技术,用于实时监测和提醒工作人员是否正确佩戴安全帽的系统。以下是对不戴安全帽检测算法的详细介绍:1.技术原理 -数据采集与预处理:通过安装在施工现场或工厂车间等场所的摄像头收集图像数据,并进行必要的预处理,如去噪、图像增强等,以提高......
  • 【目标检测数据集】小车表面缺陷破损检测数据集3135张8类标签VOC+YOLO格式(裂纹掉漆划
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):3135标注数量(xml文件个数):3135标注数量(txt文件个数):3135标注类别数:8标注类别名称:["crack","dent1","dent2","dislocation"......
  • 网络安全C10-2024.9.15-Nmap、Xray、Nessus和AWVS使用扫描
    1、安装并使用Nmap扫描一个地址(本机、VPS、虚拟机环境都可以),提供扫描结果截图nmap下载安装:https://nmap.org/download#windowsnmap概述:Nmap(“NetworkMapper<网络映射器>”)是一款开放源代码的网络探测和安全审核的工具。Nmap输出的是扫描目标的列表,以及每个目标的补充信息,......
  • Day51.后端框架初认及补充
    1.后端框架初认及补充_flask框架初识启动框2.后端框架初认及补充_flask框架的路由格式,请求方式,返回格式3.后端框架初认及补充_form表单使用name标签可以获取用户输入的内容4.后端框架初认及补充_form表单get请求会将用户的输入拼接在url后,且密码的密文变成明文形式5.后端框架初......
  • 51c视觉~合集30
    #SaRA修改一行代码就能实现高效微调!上海交大&腾讯开源:兼顾原始生成和下游任务仅修改一行训练代码即可实现微调过程。文章链接:https://arxiv.org/pdf/2409.06633项目链接:https://sjtuplayer.github.io/projects/SaRA/1.引言SaRA是一种针对预训练扩散模型的高效微调方法。通过微调预......
  • P2051 [AHOI2009] 中国象棋 题解
    DP好题?首先确定,每一行/列只能放至多两个棋子,这么少,所以我们的状态肯定和棋子数有关。由于我们不关注具体的方案数,所以我们不妨只关心对应棋子数量的行/列的数量。同时,由于考虑行和列都是一样的,所以我们不妨用行递推。所以我们设$\dp_{i,j,k}\$表示当前放到第\(i\)行,有\(......
  • Halcon特征检测Region部分笔记
     Region'area':     面积'row':      中心的行坐标'column':   中心的列坐标'width':    区域的宽度(平行于坐标轴)'height':   区域的高度(平行于坐标轴)'row1':     左上角的行坐标'column1':  左上角的列坐标'row2':     ......