① 基於單片機的溫濕度檢測系統主程序流程圖,溫、濕度檢測程序流程圖,報警程序流程圖,感測器是dht11
圖4.1 系統主程序流程圖
圖4.2按鍵子程序流程圖
② 基於C52單片機溫濕度監測系統 求高手指點迷津
1、可以加個紅外收發裝置,與其他系統通訊
2、可以擴展一塊FLASH存儲,將檢測到的數據本地存儲。
3、可以加個時鍾,採用專用的日歷晶元就可以,反正顯示有1602,很方便。
③ 求單片機程序關於溫濕度。感測器採用DHT11,按鍵四個可以設置溫濕度的上下限,顯示用lcd1602,超限報警
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定義數組
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//溫濕度感測器DHT11數據接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}
void sendwd()
{
//send wen
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}
void sendsd()
{
//send shi
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延時
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/
/*********************************************************************************/
// 毫秒級延時子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/
/*********************************************************************************/
//5us級延時程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/
/********************************************************************************/
// 測試LCD忙碌狀態
//lcd_busy()為1時,忙,等待。lcd_busy()為0時,閑,可寫指令與數據。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/
/*******************************************************************************/
// 寫入指令數據到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*****************************************************************************/
/*****************************************************************************/
//寫顯示數據到LCD
//RS=高電平,RW=低電平,E=高脈沖,D0-D7=數據。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/
/****************************************************************************/
//LCD初始化設定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2顯示,5*7點陣,8位數據
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //顯示開,關游標
delay_ms(5);
lcd_wcmd(0x06); //移動游標
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的顯示內容,如果屏幕過暗,可將這倆句刪除
//delay_ms(5);
}
/****************************************************************************/
/****************************************************************************/
//設定LCD顯示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //數據指針=80+地址變數
}
/****************************************************************************/
/****************************************************************************/
//收發信號檢測,數據讀取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
/****************************************************************************/
//濕度讀取子程序
//溫度高8位== TL_data
//溫度低8位== TH_data
//濕度高8位== RH_data
//濕度低8位== RH_data
//校驗 8位 == CK_data
//調用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主機拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA匯流排由上拉電阻拉高 主機延時20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主機設為輸入 判斷從機響應信號
TRH=1;
//判斷DHT11是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!TRH)
{
respond=2;
//判斷DHT11發出 80us 的低電平響應信號是否結束
while((!TRH)&& respond++);
respond=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while(TRH && respond++);
//數據接收狀態
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//數據校驗
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//濕度整數部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小數點
//濕度小數部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//溫度整數部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小數點
//溫度小數部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
/****************************************************************************/
//冬天適宜溫濕度 夏天適宜溫濕度
//濕度:30%--80% 30%--60%
//溫度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//報警函數
{
if(RH_data>=80) //濕度上限80%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(RH_data<=30) //濕度下限30%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data>=25) //溫度上限25℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data<=18) //溫度下限18℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else
{
buz=1;
}
}
/****************************************************************************/
//主函數
//TH,TL,RH,RL分別代表溫濕度的整數和小數部分
/****************************************************************************/
void main()
{
lcd_init();
initcom();
delay_us();
while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//寫字元
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //顯示字元
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //顯示字元
lcd_wdata(dis2[i]);
}
//寫濕度數據
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//寫溫度數據
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延時
delay_ms(500);
baoj();//報警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}
④ 51單片機做溫濕度測量用什麼模塊
1、單片機最小系統
2、顯示
3、溫度感測器
4、程序
5、我可以完成
⑤ 如何用一個51單片機實現溫濕度測量和時間的顯示
可以的,使用SHT10之類的溫濕度一體感測器,時間可以用內部RTC或外置的,很方便的,有4K的容量基本就ok了
⑥ 單片機溫濕度檢測模擬,為什麼反應很慢
更簡單的
1. 89C51 最小系統(包含 電源LM7805輸出5V,晶振12M+22pF電容接地,復位電路10K接地+10uF到5V)
2.測溫晶元 DS18B20 (一個IO隨便接到 P1口,如P1.0)
3.顯示(最簡單的是接一個串口轉換晶元MAX232 ,將測量數據發到PC上,用串口調試助手接收)
(如果不想這么做就用數碼管吧,共陽2位數碼管接到P0,P2口上)
⑦ 用單片機實現溫濕度的測量.
幫你找到了一篇文章,詳細信息如下,你可以去下載下來看看,有什麼不懂的請聯系我。
《甘肅聯合大學學報(自然科學版)》2007年02期 加入收藏 獲取最新
基於單片機控制的溫濕度測量系統
陸超;袁靜
文章設計了一種溫濕度測量系統,該系統由單片機測量系統和計算機數據管理系統組成,可以對現場的溫度和濕度進行實時採集,並通過串列口與計算機進行數據發送與接收.該系統適用於氣象、工業、農業、環保、科研等領域的溫度、濕度測量與控制,也可用於車站、碼頭、機場、會議室等場所的環境監測.
【作者單位】:宿遷學院計算機系 江蘇宿遷223800
【關鍵詞】:單片機;串列通信;數據處理;溫濕測量系統
【分類號】:TP274.4
【DOI】:CNKI:ISSN:1672-691X.0.2007-02-017
【正文快照】:
0前言人類的生存和社會活動與溫、濕度密切相關,隨著科學技術的發展,人類在不同應用領域對溫、濕度的測量和分析提出更廣和更高的要求.本文介紹了一種可適用於氣象、工業、農業、環保、科研等領域的溫度、濕度測量與控制,也可用於車站、碼頭、機場、會議室等場所的環境監測系統
⑧ 51單片機溫濕度檢測用按鍵觸發
51單片機溫濕度檢測用按鍵觸發,就觸發唄,有什麼可問的,想問什麼,說得具體點。
⑨ 51單片機c語言編程的溫濕度檢測控製程序
/********************************************************************
*
文件名
:
溫度採集DS18B20.c
*
描述
:
該文件實現了用溫度感測器件DS18B20對溫度的採集,並在數碼管上顯示出來。
*
創建人
:
東流,2009年4月10日
*
版本號
:
2.0
***********************************************************************/
#include<reg52.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
jump_ROM
0xCC
#define
start
0x44
#define
read_EEROM
0xBE
sbit
DQ
=
P2^3;
//DS18B20數據口
unsigned
char
TMPH,TMPL;
uchar
code
table[10]
=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
*
名稱
:
delay()
*
功能
:
延時,延時時間大概為140US。
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
void
delay_1()
{
int
i,j;
for(i=0;
i<=10;
i++)
for(j=0;
j<=2;
j++)
;
}
/********************************************************************
*
名稱
:
delay()
*
功能
:
延時函數
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
void
delay(uint
N)
{
int
i;
for(i=0;
i<N;
i++)
;
}
/********************************************************************
*
名稱
:
Delay_1ms()
*
功能
:
延時子程序,延時時間為
1ms
*
x
*
輸入
:
x
(延時一毫秒的個數)
*
輸出
:
無
***********************************************************************/
void
Delay_1ms(uint
i)//1ms延時
{
uchar
x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
*
名稱
:
Reset()
*
功能
:
復位DS18B20
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
uchar
Reset(void)
{
uchar
deceive_ready;
DQ
=
0;
delay(29);
DQ
=
1;
delay(3);
deceive_ready
=
DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
*
名稱
:
read_bit()
*
功能
:
從DS18B20讀一個位值
*
輸入
:
無
*
輸出
:
從DS18B20讀出的一個位值
***********************************************************************/
uchar
read_bit(void)
{
uchar
i;
DQ
=
0;
DQ
=
1;
for(i=0;
i<3;
i++);
return(DQ);
}
/********************************************************************
*
名稱
:
write_bit()
*
功能
:
向DS18B20寫一位
*
輸入
:
bitval(要對DS18B20寫入的位值)
*
輸出
:
無
***********************************************************************/
void
write_bit(uchar
bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/********************************************************************
*
名稱
:
read_byte()
*
功能
:
從DS18B20讀一個位元組
*
輸入
:
無
*
輸出
:
從DS18B20讀到的值
***********************************************************************/
uchar
read_byte(void)
{
uchar
i,m,receive_data;
m
=
1;
receive_data
=
0;
for(i=0;
i<8;
i++)
{
if(read_bit())
{
receive_data
=
receive_data
+
(m
<<
i);
}
delay(6);
}
return(receive_data);
}
/********************************************************************
*
名稱
:
write_byte()
*
功能
:
向DS18B20寫一個位元組
*
輸入
:
val(要對DS18B20寫入的命令值)
*
輸出
:
無
***********************************************************************/
void
write_byte(uchar
val)
{
uchar
i,temp;
for(i=0;
i<8;
i++)
{
temp
=
val
>>
i;
temp
=
temp
&
0x01;
write_bit(temp);
delay(5);
}
}
/********************************************************************
*
名稱
:
Main()
*
功能
:
主函數
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
void
main()
{
float
tt;
uint
temp;
P2
=
0x00;
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL
=
read_byte();
TMPH
=
read_byte();
temp
=
TMPL
/
16
+
TMPH
*
16;
P0
=
table[temp/10%10];
P2
=
6;
Delay_1ms(5);
P0
=
table[temp%10];
P2
=
7;
Delay_1ms(5);
}
}