找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1360|回复: 0
打印 上一主题 下一主题
收起左侧

protuse温度控制仿真

[复制链接]
跳转到指定楼层
楼主
ID:699003 发表于 2020-2-27 13:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
源程序代码
1.主函数部分
#include <reg52. h> //51 系列单片机
#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数据端
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) ;//发送一个字节
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,'. );
/*-------
发送一个字符串.
void SendByte (uns igned char dat)
SBUF = dat;
while(!TI);
TI=0;
void SendStr (unsigned char *s)
while(*s!='\0')// \0表示字符串结束标志,通过检测是否
字符串末尾
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 // 串行中断服务程序
uns igned char Temp;
//定义临时变量
if(RI)
//判断是接收中断产生
RI=0;
//标志位清零
Temp=SBUF;
//读入缓冲区的值
P1=Temp;
//把值输出到P1口,用于
观察
SBUF=Temp;
//把接收到的值再发回
电脑端
if(TI)
//如果是发送标志位,清
TI=0;
}
void main()
{ bee=0;
InitLcd () ;//液晶初始化
loading() ;
DelayMs (100) ;
InitUART();
if (key1==0)
while(1)
DHT11() ;//湿度温度数据读取
De I ayMs (50) ;
show_ main( ;
DelayMs (200) ;
SendStr (Sendbuf) ;
}
}
2 DHT11部分
/*DHT11温湿传感器驱动*/
#include <reg52. H>
#inc lude"Delay. h"
#inc lude"DHT11. h"
#inc lude<intrins. h>
#inc lude<stdio. h>
sbit DQ=P2' 5; //DHT11 数据线//单总线 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 响应80us的低电平信号
{
f=1;
}
while(DQ); //dht 在拉高80us
return f;
uchar rdat() //读一个字节
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个字节的
bit f;
f=DHT_ init();
if(f==1)
rh_ _h_ dat=rdat(); //前两个是湿度的整数、小数
rh_ 1 _dat=rdat () ;
t_ h_ _dat=rdat(); //后两个是温度的整数小数
t_ 1_ _dat=rdat();
jy_ dat=rdat(); //最后-位校验位
DQ=1;
check=rh_ h_ _dat+rh_ I_ dat+t_ h_ _dat+t_ 1_ dat; //检验数据是否
正确
i--;
i-- ;
i--;
}
/*--
mS延时函数,含有输入参数unsigned char t, 无返回值
void De layMs (unsigned int t)
{
while(t--)
int d;
for (d=100;d>0;d--);
delay10us () ;
}
i--;
i-- ;
i--;
}
/*--
mS延时函数,含有输入参数unsigned char t, 无返回值
void De layMs (unsigned int t)
{
while(t--)
int d;
for (d=100;d>0;d--);
delay10us () ;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表