47 基于單片機的書庫環境監測

目錄

一、主要功能

二、硬件資源

三、程序編程

四、實現現象


一、主要功能

基于51單片機,采用DHT11濕度傳感器檢測濕度,DS18B20溫度傳感器檢測溫度,
采用滑動變阻器連接數模轉換器模擬二氧化碳和氧氣濃度檢測,各項數值通過lcd1602顯示屏顯示,
如果各項參數超過閾值,則蜂鳴器報警;若溫濕度超過閾值,則同時啟動電機轉動模擬風扇進行
降溫或者除濕。

二、硬件資源

基于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  inttypedef unsigned char u8;typedef unsigned int  u16;static uint temp;static float ftemp = 0.0f;//溫度轉變sbit 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 beep=P3^4;
sbit Temp_data=P2^6;  				//DHT11sbit DS=P2^4;                 //DS18B20溫度傳感器sbit ssmotor = P3^0;
sbit csmotor = P3^1;unsigned 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;      //定義變量static uchar wd,sd;static int wdyz=37,sdyz=80,coyz=90,pmyz=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 tmpchange();uint tmp();void beep_warning();void ajpd();void dsreset(void)            //發出命令{uint i;DS=0;		              i=103;				   //將總線拉低480us~960uswhile(i>0)i--;DS=1;					   //然后拉高總線,若DS18B20做出反應會將在15us~60us后將總線拉低i=4;					   //15us~60us等待while(i>0)i--;  //while(DS);}bit tmpreadbit(void)          //讀取數據{uint i;bit dat;DS=0;i++;          //i++ for delayDS=1;i++;i++;dat=DS;i=8;while(i>0)i--;   return (dat);
}uchar tmpread(void)           //讀取數據{uchar i,j,dat;dat=0;  for(i=1;i<=8;i++){j=tmpreadbit();dat=(j<<7)|(dat>>1);   //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里}  return(dat);
}void tmpwritebyte(uchar dat)  //傳輸數據給DS18B20{uint i;uchar j;bit testb;  for(j=1;j<=8;j++){testb=dat&0x01;dat=dat>>1;    if(testb)     //write 1{DS=0;i++;i++;DS=1;i=8;while(i>0)i--;}    else{DS=0;       //write 0i=8;while(i>0)i--;DS=1;i++;i++;}}
}void tmpchange(void)          //DS18B20開始工作{  dsreset();  Delay(1);  tmpwritebyte(0xcc);  tmpwritebyte(0x44);  
}					  
uint tmp()                    //獲得溫度{  float tt;uchar a,b;  dsreset();  Delay(1);  tmpwritebyte(0xcc);  tmpwritebyte(0xbe);a=tmpread();//低八位b=tmpread();//高八位temp=b;temp<<=8;             //two byte  compose a int variabletemp=temp|a;tt=temp*0.0625; //算出來的是測到的溫度,數值可到小數點后兩位temp=tt*10+0.5; //為了顯示溫度后的小數點后一位并作出四舍五入,因為取值運算不能取小數點后的數return temp;
}//延時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);	 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;
}void beep_warning()//蜂鳴器警報并且電機轉動{	if(ftemp>wdyz){beep = 1;ssmotor = 0;}		else{ssmotor = 1;}	if(sd>sdyz){beep = 1;csmotor = 0;}	else{csmotor = 1;}  if(R>coyz) //氧氣{beep = 1;}		if(R1>pmyz)//二氧化碳{beep = 1;}	if(ftemp<=wdyz && sd<=sdyz && R<=coyz && R1<=pmyz )	{beep = 0;}
}void main()					  //主函數{	LCD_Init();         //顯示屏初始化ssmotor = 1;csmotor = 1;beep = 0;	do{		 tmpchange();        //讓18b20開始轉換溫度temp = tmp();       //讀取溫度ftemp = temp/10.0f; //轉換溫度cshq();  //參數獲取dht11(); //溫濕度獲取xxpxs();  //顯示屏顯示beep_warning();    //狀態判斷}  while(1);
}void xxpxs()  //顯示屏顯示{//		LCD\_ShowString(1,1,"O2:");	//	  LCD\_ShowNum(1,4,R,3); //COLCD_ShowString(1,9,"CO2:");	LCD_ShowNum(1,13,R1,3);//PM2.5//濕度LCD_ShowString(2,1,"wd:");	LCD_ShowNum(2,4,ftemp,3);    //溫度LCD_ShowString(2,9,"sd:");	LCD_ShowNum(2,12,sd,3);}void cshq()  //參數獲取{u=get\_AD\_Res();U=(250*u)/128;     //此處將數字信號轉化為模擬信號,要根據上拉電阻阻值來確定R=200*U/250;	   //O2u1=get\_AD\_Res1();U1=(250*u1)/128;     //此處將數字信號轉化為模擬信號,要根據上拉電阻阻值來確定R1=200*U1/250;	   //CO2}

四、實現現象

具體動態效果看B站演示視頻:

基于單片機的書庫環境監測_嗶哩嗶哩_bilibili

全部資料(源程序、仿真文件、安裝包、原理圖、演示視頻):

百度網盤資料下載https://pan.baidu.com/s/1LQW2armPsJuy9HeeNPeQSg?pwd=xks0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/web/62453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62453.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【操作系統】每日 3 題(五十五)

?個人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;專欄地址&#xff1a;https://blog.csdn.net/newin2020/category_12820365.html &#x1f4da;專欄簡介&#xff1a;在這個專欄中&#xff0c;我將會分享操作系統面試中常見的面試題給大家~ ??…

服務器加固

1.服務器密碼復雜度 密碼最小長度&#xff0c;密碼復雜度策略 vim /etc/pam.d/system-auth --------------- #密碼配置 #ucredit&#xff1a;大寫字母個數&#xff1b;lcredit&#xff1a;小寫字母個數&#xff1b;dcredit&#xff1a;數字個數&#xff1b;ocredit&#xff1a;…

spring boot 同一個redis 操作不同的庫

1.下面是在Spring Boot中配置多個Redis數據庫的幾種方式&#xff1a; 1.1 配置如下# application.yml spring:redis:host: localhostport: 6379password: your_password# 連接池配置lettuce:pool:max-active: 8max-idle: 8min-idle: 0max-wait: -1mstimeout: 5000ms# 多個數據…

C語言面試題/筆試題/高頻面試題_2

9. 全局變量和局部變量的區別 定義&#xff1a;全局變量是定義在函數外部的變量&#xff0c;局部變量是定義在 函數內部的變量 存儲位置&#xff1a;全局變量存儲在全局區&#xff0c;局部變量存儲在棧區 作用域&#xff1a;全局變量可以在程序任意位置使用&#xff0c;局部變量…

Brain.js(八):RNNTimeStep 實戰教程 - 股票價格預測 - 實操需警慎

前置聲明&#xff0c;個人淺度炒股&#xff0c;但計劃將基金轉入股市。然后 股市有風險&#xff0c;不是技術可以完全預測的&#xff0c;但是在無頭緒的時候&#xff0c;用技術指標做個參考也不錯。 本文涉及到的股票預測&#xff0c;只是代碼簡單示例&#xff0c;實操需警慎&a…

MySQL | 尚硅谷 | 第13章_約束

MySQL筆記&#xff1a;第13章_約束 文章目錄 MySQL筆記&#xff1a;第13章_約束第13章_約束 1. 約束(constraint)概述1.1 為什么需要約束1.2 什么是約束1.3 約束的分類演示代碼 2. 非空約束2.1 作用2.2 關鍵字2.3 特點2.4 添加非空約束2.5 刪除非空約束演示代碼 3. 唯一性約束3…

《計算機網絡》(408大題)

2009 路由轉發和靜態路由的計算 子網劃分、路由聚合的計算 注&#xff1a;CIDR中的子網號可以全為0或1&#xff0c;但是其主機號不允許。 注&#xff1a; 這里其實是把到互聯網的路由當做了一個默認路由&#xff08;當一個目的網絡地址與路由表中其他都不匹配時&#xff0c;…

NanoLog起步筆記-6-StaticLogInfo

nonolog起步筆記-6-StaticLogInfo StaticLogInfo文件名和行號文件名和行號的傳入log參數 RuntimeLogger::registerInvocationSitelogid為什么只能被賦一次值 reserveAlloc加入消息頭finishAlloc返回 StaticLogInfo 寫C語言編譯前端時&#xff0c;給我印象深刻的一部分是&#…

軟件工程 概述

軟件 不僅僅是一個程序代碼。程序是一個可執行的代碼&#xff0c;它提供了一些計算的目的。 軟件被認為是集合可執行的程序代碼&#xff0c;相關庫和文檔的軟件。當滿足一個特定的要求&#xff0c;就被稱為軟件產品。 工程 是所有有關開發的產品&#xff0c;使用良好定義的&…

Sui 集成 Phantom,生態迎來全新里程碑

