標(biāo)題: protuse溫度控制仿真 [打印本頁]
作者: ty786731573 時間: 2020-2-27 13:48
標(biāo)題: protuse溫度控制仿真
源程序代碼
1.主函數(shù)部分
#include <reg52. h> //51 系列單片機(jī)
#inc lude<intr ins. h>
#include<stdio. h>
#inc lude"De lay. h"
#inc lude"DHT11. H"
#define uint unsigned int //宏定 義
#define ulint unsigned long int //宏定義
#def ine uchar uns i gned char
/*有符號8位整型變量
*/
#define KeyPort P3
#define len 60
#define DataPort PO
//LCD1602數(shù)據(jù)端
uchar
flag_ MQ7, flag_ MQ2, flag_ TSC, flag_ RED, flag_ SHAKE, flag_ FI
RE;
uchar rh_ _h_ dat, rh_ I_ _dat, t_h_ _dat,t_ _I_ _dat, jy_ _dat, check;
uchar a,b,c,d,e, f;
uchar ge, shi, bai, qi an, wan, shiwan;
//顯示變量
uchar flag_ RH=0, flag_ T=0, flag_ main=1;
uchar RH_ c, T_ c;
uchar shidu, flag;
unsigned char flag1=0, flag_ alarm, flag_ alarm1=0;
uchar number TO, numberT1 ;
uchar a1=0, b1=20, c1=0, d1=0;
uchar Sendbuf[]=" ABCD\r\n";
void DHT11();
void SendByte (uns igned char dat) ;
void convers ion(long temp_ data) ;
void Wr iteDataLCM (uchar dataW) ;
void Wr iteCommandL CM (uchar CMD, uchar Attribc) ;
void Displ ayOneChar (uchar X, uchar Y, uchar DData) ;
void InitLcd();
void loading() ;
void show_ main() ;
void show_ RH() ;
void show_ T();
void SendStr (unsigned char *s) ;//發(fā)送一個字節(jié)
void suspend_ int() ;
void SendByte (uns igned char dat) ;
sbit
LCM_ RS=P2^2;. //LCD1602 命令端口
sbit
LCM_ RW=P2^1; //LCD1602 命令端口
sbit
LCM_ EN=P2^ 0; //LCD1602 命令端口
sbit key1=P1" 2;
sbit bee=P2 5;
void InitLcd ()
Wr iteCommandl .CM (0x38, 1) ;
Wr iteCommandL .CM (0x08, 1) ;
Wr iteCommandLCM(0x01, 1);
Wr iteCommandL CM (0x06, 1) ;
Wr iteCommandl .CM (0x0c, 1) ;
}
/*******************************/
void Displ ayOneChar (uchar X, uchar Y, uchar DData)
Y&=1;
X&=15;
if (Y)X |=0x40;
x|=0x80;
Wr iteCommandl .CM(X, 0) ;
Wr iteDataLCM (DData) ;
}
void WaitForEnable (void)
DataPor t=0xff;
LCM_ RS=0;LCM_ RW=1;_ nop_ () ;
LCM_ EN=1; .nop_ 0); _nop_ 0);
whi le (DataPort&0x80) ; .
LCM_ EN=0;
/****************************/
void Wr iteCommandL CM (uchar CMD, uchar Attr ibc)
if (Attr ibe) WaitForEnable() ;
LCM_ RS=0;LCM_ RW=0;_ nop_ () ;
DataPort=CMD; _nop_ 0); _nop_ () ;
LCM_ EN=1;_ nop_ 0; nop_ ();LCM_ EN=0;
/****************************/
void Wr iteDataLCM (uchar dataW)
Wa itForEnable() ;
LCM_ RS=1;LCM_ _RW=0; _nop_ 0;
DataPort=dataW;_ nop_ 0); nop_ ():
LCM_ EN=1; _nop_ (); _nop_ () ;LCM_ EN=0;
}
void DHT11()
read() ;
if(flag==1)
{
a = 0x30+t_ h_ dat/10; //分離溫度十位
b = 0x30+t_ h_ dat%10; //分離溫度個位
e = 0x30+rh_ h_ dat/10; //分離濕度十位
f=
0x30+rh_ h_ _dat%10; // 分離濕度個位
Sendbuf[0]=e;
Sendbuf[1]=f;
Sendbuf[2]=a;
Sendbuf [3]=b;
de lay (30) ;
}
void convers ion(long temp data) // 取值運算
{
shiwan=temp_ data/100000+0x30 ;
temp_ data=temp_ _data%100000; // 取余運算
wan=temp_ data/ 10000+0x30 ;
temp_ data=temp_ data%10000; // 取余運算
qian=temp_ data/ 1000+0x30 ;
temp_ _data=temp_ _data%1000;
//取余運算
ba i=temp_ _data/ 100+0x30
temp_ data=temp_ data%100;
//取余運算
shi=temp_ data/ 10+0x30
temp_ data=temp_ data%10;
//取余運算
ge=temp_ data+0x30;
}
void show main()
void show_ main()
{
InitLcd() ;
DisplayOneChar(3, 0, e);
DisplayOneChar(4, 0. f);
DisplayOneChar (5.0, '%');
//濕度顯示
DisplayOneChar (6, 0, 'R');
DisplayOneChar(7,0, 'H');
De | ayMs(1) ;
Displ ay0neChar (9, 0,'T');
Di spl ay0neChar(10,0, ':);
Di spl ay0neChar(11,0, a);
DisplayOneChar(12, 0, b) ;
//溫度顯示
Disp | ay0neChar (13, 0, 0XDF) ;
Di spl ay0neChar(14,0, 'C');
}
void loading ()
DisplayOneChar(3, 0,'L');
DisplayOneChar(4, 0,'o');
DisplayOneChar(5,0,'a');
DisplayOneChar (6, 0, 'd'):
DisplayOneChar(7,0,'i');
Disp lay0neChar(8, 0, 'n');
Displ ay0neChar (9,0,'g');
Displ ay0neChar(10,0,'.');
DisplayOneChar(11.0.'.');
DisplayOneChar(12, 0,'. );
/*-------
發(fā)送一個字符串.
void SendByte (uns igned char dat)
SBUF = dat;
while(!TI);
TI=0;
void SendStr (unsigned char *s)
while(*s!='\0')// \0表示字符串結(jié)束標(biāo)志,通過檢測是否
字符串末尾
SendByte (*s) ;
s++;
}
void InitUART (void)
//串口初始化
{
SCON = 0x50;
. // SCON: 模式1, 8-bit
UART,使能接收
TMOD |= 0x20;
// TMOD: timer 1, mode 2,
8-bit重裝
TH1 = 0xFD;
// TH1:重裝值9600波
特率晶振11.0592MHz
TR1
=1;
// TR1: timer 1打開
EA
= 1;
//打開總中斷
// ES
= 1;
//打開串口中斷
}
void UART_ SER (void) interrupt 4 // 串行中斷服務(wù)程序
uns igned char Temp;
//定義臨時變量
if(RI)
//判斷是接收中斷產(chǎn)生
RI=0;
//標(biāo)志位清零
Temp=SBUF;
//讀入緩沖區(qū)的值
P1=Temp;
//把值輸出到P1口,用于
觀察
SBUF=Temp;
//把接收到的值再發(fā)回
電腦端
if(TI)
//如果是發(fā)送標(biāo)志位,清
零
TI=0;
}
void main()
{ bee=0;
InitLcd () ;//液晶初始化
loading() ;
DelayMs (100) ;
InitUART();
if (key1==0)
while(1)
DHT11() ;//濕度溫度數(shù)據(jù)讀取
De I ayMs (50) ;
show_ main( ;
DelayMs (200) ;
SendStr (Sendbuf) ;
}
}
2 DHT11部分
/*DHT11溫濕傳感器驅(qū)動*/
#include <reg52. H>
#inc lude"Delay. h"
#inc lude"DHT11. h"
#inc lude<intrins. h>
#inc lude<stdio. h>
sbit DQ=P2' 5; //DHT11 數(shù)據(jù)線//單總線 10
extern uchar rh_ h_ dat, rh_ I_ dat,t_ _h_ dat, t_ I_ dat, jy_ dat, check;
uint count;
extern uchar shidu, flag;
uchar k=0x10; .
bit DHT_ init() //DHT11的初始存在
bit f=0;
DQ=1;
_ nop_ 0;
DQ=0; //拉低總線大于18ms
delay(18) ;
DQ=1; //拉高
delay10us();
de lay10us();
delay10us() ;
delay10us0; //延時30us
while(!DQ) //DHT 響應(yīng)80us的低電平信號
{
f=1;
}
while(DQ); //dht 在拉高80us
return f;
uchar rdat() //讀一個字節(jié)
uint i, dat;
for(i=0;i<8;i++)
while(!DQ) ;
_nop
0; nop_ 0;_ nop_ ();
while (DQ)
count++;
dat=_ crol_ (dat, 1) ;
if (count>5) // 高低電平信號的時間不同,若大于50ms則為1
{
else //否則為0
dat=dat&Oxfe;
count=0;
. nop_ (); nop_ 0; _nop_ 0;
return dat;
}
void read() //讀5個字節(jié)的
bit f;
f=DHT_ init();
if(f==1)
rh_ _h_ dat=rdat(); //前兩個是濕度的整數(shù)、小數(shù)
rh_ 1 _dat=rdat () ;
t_ h_ _dat=rdat(); //后兩個是溫度的整數(shù)小數(shù)
t_ 1_ _dat=rdat();
jy_ dat=rdat(); //最后-位校驗位
DQ=1;
check=rh_ h_ _dat+rh_ I_ dat+t_ h_ _dat+t_ 1_ dat; //檢驗數(shù)據(jù)是否
正確
i--;
i-- ;
i--;
}
/*--
mS延時函數(shù),含有輸入?yún)?shù)unsigned char t, 無返回值
void De layMs (unsigned int t)
{
while(t--)
int d;
for (d=100;d>0;d--);
delay10us () ;
}
i--;
i-- ;
i--;
}
/*--
mS延時函數(shù),含有輸入?yún)?shù)unsigned char t, 無返回值
void De layMs (unsigned int t)
{
while(t--)
int d;
for (d=100;d>0;d--);
delay10us () ;
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |