標題:
pcf8591+oled+ DHT11溫濕度智能車內(nèi)管理系統(tǒng)源程序與Proteus仿真
[打印本頁]
作者:
zhangshuqiang
時間:
2020-10-7 16:19
標題:
pcf8591+oled+ DHT11溫濕度智能車內(nèi)管理系統(tǒng)源程序與Proteus仿真
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png
(40.39 KB, 下載次數(shù): 89)
下載附件
2020-10-8 02:39 上傳
單片機源程序如下:
#include <reg52.h> //頭文件
//#include "LCD1602.h"
//#include "AT24C02.h"
#include "DHT11.h"
#include "oled.h"
#include <intrins.h>
//#include "adc0809.h"
#include "IIC.h"
#include "IICyy.h"
#define uint unsigned int
#define uchar unsigned char
sbit led1 =P1^7;
sbit led2 =P1^6;
sbit jia_wen = P2^2;
sbit zhilen = P3^0;
sbit jin_hua = P3^1;
sbit jia_shi = P3^5;
/*****************燈、蜂鳴器、按鍵引腳定義*******************/
//sbit led = P3^7; //超限指示燈
//sbit led1 = P3^2; //正常指示燈
sbit buzz = P2^3; //蜂鳴器
//sbit key_set = P1^5; //設置鍵
//sbit key_jia = P1^6; //加鍵
//sbit key_jian= P1^7; //減鍵
/************************變量定義***********************/
uchar temp_old,humi_old;//存儲上一次的溫度、濕度
uchar temp_up,temp_down;//存儲溫度上、下限值
uchar humi_up,humi_down;//存儲濕度上、下限值
uchar set_f; //設置選擇標記,=0非設置,=1設置濕度上限,=2設置濕度下限
// =3設置溫度上限,=4設置溫度下限。
unsigned char AD_DATA[1]; //保存IN0通道轉(zhuǎn)換后的數(shù)據(jù)
void jiexianw();
void Delay_1ms(uint i);
/********************************************************
函數(shù)名稱:void display(void)
函數(shù)作用:oled顯示固定作用
參數(shù)說明:
********************************************************/
/*
void fixed_display(void)
{
OLED_ShowString(0,0,"Temp:"); //固定位置顯示“Temp:”
OLED_ShowString(56,0,"."); //固定位置顯示“.”
OLED_ShowString(80,0,"C"); //固定位置顯示“C”
OLED_ShowString(0,1,"Humi:"); //固定位置顯示“Humi:”
OLED_ShowString(56,1,"."); //固定位置顯示“.”
OLED_ShowString(80,1,"%"); //固定位置顯示“%”
if(set_f==0) //設置鍵沒按下,非設置模式
{
OLED_ShowString(80,4," "); //不顯示
}
if(set_f==1) //設置鍵按了1次
{
OLED_ShowString(80,4," HU"); //顯示“HU”
}
if(set_f==2) //設置鍵按了2次
{
OLED_ShowString(80,4," HD"); //顯示“HD”
}
if(set_f==3) //設置鍵按了3次
{
OLED_ShowString(80,4," TU"); //顯示“TU”
}
if(set_f==4) //設置鍵按了4次
{
OLED_ShowString(80,4," TD"); //顯示“TD”
}
}
*/
/********************************************************
函數(shù)名稱:void display1(void)
函數(shù)作用:顯示當前實際溫濕度
參數(shù)說明:
/********************************************************/
/*
void display1(void)
{
if(DHT11_Check()==1) //判斷校驗和是否正確
{
if(humi_old<Humi_H) //判斷濕度是否上升
{
OLED_ShowString(88,1,"up"); //上升則顯示‘up’
Delay_ms(50); //延時
humi_old=Humi_H; //記錄當前濕度
}
else
if(humi_old>Humi_H) //判斷濕度是否下降
{
OLED_ShowString(88,1,"down"); //下降則顯示‘down’
Delay_ms(50); //延時
humi_old=Humi_H; //記錄當前濕度
}
if(temp_old<Temp_H) //判斷溫度是否上升
{
OLED_ShowString(88,0,"up"); //上升則顯示‘up’
Delay_ms(50); //延時
temp_old=Temp_H; //記錄當前溫度
}
else
if(temp_old>Temp_H) //判斷溫度是否下降
{
OLED_ShowString(88,0,"down"); //下降顯示‘down’
Delay_ms(50); //延時
temp_old=Temp_H; //記錄當前溫度
}
//顯示實測濕度值
OLED_ShowChar(40,1,ASCII[Humi_H/10]);//顯示濕度十位的數(shù)值
OLED_ShowChar(48,1,ASCII[Humi_H%10]);//顯示濕度個位的數(shù)值
OLED_ShowChar(64,1,ASCII[Humi_L/10]);//顯示濕度十分位的數(shù)值
OLED_ShowChar(70,1,ASCII[Humi_L%10]);//顯示濕度百分位的數(shù)值
OLED_ShowChar(40,0,ASCII[Temp_H/10]);//顯示溫度十位的數(shù)值
OLED_ShowChar(48,0,ASCII[Temp_H%10]);//顯示溫度個位的數(shù)值
OLED_ShowChar(64,0,ASCII[Temp_L/10]);//顯示溫度十分位的數(shù)值
OLED_ShowChar(70,0,ASCII[Temp_L%10]);//顯示溫度百分位的數(shù)值
if(temp_up<=Temp_H||temp_down>Temp_H||humi_up<=Humi_H||humi_down>Humi_H) //判斷是否超出設置的溫濕度上下限
{
buzz=0; //超出的話蜂鳴器響起
led=0; //點亮報警燈
led1=1;
}
else //否者溫濕度都處于限值范圍內(nèi)
{
buzz=1; //關閉蜂鳴器
led=1;
led1=0; //點亮正常燈
}
jiexianw();
}
}
*/
/***************溫度上下限限制*******************/
/*
void jiexianw()
{
fixed_display(); //顯示固定內(nèi)容
OLED_ShowString(0,4,"T&H limit"); //設置區(qū)域顯示"T&H limit"
OLED_ShowString(0,5,"T:UP"); //設置區(qū)域顯示"T:UP"
OLED_ShowChar(32,5,ASCII[temp_up/10]); //設置區(qū)域顯示溫度上限十位的數(shù)值
OLED_ShowChar(40,5,ASCII[temp_up%10]); //設置區(qū)域顯示溫度上限個位的數(shù)值
OLED_ShowString(56,5,"DOWN"); //設置區(qū)域顯示"DOWN"
OLED_ShowChar(88,5,ASCII[temp_down/10]);//設置區(qū)域顯示溫度下限十位的數(shù)值
OLED_ShowChar(94,5,ASCII[temp_down%10]);//設置區(qū)域顯示溫度下限個位的數(shù)值
OLED_ShowString(0,6,"H:UP"); //設置區(qū)域顯示"H:UP"
OLED_ShowChar(32,6,ASCII[humi_up/10]); //設置區(qū)域顯示濕度上限十位的數(shù)值
OLED_ShowChar(40,6,ASCII[humi_up%10]); //設置區(qū)域顯示濕度上限十位的數(shù)值
OLED_ShowString(56,6,"DOWN"); //設置區(qū)域顯示"DOWN"
OLED_ShowChar(88,6,ASCII[humi_down/10]);//設置區(qū)域顯示濕度下限十位的數(shù)值
OLED_ShowChar(94,6,ASCII[humi_down%10]);//設置區(qū)域顯示濕度下限個位的數(shù)值
}
*/
/********************************************************
函數(shù)名稱:void delayms(uint ms)
函數(shù)作用:毫秒延時函數(shù)
參數(shù)說明:
********************************************************/
void delayms(uint ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************
函數(shù)名稱:void scan(void)
函數(shù)作用:按鍵檢測函數(shù)
參數(shù)說明:
********************************************************/
/*
void scan(void)
{
//設置鍵,不支持連按
if(key_set==0) //按鍵按下
{
delayms(7); //延時消抖
if(key_set==0) //再次確認按鍵按下
{
led=1; //關閉報警燈
led1=1; //關閉正常燈
buzz=1; //關閉蜂鳴器
if(set_f==0) //進入設置先清除屏幕,顯示設置部分
{
OLED_Clear(); //清除屏幕顯示
delay_n40us(100); //延時等待全部清除完畢
}
set_f++; //設置變量+1
if(set_f==5) //全部設置完成,退出設置
{
set_f=0; //重置設置變量
AT24C02_write_date(0,humi_up); //寫入【濕度上限】數(shù)據(jù)保存
AT24C02_write_date(1,humi_down);//寫入【濕度下限】數(shù)據(jù)保存
AT24C02_write_date(2,temp_up); //寫入【溫度上限】數(shù)據(jù)保存
AT24C02_write_date(3,temp_down);//寫入【溫度下限】數(shù)據(jù)保存
OLED_Clear(); //清除屏幕顯示
delay_n40us(100); //延時等待全部清除完畢
fixed_display(); //清除顯示后顯示固定部分
}
}
while(!key_set); //檢測按鍵松開
}
//加值鍵,支持連按
if(key_jia==0&&set_f!=0||key_jian==0&&set_f!=0)//進入設置模式,按下加鍵或減鍵
{
delayms(7); //延時消抖
if(set_f==1) //設置濕度上限
{
if(key_jia==0)
{
if(humi_up<99) //濕度最大值不可大于99%RH
humi_up++; //濕度上限+1%RH
}
if(key_jian==0)
{
if(humi_up!=0&&humi_up>humi_down+1)//濕度上限最小不可為0%RH,并且上限得比下限大
humi_up--; //濕度上限值-1%RH
}
}
if(set_f==2) //設置濕度下限
{
if(key_jia==0)
{
if(humi_down<99&&humi_down+1<humi_up)//濕度下限最大值小于99%RH,并且下限不可超過上限
humi_down++; //濕度下限+1%RH
}
if(key_jian==0)
{
if(humi_down!=0) //濕度下限最小值不可為0%RH
humi_down--; //濕度下限值-1%RH
}
}
if(set_f==3) //設置溫度上限
{
if(key_jia==0)
{
if(temp_up<99) //溫度上限最大值不可大于99℃
temp_up++; //濕度上限+1℃
}
if(key_jian==0)
{
if(temp_up!=0&&temp_up>temp_down+1)//溫度上限最小值不可為0℃,并且上限得比下限大
temp_up--; //溫度上限值-1℃
}
}
if(set_f==4) //設置溫度下限
{
if(key_jia==0)
{
if(temp_down<99&&temp_down+1<temp_up)//溫度下限最大值不可大于99℃,并且下限不可超過上限
temp_down++; //溫度下限+1℃
}
if(key_jian==0)
{
if(temp_down!=0) //溫度下限最小值不可為0℃
temp_down--; //溫度下限值-1℃
}
}
}
} */
//-------字符串轉(zhuǎn)換為 數(shù)字
char *reverse(char *s)
{
char temp;
char *p = s;
char *q = s;
while(*q)
++q;
q--;
while(q > p)
{
temp = *p;
*p++ = *q;
*q-- = temp;
}
return s;
}
char *my_itoa(int n)
{
int i = 0,isNegative = 0;
static char s[20];
if((isNegative = n) < 0)
{
n = -n;
}
do
{
s[i++] = n%10 + '0';
n = n/10;
}while(n > 0);
if(isNegative < 0)
{
s[i++] = '-';
}
s[i] = '\0';
return reverse(s);
}
/********************************************************
函數(shù)名稱:void main()
函數(shù)作用:主函數(shù)
參數(shù)說明:
********************************************************/
//----lcd能顯示8行-1 ~ 6 -1 0 1 2 3 4 5 6
int main()
{
char js =1;
char jh = 1;
char wd =1;
char swh =1;
unsigned char ovc=0;unsigned char pm2_5=0;
unsigned int value = 0;
int humid = 0;int tempt = 0;
OLED_Init(); //顯示屏初始化
/* DHT11_read(); //讀取DHT11溫濕度
humid = Humi_H;
tempt = Temp_H;
OLED_ShowString(0,0," ");
OLED_ShowString(0,1," ");
OLED_ShowString(0,0,"T:"); OLED_ShowString(15,0,my_itoa(Temp_H));
OLED_ShowString(50,0,"H:"); OLED_ShowString(65,0,my_itoa(Temp_H));
OLED_ShowString(0,1,"OVC:"); OLED_ShowString(30,1,my_itoa(iic_readvoldata2()/10));
OLED_ShowString(0,2,"PM2.5:"); OLED_ShowString(40,1,my_itoa(iic_readvoldata1()/10));*/
while(1)
{
DHT11_read(); //讀取DHT11溫濕度
ovc = iic_readvoldata1();
pm2_5 = iic_readvoldata2();
OLED_ShowString(0,0,"T:"); OLED_ShowString(15,0," "); OLED_ShowString(15,0,my_itoa(Temp_H));
OLED_ShowString(50,0,"H:"); OLED_ShowString(65,0," "); OLED_ShowString(65,0,my_itoa(Humi_H));
OLED_ShowString(0,2,"PM2.5:"); OLED_ShowString(40,2," "); OLED_ShowString(60,2,my_itoa(ovc)); //---3
OLED_ShowString(0,1,"OVC:"); OLED_ShowString(30,1," "); OLED_ShowString(30,1,my_itoa(pm2_5)); //----2
//-----智能模式
OLED_ShowString(0,3,"mode:"); OLED_ShowString(40,3,my_itoa(swh));
if(led1 == 0)
{
swh++;
while(!led1);
}
if(swh >4)swh =1;
if(swh ==1)
{ jia_wen =1; zhilen =1;jia_shi =1;jin_hua = 1;
if(Temp_H>=10&&Temp_H<=30){jia_wen =1 ; zhilen =1;}
if(Temp_H <10) {jia_wen =0; zhilen =1;}
if(Temp_H >30) {zhilen =0; jia_wen =1; }
if(Humi_H <10) {jia_shi =0;}
if(Humi_H >50) {jia_shi =1;}
if(ovc>122||pm2_5>140){ jin_hua = 0;} else {jin_hua = 1;}
}
if(swh == 2) //jia_wen
{
if(led2 == 0) wd++;
while(!led2);
if(wd>3) wd =1;
}
if(swh == 3) //jin_hua
{
if(led2 == 0) jh++;
while(!led2);
if(jh>2) jh =1;
}
if(swh == 4) //jia_shi
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png
(11.21 KB, 下載次數(shù): 98)
下載附件
2020-10-8 02:39 上傳
所有資料51hei提供下載:
溫濕度.zip
(174.47 KB, 下載次數(shù): 448)
2020-10-7 16:18 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
sgjt_wyc
時間:
2021-2-22 00:47
很有幫助,謝謝貼主
作者:
wordhardy
時間:
2021-12-21 16:43
好用,謝謝貼主
作者:
cwjbomber
時間:
2022-4-6 16:33
take a look
作者:
1264821100
時間:
2023-2-25 22:12
謝謝樓主,很有幫助
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1