作為領先的非托管多鏈加密&#x1f45b;&#xff0c;Phantom 宣布將支持 Sui 區塊鏈。Sui 將加入 Solana、Bitcoin 和 Ethereum 隊伍&#xff0c;成為該 wallet 支持的少數 L1 區塊鏈之一。 此次集成也大幅提升了 Phantom 的互操作性&#xff0c;同時表明 wallet 提供商和應用…

目標跟蹤領域經典論文解析

親愛的小伙伴們&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你對深度學習的奧秘、JAVA 、PYTHON與SAP 的奇妙世界&#xff0c;亦或是讀研論文的撰寫攻略有所探尋&#x1f9d0;&#xff0c;那不妨給我一個小小的關注吧&#x1f970;。我會精心籌備&#xff0c;在…

如何解決 java.nio.charset.CoderMalfunctionError: 編碼器故障錯誤問題?親測有效的解決方法!

java.nio.charset.CoderMalfunctionError 是一個在 Java 中相對較少遇到的異常&#xff0c;通常與字符編碼轉換過程中的錯誤有關。當 Java 程序在進行字符編碼轉換時&#xff0c;遇到無法處理的字符或編碼故障時&#xff0c;就會拋出該異常。 1. 問題描述 java.nio.charset.C…

低級爬蟲實現-記錄HCIP云架構考試

因工作需要考HCIP云架構&#xff08;HCIP-Cloud Service Solution Architect&#xff09;證書, 特意在淘寶上買了題庫&#xff0c; 考過了。 事后得知自己被坑了&#xff0c; 多花了幾十大洋。 所以想著在授權期內將題庫“爬”下來&#xff0c; 共享給大家。 因為整個過程蠻有…

QGroundControl之5-AppSettings.cc

介紹 應用程序設置 Application Settings &#xff0c;這里看下語言選擇功能&#xff0c;它是怎么和json文件關聯起來的&#xff0c;剛剛看的時候&#xff0c;很是奇怪這么多的json文件作用。 1.AppSettings.cc 文件怎么和App.SettingsGroup.json關聯 在AppSettings.cc文件沒…

jenkins郵件的配置詳解

Jenkins郵件的配置涉及多個步驟和細節,以下是詳細的配置指南: 一、前期準備 確定郵件服務:明確Jenkins將要使用的郵件服務,如QQ郵箱、163郵箱、公司郵箱(基于Microsoft 365或Exchange Server)等。獲取SMTP配置信息:根據郵件服務類型,獲取相應的SMTP服務器地址、端口號…

【ArcGIS微課1000例】0134:ArcGIS Earth實現二維建筑物的三維完美顯示

文章目錄 一、加載數據二、三維顯示三、三維符號化一、加載數據 加載配套實驗數據(0134.rar中的建筑物,2d或3d都可以),方法如下:點擊添加按鈕。 點擊【Add Files】,在彈出的Open對話框中,選擇建筑物,點擊確定,完成添加。 默認二維顯示: 二、三維顯示 右鍵建筑物圖層…

jupyterlab 增加多個kernel,正確做法

1、背景 需要增加一個kernel然后相當于隔離一個環境 juypterlab Version 3.0.14 2、用conda 安裝 例如&#xff0c;你在conda下有一個python 3.12 的環境 py312 ipython kernel install --user --namepy312 如果保持的話&#xff0c;用pip安裝相應的包就好 3、檢查是否配置好 …

案例-商品列表(組件封裝)

標簽組件封裝 1.雙擊顯示&#xff0c;自動聚焦 2.失去焦點&#xff0c;隱藏輸入框 標簽一列&#xff0c;不同行的標簽內容不同&#xff0c;但是除此之外其他基本一致&#xff0c;所以選擇用 標簽組件 將這一部分封裝為一個組件&#xff0c;需要時組件標簽展示。 首先標簽處一進…

Python 基礎學習(一)

一.基礎語法 注釋 Python中單行注釋以 # 開頭&#xff0c;如下&#xff1a; #!/usr/bin/python3# 第一個注釋 print ("Hello, Python!") # 第二個注釋多行注釋可以用多個 # 號&#xff0c;還有 ‘’’ 和 “”"&#xff1a; #!/usr/bin/python3# 第一個注釋…

TIM輸入捕獲---STM

一、簡介 IC輸入捕獲 輸入捕獲模式下&#xff0c;當通道輸入引腳出現指定電平跳變時&#xff0c;當前CNT的值將被鎖存在CCR中&#xff0c;可用于測量PWM波形的頻率、占空比、脈沖間隔、電平持續時間等參數 每個高級定時器和通用定時器都擁有4個輸入捕獲通道 可配置為PWMI模…