導航:首頁 > 編程語言 > dht11c51液晶顯示程序

dht11c51液晶顯示程序

發布時間:2022-08-19 03:05:18

Ⅰ dht11程序

#include <reg51.h>
#include <intrins.h>
//
typedef unsigned char U8; /* defined for unsigned 8-bits integer variablexd 無符號8位整型變數 */
typedef signed char S8; /* defined for signed 8-bits integer variablexd 有符號8位整型變數 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variablexd 無符號16位整型變數 */
typedef signed int S16; /* defined for signed 16-bits integer variablexd 有符號16位整型變數 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variablexd 無符號32位整型變數 */
typedef signed long S32; /* defined for signed 32-bits integer variablexd 有符號32位整型變數 */
typedef float F32; /* single precision floating point variablexd (32bits) 單精度浮點數(32位長度) */
typedef double F64; /* double precision floating point variablexd (64bits) 雙精度浮點數(64位長度) */
//
#define uchar unsigned char
#define uint unsigned int
#define Data_0_time 4

//----------------------------------------------//
//----------------IO口定義區--------------------//
//----------------------------------------------//
sbit P2_0 = P2^0 ;

//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 outdata[5]; //定義發送的位元組數
U8 indata[5];
U8 count, count_r=0;
U8 str[5]={"RS232"};
U16 U16temp1,U16temp2;
SendData(U8 *a)
{
outdata[0] = a[0];
outdata[1] = a[1];
outdata[2] = a[2];
outdata[3] = a[3];
outdata[4] = a[4];
count = 1;
SBUF=outdata[0];
}

void Delay(U16 j)
{ U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);

}
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}

void COM(void)
{

U8 i;

for(i=0;i<8;i++)
{

U8FLAG=2;
while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(P2_0)
U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);
//超時則跳出for循環
if(U8FLAG==1)break;
//判斷數據位是0還是1

// 如果高電平高過預定0高電平值則數據位為 1

U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof

}

//--------------------------------
//-----濕度讀取子程序 ------------
//--------------------------------
//----以下變數均為全局變數--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----濕度高8位== U8RH_data_H-----
//----濕度低8位== U8RH_data_L-----
//----校驗 8位 == U8checkdata-----
//----調用相關子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------

void RH(void)
{
//主機拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//匯流排由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機響應信號
P2_0=1;
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!P2_0) //T !
{
U8FLAG=2;
//判斷從機是否發出 80us 的低電平響應信號是否結束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while((P2_0)&&U8FLAG++);
//數據接收狀態
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//數據校驗

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi

}

//----------------------------------------------
//main()功能描述: AT89C51 11.0592MHz 串口發
//送溫濕度數據,波特率 9600
//----------------------------------------------
void main()
{
U8 i,j;

//uchar str[6]={"RS232"};
/* 系統初始化 */
TMOD = 0x20; //定時器T1使用工作方式2
TH1 = 253; // 設置初值
TL1 = 253;
TR1 = 1; // 開始計時
SCON = 0x50; //工作方式1,波特率9600bps,允許接收
ES = 1;
EA = 1; // 打開所以中斷
TI = 0;
RI = 0;
SendData(str) ; //發送到串口
Delay(1); //延時100US(12M晶振)
while(1)
{

//------------------------
//調用溫濕度讀取子程序
RH();
//串口顯示程序
//--------------------------

str[0]=U8RH_data_H;
str[1]=U8RH_data_L;
str[2]=U8T_data_H;
str[3]=U8T_data_L;
str[4]=U8checkdata;
SendData(str) ; //發送到串口
//讀取模塊數據周期不易小於 2S
Delay(20000);
}//elihw

}// main

void RSINTR() interrupt 4 using 2
{
U8 InPut3;
if(TI==1) //發送中斷
{
TI=0;
if(count!=5) //發送完5位數據
{
SBUF= outdata[count];
count++;
}
}

if(RI==1) //接收中斷
{
InPut3=SBUF;
indata[count_r]=InPut3;
count_r++;
RI=0;
if (count_r==5)//接收完4位數據
{
//數據接收完畢處理。
count_r=0;
str[0]=indata[0];
str[1]=indata[1];
str[2]=indata[2];
str[3]=indata[3];
str[4]=indata[4];
P0=0;
}
}
}
看不懂再問我

Ⅱ 基於89C51的溫濕度計(感測器DHT11),LCD1602什麼顯示也沒有,有哪幾種可能問題求賜教

一般不會是感測器問題的 ,問題就是1程序卡死了,2 讀取不對轉換代碼不對,把程序發過來看看
這是我編寫的你看看正常顯示前兩位為溫度然後濕度然後效驗和
/* 本程序適用於DHT11溫濕度感測器由於DHT11使用拉高匯流排的不同時常來代替0和1 0 28US 1 70us 同時數據送入1602a顯示 */
#include<reg52.h>
#include<intrins.h>
#include<math.h>
#define Data P0//數據埠
sbit RS = P2^4;//Pin4
sbit RW = P2^5;//Pin5
sbit E = P2^6; //Pin6
sbit dat=P1^2;
unsigned int shi_h=0,shi_l=0,wen_h=0,wen_l=0,i,xiaoyan=0;//定義濕度溫度變數
unsigned char codetab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//定義1602a顯示0-9
unsigned inta[16]={0} ;
voiddelayus(unsigned char i) //延時2us
{
while(--i);
}
voiddelayms(unsigned char j) //延時1ms
{
while(--j)
{
delayus(125);
delayus(125);
delayus(125);
delayus(125);
}
}
/******************************************************************/
/* 寫入命令函數 1602 */
/******************************************************************/
voidWriteCommand(unsigned int c)
{
delayms(10);//操作前短暫延時,保證信號穩定代替狀態監測
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/******************************************************************/
/* 寫入數據函數 */
/******************************************************************/
voidWriteData(unsigned char c)
{
delayms(10);;//操作前短暫延時,保證信號穩定
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/******************************************************************/
/* 寫入位元組函數 */
/******************************************************************/
voidShowChar(unsigned char pos,unsigned int c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行則命令代碼高4位為0xc p低兩位表示位置顯示代碼只用DDRAM前16位
else
p=pos+0x80; //是第一行則命令代碼高4位為0x8 p低兩位表示位置顯示代碼只用DDRAM前16位
WriteCommand (p);//寫命令寫入數據指針確定行中哪一位顯示
WriteData (c); //寫數據
}
/******************************************************************/
/* 寫入字元串函數 */
/******************************************************************/
void ShowString(unsigned char line,unsigned int *ptr)
{
unsigned char l,i;//l表示行中某一位顯示
l=line<<4; //L為0x01時左移四位為了與b0H相加變為0xc
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循環顯示16個字元
}
/******************************************************************/
/* 初始化函數 */
/******************************************************************/
void InitLcd()
{
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示游標移動位置
WriteCommand(0x0c); //顯示開及游標設置
WriteCommand(0x01); //顯示清屏

}

void main(void)
{
InitLcd(); //初始化LCD
delayms(30);
while(1)
{
dat=0;
delayms(18);//延時18ms拉低主線
dat=1;//主機拉高匯流排
/*delayus(20);*/
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
while(!dat);//判斷從機是否相應完畢相應完畢會拉高匯流排
while(dat);//等待從機拉高匯流排准備開始傳送數據
while(!dat);//判斷是否開始1bit 開始會拉高匯流排
for(i=0;i<8;i++)
{
shi_h<<=1;//右移1位
delayus(14); //延時30us判斷是否為1
if(dat)
{
shi_h++;
}
while(dat);//為一則等待從機拉低匯流排為零直接跳出
while(!dat);//判斷是否開始1bit 開始會拉高匯流排
}
for(i=0;i<8;i++)
{
delayus(14);
shi_l<<=1;
if(dat)
{
shi_l++;
}
while(dat);
while(!dat);
}
for(i=0;i<8;i++)
{
delayus(14);
wen_h<<=1;
if(dat)
{
wen_h++;
}
while(dat);
while(!dat);
}
for(i=0;i<8;i++)
{
delayus(14);
wen_l<<=1;
if(dat)
{
wen_l++;
}
while(dat);
while(!dat);
}
for(i=0;i<8;i++)
{
delayus(14);
xiaoyan<<=1;
if(dat)
{
xiaoyan++;
}
while(dat);
while(!dat);
}
{
a[0]=tab[(wen_h)/10];

a[1]=tab[(wen_h)%10];

a[2]=tab[(shi_h)/10];

a[3]=tab[(shi_h)%10];
a[4]=tab[xiaoyan/10];

a[5]=tab[xiaoyan%10];
ShowString(0,a);
}
delayms(100);
shi_h=0;
wen_h=0;
shi_l=0;
wen_l=0;
xiaoyan=0;
}
}

Ⅲ 求一個AT89C51的DHT11溫濕度感測器在液晶1602上顯示的完整程序

我只有常式,呵呵

Ⅳ DHT11的實常式序

//****************************************************************////DHT21使用範例//單片機:AT89S52或STC89C52RC//功能:串口發送溫濕度數據波特率9600//硬體連接:P2.0口為通訊口連接DHT11,DHT11的電源和地連接單片機的電源和地,單片機串口加MAX232連接電腦#include<reg51.h>#include<intrins.h>//typedefunsignedcharU8;/*definedforunsigned8-bitsintegervariable無符號8位整型變數*/typedefsignedcharS8;/*definedforsigned8-bitsintegervariable有符號8位整型變數*/typedefunsignedintU16;/*definedforunsigned16-bitsintegervariable無符號16位整型變數*/typedefsignedintS16;/*definedforsigned16-bitsintegervariable有符號16位整型變數*/typedefunsignedlongU32;/*definedforunsigned32-bitsintegervariable無符號32位整型變數*/typedefsignedlongS32;/*definedforsigned32-bitsintegervariable有符號32位整型變數*/typedeffloatF32;/*(32bits)單精度浮點數(32位長度)*/typedefdoubleF64;/*(64bits)雙精度浮點數(64位長度)*///#defineucharunsignedchar#defineuintunsignedint#defineData_0_time4//-----------------------------------////----------------IO口定義區--------------------////----------------------------------------//sbitP2_0=P2^0;//DATAsbitP2_1=P2^1;sbitP2_2=P2^2;sbitP2_3=P2^3;//---------------------------------------------////----------------定義區--------------------////--------------------------------------------//U8U8FLAG,k;U8U8count,U8temp;U8U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8U8comdata;U8outdata[5];//定義發送的位元組數U8indata[5];U8count,count_r=0;U8str[5]={RS232};U16U16temp1,U16temp2;SendData(U8*a){outdata[0]=a[0];outdata[1]=a[1];outdata[2]=a[2];outdata[3]=a[3];outdata[4]=a[4];count=1;SBUF=outdata[0];}voidDelay(U16j){U8i;for(;j>0;j--){for(i=0;i<27;i++);}}voidDelay_10us(void){U8i;i--;i--;i--;i--;i--;i--;}voidCOM(void){U8i;for(i=0;i<8;i++){U8FLAG=2;//----------------------P2_1=0;//TP2_1=1;//T//----------------------while((!P2_0)&&U8FLAG++);Delay_10us();Delay_10us();//Delay_10us();U8temp=0;if(P2_0)U8temp=1;U8FLAG=2;while((P2_0)&&U8FLAG++);//----------------------P2_1=0;//TP2_1=1;//T//----------------------//超時則跳出for循環if(U8FLAG==1)break;//判斷數據位是0還是1//如果高電平高過預定0高電平值則數據位為1U8comdata<<=1;U8comdata|=U8temp;//0}//rof}//--------------------------------//-----濕度讀取子程序------------//--------------------------------//----以下變數均為全局變數--------//----溫度高8位==U8T_data_H------//----溫度低8位==U8T_data_L------//----濕度高8位==U8RH_data_H-----//----濕度低8位==U8RH_data_L-----//----校驗8位==U8checkdata-----//----調用相關子程序如下----------//----Delay();,Delay_10us();COM();//--------------------------------voidRH(void){//主機拉低18msP2_0=0;Delay(180);P2_0=1;//匯流排由上拉電阻拉高主機延時20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主機設為輸入判斷從機響應信號P2_0=1;//判斷從機是否有低電平響應信號如不響應則跳出,響應則向下運行if(!P2_0)//T!{U8FLAG=2;//判斷從機是否發出80us的低電平響應信號是否結束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判斷從機是否發出80us的高電平,如發出則進入數據接收狀態while((P2_0)&&U8FLAG++);//數據接收狀態COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;P2_0=1;//數據校驗U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp){U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}//fi}//fi}//---------------------------------------//main()功能描述:AT89C5111.0592MHz串口發//送溫濕度數據,波特率9600//----------------------------------------------voidmain(){U8i,j;//ucharstr[6]={RS232};/*系統初始化*/TMOD=0x20;//定時器T1使用工作方式2TH1=253;//設置初值TL1=253;TR1=1;//開始計時SCON=0x50;//工作方式1,波特率9600bps,允許接收ES=1;EA=1;//打開所以中斷TI=0;RI=0;SendData(str);//發送到串口Delay(1);//延時100US(12M晶振)while(1){//------------------------//調用溫濕度讀取子程序RH();//串口顯示程序//--------------------------str[0]=U8RH_data_H;str[1]=U8RH_data_L;str[2]=U8T_data_H;str[3]=U8T_data_L;str[4]=U8checkdata;SendData(str);//發送到串口//讀取模塊數據周期不易小於2SDelay(20000);}//elihw}//mainvoidRSINTR()interrupt4using2{U8InPut3;if(TI==1)//發送中斷{TI=0;if(count!=5)//發送完5位數據{SBUF=outdata[count];count++;}}if(RI==1)//接收中斷{InPut3=SBUF;indata[count_r]=InPut3;count_r++;RI=0;if(count_r==5)//接收完4位數據{//數據接收完畢處理。count_r=0;str[0]=indata[0];str[1]=indata[1];str[2]=indata[2];str[3]=indata[3];str[4]=indata[4];P0=0;}}}

Ⅳ 單片機控制DHT11的程序

首先!是非的意思,&&是與的意思,這段程序的意思是如果數據口一直為低並且u8flag不為0 則u8flag一直自加一,如果數據口為高則跳出,這個實際是在等數據口的跳變。

Ⅵ 基於單片機AT89C51的溫濕度採集系統,用的溫濕度模塊是dht11,顯示器是LCD1602,要 c程序模擬hex文件

在淘寶買個模塊,他會教你怎麼編程序的。

Ⅶ 求單片機程序關於溫濕度。感測器採用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單片機使用dht11

//硬體連接: P2.0口為通訊口連接DHT1
#include <reg51.h>
#include <intrins.h>

typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變數 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變數 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變數 */

#define uchar unsigned char
#define uint unsigned int

sbit P2_0 = P2^0 ;
sbit P2_1 = P2^1 ;
//----------------------------------------------//
//----------------定義區--------------------//
//----------------------------------------------//
U8 U8FLAG;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U8 indata[5];
U8 count, count_r=0;
U16 U16temp1,U16temp2;

sbit d1=P2^4;
sbit d2=P2^5;
sbit d3=P2^6;
sbit d4=P2^7;
uchar code LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xff};
uchar data display[5] = {0x00,0x00,0x00,0x00,0x00};

void Delay(U16 j)
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void delay(unsigned int num)//延時函數
{
while( --num );
}
void Delay_10us(void)
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//串列匯流排
void COM(void)
{

U8 i;
for(i=0;i<8;i++)
{

U8FLAG=2;
//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------

while((!P2_0)&&U8FLAG++);
Delay_10us();
Delay_10us();
// Delay_10us();
U8temp=0;
if(P2_0)U8temp=1;
U8FLAG=2;
while((P2_0)&&U8FLAG++);

//----------------------
P2_1=0 ; //T
P2_1=1 ; //T
//----------------------
//超時則跳出for循環
if(U8FLAG==1)break;
//判斷數據位是0還是1

// 如果高電平高過預定0高電平值則數據位為 1

U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof

}

//--------------------------------
//-----濕度讀取子程序 ------------
//--------------------------------
//----以下變數均為全局變數--------
//----溫度高8位== U8T_data_H------
//----溫度低8位== U8T_data_L------
//----濕度高8位== U8RH_data_H-----
//----濕度低8位== U8RH_data_L-----
//----校驗 8位 == U8checkdata-----
//----調用相關子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------

void RH(void)
{
//主機拉低18ms
P2_0=0;
Delay(180);
P2_0=1;
//匯流排由上拉電阻拉高 主機延時20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主機設為輸入 判斷從機響應信號
P2_0=1;
//判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行
if(!P2_0) //T !
{
U8FLAG=2;////////////////////////////////////////////////////
//判斷從機是否發出 80us 的低電平響應信號是否結束
while((!P2_0)&&U8FLAG++);
U8FLAG=2;
//判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
while((P2_0)&&U8FLAG++);
//數據接收狀態
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
P2_0=1;
//數據校驗

U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi

}

Disp_Temperature()//顯示溫度
{
unsigned char n=0;

// display[4]=temp_data[0]&0x0f;
// display[0]=ditab[display[4]]; //查表得小數位的值

// display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);

display[4]=U8RH_data_H;
display[4]=display[4]%100;
display[3]=display[4]/10;
display[2]=display[1]%10;

display[4]=U8T_data_H;
display[4]=display[4]%100;
display[1]=display[4]/10;
display[0]=display[4]%10;

if(!display[3]) //高位為0,不顯示
{
display[3]=0x0a;
if(!display[1]) //次次高位為0,不顯示
display[1]=0x0a;
}

d1=1;
P0=LEDData[display[0]];
delay(5);d1=0;

d2=1;
P0=LEDData[display[1]];
delay(5);d2=0;

d3=1;
P0=LEDData[display[2]];
delay(5);d3=0;

d4=1;
P0=LEDData[display[3]];
delay(5);d4=0;
}

void main(void)
{
while(1)
{
RH();
Disp_Temperature();
//讀取模塊數據周期不易小於 2S
Delay(20000);
}
}

測試通過的,加分噢

Ⅸ 急求一份DHT11+STC89C52Rc十LCD1602程序(c語言)你能發給我一份嗎謝謝5

#include "reg52.h"
#define uchar unsigned char //宏定義
#define uint unsigned int
sbit DHTIO = P2^7; //管腳定義,DHT11匯流排輸入輸出;
sbit LCDRS = P2^3; //管腳定義,1602液晶RS控制端;
sbit LCDWR = P2^4; //管腳定義,1602液晶W/R控制端;
sbit LCDEN = P2^5; //管腳定義,1602液晶EN使能端;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;
void LCD_Init(); //聲明LCD_Init液晶初始化函數;
void LCD_Display(); //聲明LCD_Display液晶顯示函數;
void Rec_DHT(); //聲明Rec_DHT,DHT11接收數據函數;

//主函數
void main()
{
LCD_Init();
while(1)
{
Rec_DHT();
LCD_Display();
}
}
/*********延時函數********/
void delay(uchar ms)
{
uchar i ;
while(ms--)
{
for(i=0;i<250;i++);
}
}
/***延時10us***/
void delay1()
{
uchar i;
i--;i--;i--;
i--;i--;i--;
}

/********主機發出開始信號*******/
void DHT11_Start() //請結合時序圖分析
{
DHTIO=1;
delay1();
DHTIO=0;
delay(20); //保持電平時間大於18ms
DHTIO=1;
delay1(); //延遲等待20-40us
delay1();
delay1();
delay1();
delay1();
}
/********DHT11接收一個位元組數據*******/
uchar receive_data()
{
uchar i,temp,count;
data_byte=0;
for(i=0;i<8;i++)
{
count=2;
while((!DHTIO)&&count++);//等待50us低電平結束
temp=0;
delay1();delay1();delay1();delay1();
if(DHTIO==1)
{
temp=1;
count=2;
while((DHTIO)&&count++);
}
if(count==1) break;
data_byte<<=1;
data_byte|=temp;
}
return data_byte;
}
/********DHT11接收數據*******/
void Rec_DHT()
{
uchar flag;
DHT11_Start();//主機發出開始信號
DHTIO=1; //拉高等待DHT11響應
if(!DHTIO) //從機發出響應信號
{
flag = 2;
while((!DHTIO) && flag++);
//判斷從機是否發出 80us 的低電平響應信號是否結束
flag = 2;
while(DHTIO && flag++);
//判斷從機是否發出 80us 的高電平,若發出則開始採集數據
Tem_Z = receive_data(); //採集濕度整數部分
Tem_X = receive_data(); //採集濕度小數部分
Hum_Z = receive_data(); //採集溫度整數部分
Hum_X = receive_data(); //採集溫度小數部分
Check = receive_data(); //採集校驗位
DHTIO = 1;
}
}
/*******指令碼*******/
void write_com(uchar com)
{
com=((com&0x01)<<7)|((com&0x02)<<5)|((com&0x04)<<3)|((com&0x08)<<1)|((com&0x10)>>1)|((com&0x20)>>3)|((com&0x40)>>5)|((com&0x80)>>7); //註:此部分因採用的最小系統板電路設計原因,需要將位元組信息逆置;
LCDRS=0;
LCDEN=0;
delay(2);
LCDEN=1;
P0=com;
delay(2);
LCDEN=0;
}
/*******數據碼*******/
void write_data(uchar date)
{
date=((date&0x01)<<7)|((date&0x02)<<5)|((date&0x04)<<3)|((date&0x08)<<1)|((date&0x10)>>1)|((date&0x20)>>3)|((date&0x40)>>5)|((date&0x80)>>7); //註:此部分因採用的最小系統板電路設計原因,需要將位元組信息逆置;
LCDRS=1;
LCDEN=0;
delay(2);
LCDEN=1;
P0=date;
delay(2);
LCDEN=0;
}
/*********************/
/********1602液晶顯示初始化*******/
void LCD_Init()
{
LCDEN=0; //使能低電平
LCDWR=0;
write_com(0x38); //顯示模式設置,設置16*2顯示,5*7點陣,8位數據介面
delay(2);
write_com(0x0c); //顯示開關及游標設置
delay(2);
write_com(0x06);
delay(2);
write_com(0x01); //清屏
delay(2);
}
/**********1602液晶顯示*********/
void LCD_Display()
{
//液晶顯示第一行:溫度顯示;
write_com(0x0c);
write_com(0x81);delay(2);
write_data('T');delay(2);
write_data('e');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0x86);delay(2);
write_data(table[(Tem_Z/10)]);delay(2); //輸出溫度的十位
write_data(table[(Tem_Z%10)]);delay(2); //輸出溫度的個位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0x8c);delay(2);
write_data(0xdf);delay(2); //輸出℃
write_data(0x43);delay(2);
//液晶第二行:濕度顯示;
write_com(0xc1);delay(2);
write_data('H');delay(2);
write_data('u');delay(2);
write_data('m');delay(2);
write_data(':');delay(2);
write_com(0xc6);delay(2);
write_data(table[(Hum_Z/10)]);delay(2); //輸出濕度的十位
write_data(table[(Hum_Z%10)]);delay(2); //輸出濕度的個位
write_data('.');delay(2);
write_data('0');delay(2);
write_data('0');delay(2);
write_com(0xcc);delay(2);
write_data('%');delay(2);
}

Ⅹ 如何把dht11溫度數據顯示在16824液晶顯示屏上

用戶MCU發送一次開始信號後,DHT11從低功耗模式轉換到高速模式,等待主機開始信號結束後,DHT11發送響應信號,送出40bit的數據,並觸發一次信號採集,用戶可選擇讀取部分數據。
從模式下,DHT11接收到開始信號觸發一次溫濕度採集,
匯流排空閑狀態為高電平,主機把匯流排拉低等待DHT11響應,主機把匯流排拉低必須大於18毫秒,保證DHT11能檢測到起始信號。
DHT11接收到主機的開始信號後,等待主機開始信號結束,然後發送80us低電平響應信號。
主機發送開始信號結束後,延時等待20-40us後,讀取DHT11的響應信號,主機發送開始信號後,可以切換到輸入模式,或者輸出高電平均可,匯流排由上拉電阻拉高。
匯流排為低電平,說明DHT11發送響應信號,DHT11發送響應信號後,再把匯流排拉高80us,准備發送數據,每一bit數據都以50us低電平時隙開始,高電平的長短定了數據位是0還是1.格式見下面示。
如果讀取響應信號為高電平,則DHT11沒有響應,請檢查線路是否連接正常。
當最後一bit數據傳送完畢後,DHT11拉低匯流排50us,隨後匯流排由上拉電阻拉高進入空閑狀態。

閱讀全文

與dht11c51液晶顯示程序相關的資料

熱點內容
734什麼錯誤代碼 瀏覽:220
淘寶傳文件軟體 瀏覽:310
韓國電影國語發音 瀏覽:423
第365章天資榜葉凌天 瀏覽:864
大胸乳房電影 瀏覽:200
開網路醫院需要什麼手續 瀏覽:595
2014世界500強word 瀏覽:867
羅蘭曾志偉主演鬼電影全集 瀏覽:961
jsregexpmatch替換 瀏覽:848
飛盧小說vip章節破解方法 瀏覽:497
主角叫陳凡外號屠夫 瀏覽:305
列印文件隱藏軟體 瀏覽:431
js中時分秒正則表達式 瀏覽:569
excel文件查看器 瀏覽:718
電影理發師殺死女友 瀏覽:419
word2003剪貼板 瀏覽:208
手機微信文件已過期或已被清理怎麼辦 瀏覽:997
免費看會員電影網站 瀏覽:639
女生去找在北京送快遞的男朋友的電影 瀏覽:67
子非魚網路技術有限公司 瀏覽:119

友情鏈接