21 基于51单片机的隧道车辆检测系统

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

以AT89C51单片机为控制核心,实现对隧道环境的监测。采用模块化设计,
共分以下几个功能模块:
单片机最小系统模块、电源模块、气体传感模块、和显示模块等。
通过按键增加隧道内车辆数,滑动变阻器模仿隧道内车速;
通过温湿度传感器检测温湿度,通过MQ-135检测有害气体浓度,
最后通过显示屏显示车辆数、车速、温湿度、气体浓度,
当超过阈值时报警,另外,还设有超声波液位计,当隧道积水过高时发出警报。

二、硬件资源

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

编辑

三、程序编程

#include <REGX52.H>#include<intrins.h>#include<stdio.h>#include "Delay.h"#include "LCD1602.h"#define uchar unsigned char#define uint unsigned  intsbit CS=P1^0;                 //adc0832引脚sbit CLK=P1^1;
sbit DIO=P1^2;
sbit CS1=P1^3;                 //adc0832引脚sbit CLK1=P1^4;
sbit DIO1=P1^5;
sbit CS2=P1^6;                 //adc0832引脚sbit CLK2=P1^7;
sbit DIO2=P3^7;
sbit beep=P3^4;
sbit key1=P3^6;
sbit key2=P3^5;
sbit Temp\_data=P2^6;  //DHT11unsigned char rec\_dat\_lcd0\[6\];unsigned char rec\_dat\_lcd1\[6\];unsigned char rec\_dat\_lcd2\[6\];unsigned char rec\_dat\_lcd3\[6\];unsigned int rec\_dat\[4\];static uchar u,U,R ,u1,U1,R1,u2,U2,R2;      //定义变量static uchar wd,sd;static int carnumber = 0;static int wdyz=37,sdyz=80,ndyz=100,ywyz=80,csyz=120;void DHT11\_delay\_us(unsigned char n);void DHT11\_delay\_ms(unsigned int z);void DHT11\_start();unsigned char DHT11\_rec\_byte();void DHT11\_receive();void beep\_warning();void cshq();void xxpxs();void ajjc();//延时msvoid DHT11\_delay_ms(unsigned int z){    unsigned int i,j;    for(i=z; i>0; i--)        for(j=110; j>0; j--);
}//延时us   --2*n+5usvoid DHT11\_delay\_us(unsigned char n){    while(--n);
}//DHT11起始信号void DHT11_start(){Temp\_data=1;    DHT11\_delay_us(10);Temp\_data=0;    DHT11\_delay_ms(50);//这个延时不能过短,18ms以上,实际在仿真当中要想读到数据延时要在延时参数要在40以上才能出数据Temp\_data=1;    DHT11\_delay\_us(30);//这个延时不能过短}//接收一个字节unsigned char DHT11\_rec_byte(){    unsigned char i,dat=0;    for(i=0; i<8; i++){        while(!Temp\_data);        DHT11\_delay_us(8);dat <<=1;        if(Temp_data==1){dat +=1;}        while(Temp_data);}    return dat;
}//接收温湿度数据void DHT11\_receive(){    unsigned int R\_H,R\_L,T\_H,T\_L;    unsigned char RH,RL,TH,TL,revise;    DHT11\_start();Temp\_data=1;    if(Temp\_data==0){        while(Temp_data==0);   //等待拉高DHT11\_delay\_us(40);  //拉高后延时80usR\_H=DHT11\_rec_byte();    //接收湿度高八位R\_L=DHT11\_rec_byte();    //接收湿度低八位T\_H=DHT11\_rec_byte();    //接收温度高八位T\_L=DHT11\_rec_byte();    //接收温度低八位revise=DHT11\_rec\_byte(); //接收校正位DHT11\_delay\_us(25);    //结束if((R\_H+R\_L+T\_H+T\_L)==revise)      //校正{RH=R_H;RL=R_L;TH=T_H;TL=T_L;}        /*数据处理,方便显示*/rec_dat\[0\]=RH;rec_dat\[1\]=RL;rec_dat\[2\]=TH;rec_dat\[3\]=TL;}}void dht11(){	      DHT11\_delay\_ms(150);        DHT11\_receive();	      sprintf(rec\_dat\_lcd0,"%d",rec\_dat\[0\]);        sprintf(rec\_dat\_lcd1,"%d",rec\_dat\[1\]);        sprintf(rec\_dat\_lcd2,"%d",rec\_dat\[2\]);        sprintf(rec\_dat\_lcd3,"%d",rec\_dat\[3\]);        DHT11\_delay_ms(100);wd = rec\_dat\[3\]*10 + rec\_dat\[2\];sd = rec\_dat\[1\]*10 + rec\_dat\[0\];}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 beep_warning()//蜂鸣器警报并且电机转动{	if(wd>wdyz){beep = 1;}		if(sd>sdyz){beep = 1;}  if(R>ndyz){beep = 1;}		if(R1>csyz){beep = 1;}	if(R2>ywyz){beep = 1;}	if(wd<=wdyz && sd<=sdyz && R<=ndyz && R1<=csyz && R2 <ywyz )	{beep = 0;}
}void main()					  //主函数{	LCD_Init();         //显示屏初始化beep = 0;	do{		cshq();  //参数获取dht11(); //温湿度获取ajjc();   //按键检测xxpxs();  //显示屏显示beep_warning();    //状态判断}  while(1);
}void ajjc()  //按键检测{	if(!key1){carnumber++;		while(!key1);}	if(!key2){carnumber--;		while(!key2);}}void xxpxs()  //显示屏显示{	LCD_ShowNum(1,1,R,3); //浓度LCD_ShowNum(1,5,R1,3);//速度LCD_ShowNum(1,9,R2,3);//液位高LCD_ShowNum(2,10,carnumber,3);//车辆数量//湿度LCD\_ShowString(2,5,rec\_dat_lcd0);  //湿度低位LCD\_ShowString(2,4,rec\_dat_lcd1);   //湿度高位//温度LCD\_ShowString(2,1,rec\_dat_lcd2); //温度低位LCD\_ShowString(2,0,rec\_dat_lcd3); //温度高位}void cshq()  //参数获取{u=get\_AD\_Res();U=(250*u)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定R=200*U/250;	   //MQ的值u1=get\_AD\_Res1();U1=(250*u1)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定R1=200*U1/250;	   //速度的值u2=get\_AD\_Res2();U2=(250*u2)/128;     //此处将数字信号转化为模拟信号,要根据上拉电阻阻值来确定R2=200*U2/250;	   //液位的值}

四、实现现象

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

基于51单片机的隧道车辆检测系统_哔哩哔哩_bilibili

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

通过百度网盘分享的文件:基于51单片机的隧道车辆检测系统(1).zip
链接:https://pan.baidu.com/s/1v-txRoEeNFIS8az5a0_P9A?pwd=c3p7 
提取码:c3p7 
–来自百度网盘超级会员V4的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147784.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在电脑中增加一个新盘

找到此电脑右击找到管理点进去 找到磁盘管理点进去 找到D盘&#xff0c;点击D盘然后右击找到压缩卷点击&#xff0c;之后按照自己的意愿分盘容量 然后就一直点下一页 返回去就能看到新加卷F盘了 在此电脑中也可以查看 完成

ToB项目身份认证(一):基于目录的用户管理、LDAP和Active Directory简述

在ToB的项目里&#xff0c;公司部门之间是树状的关系&#xff0c;成员结构也类似。由于windows的使用范围很广&#xff0c;尤其是在企业里&#xff0c;所以它集成的Active Directory域服务往往企业应用需要兼容的。 什么是基于目录的用户管理&#xff1f; 基于目录的用户管理…

双十一快来了!什么值得买?分享五款高品质好物~

双十一大促再次拉开帷幕&#xff0c;面对众多优惠是否感到选择困难&#xff1f;为此&#xff0c;我们精心筛选了一系列适合数字生活的好物&#xff0c;旨在帮助每一位朋友都能轻松找到心仪之选。这份推荐清单&#xff0c;不仅实用而且性价比高&#xff0c;是您双十一购物的不二…

cc2530使用(SmartRF Flash Programmer)烧录hex固件

1图标 2IAR生成HEX文件 2-1勾选他 2-2生成对应的文件&#xff08;勾选他并改后缀&#xff09; &#xff08;选择他&#xff09; 点击OK即可 3&#xff08;选择文件&#xff0c;插入板子&#xff08;会显示对应的板子&#xff09;&#xff0c;烧录即可&#xff09;

LeetcodeTop100 刷题总结(二)

LeetCode 热题 100&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 文章目录 八、二叉树94. 二叉树的中序遍历&#xff08;递归与非递归&#xff09;补充&#xff1a;144. 二叉树的前序遍历&#xff08;递归与非递归&#xff09;补充&#xff1a;145. 二叉树的后序遍…

注册商标的有关流程

注册商标的有关流程 在商业活动中&#xff0c;商标作为企业品牌的重要组成部分&#xff0c;不仅代表着企业的形象和信誉&#xff0c;更是企业资产的重要部分。因此&#xff0c;了解并遵循注册商标的流程&#xff0c;对于保护企业的合法权益至关重要。 一、确定商标注册范围并进…

大模型学习方向不知道的,看完这篇学习思路好清晰!!

入门大模型并没有想象中复杂&#xff0c;尤其对于普通程序员&#xff0c;建议采用从外到内的学习路径。下面我们通过几个步骤来探索如何系统学习大模型&#xff1a; 1️⃣初步理解应用场景与人才需求 大模型的核心应用涵盖了智能体&#xff08;AI Agent&#xff09;、微调&…

【TPAMI 2024】告别误差,OPAL算法如何让光场视差估计变得轻而易举?

题目&#xff1a;OPAL: Occlusion Pattern Aware Loss for Unsupervised Light Field Disparity Estimation OPAL&#xff1a;面向无监督光场视差估计的遮挡模式感知损失 作者&#xff1a;Peng Li; Jiayin Zhao; Jingyao Wu; Chao Deng; Yuqi Han; Haoqian Wang; Tao Yu 摘要…

一个永久的.NET渗透工具和知识仓库

01前言 为了更好地应对基于.NET技术栈的风险识别和未知威胁&#xff0c;.NET安全攻防帮会从创建以来一直聚焦于.NET领域的安全攻防技术&#xff0c;定位于高质量安全攻防社区&#xff0c;也得到了许多师傅们的支持和信任&#xff0c;通过帮会深度连接入圈的师傅们&#xff0c;…

计算机毕业设计推荐-基于PHP的律所预约服务管理系统

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、基于PHP的律…

61.【C语言】数据在内存中的存储

1.前置知识 整数在内存中以补码形式存储 有符号整数三种码均有符号位,数值位 正整数:原码反码补码 负整数:原码≠反码≠补码 2.解释 int arr[] {1,2,3,4,5}; VSx86Debug环境下,内存窗口输入&arr VSx64Debug环境下,内存窗口输入&arr 存放的顺序都一样,均是小端序…

路由基础--路由引入

路由引入的主要作用是实现路由信息在不同路由协议之间的传递和学习。在大型企业网络中&#xff0c;多种路由协议共存是常态&#xff0c;为了实现全网互通&#xff0c;需要通过路由引入来传递路由信息。此外&#xff0c;执行路由引入时还可以部署路由控制&#xff0c;从而实现对…

Leetcode 2464. 有效分割中的最少子数组数目

1.题目基本信息 1.1.题目描述 给定一个整数数组 nums。 如果要将整数数组 nums 拆分为 子数组 后是 有效的&#xff0c;则必须满足: 每个子数组的第一个和最后一个元素的最大公约数 大于 1&#xff0c;且 nums 的每个元素只属于一个子数组。 返回 nums 的 有效 子数组拆分中…

【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

ESP32Cam人工智能教学22

ESP32Cam人工智能教学22 在线车牌识别装置 在第十六课《tencent-OCR》中&#xff0c;已经学会了使用腾讯在线识别车牌&#xff0c;但是用的是电脑中的Python程序&#xff0c;读取一张车牌图片内容&#xff0c;然后发送给腾讯服务器进行识别&#xff0c;并获取返回的识别结果。…

基于yolov5滑块识别破解(一)

由于内容较长&#xff0c;将分为两个部分来说明&#xff0c;本文讲解yolov5的部署与训练。 1.YOLOv5部署 云端部署&#xff08;训练&#xff09; 服务器创建 如果自己的显卡算力不是很好的&#xff0c;或者是核显电脑&#xff0c;可以租用算力&#xff0c;价格还行一块钱左右就…

教你一招:在微信小程序中为用户上传的图片添加时间水印

在微信小程序开发过程中&#xff0c;我们常常需要在图片上添加水印&#xff0c;以保护版权或增加个性化元素。本文将为大家介绍如何在微信小程序中为图片添加时间水印&#xff0c;让你的小程序更具特色。 实现步骤&#xff1a; 1. 创建页面结构 在pages目录下创建一个名为upl…

springboot项目今日指数 -- 工程可用性测试

2. 编写测试 在这里我们编写一个测试文件通过用户名查询到用户信息 一. 编写service层 创建SysUserService接口 import com.jixu.stock.pojo.entity.SysUser;public interface SysUserService {public SysUser getUserByName(String username); }创建实现类 import com.ji…

Python酷库之旅-第三方库Pandas(124)

目录 一、用法精讲 551、pandas.DataFrame.notna方法 551-1、语法 551-2、参数 551-3、功能 551-4、返回值 551-5、说明 551-6、用法 551-6-1、数据准备 551-6-2、代码示例 551-6-3、结果输出 552、pandas.DataFrame.notnull方法 552-1、语法 552-2、参数 552-3…

为了不再被事务坑,我读透了Spring的事务传播性。

在之前文章中&#xff0c;我们已经被事务坑了两次&#xff1a; mq发送消息之后&#xff0c;业务代码回滚&#xff0c;导致发了一条中奖消息给用户&#xff01;&#xff01; 我又被Spring的事务坑了&#xff0c;用户兑奖之后&#xff0c;什么东西都没收到&#xff01;&#xf…