基于单片机的温室大棚研究 - 图文(6)

2019-04-21 19:42

程序清单

//****************************************************************// // DHT11温度、湿度采集 //单片机 : AT89S52 或 STC89C51RC

//功能 : (1)串口发送温湿度数据 波特率 9600 // (2)液晶1602显示温度、湿度值

// (3)可设置温度、湿度上下限报警值,报警值具有数据保存功能(数据保存在IIC AT24C02)

// (4)可查询温度、湿度上限、下限报警值 //硬件连接:P2.3口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑

//****************************************************************//

#include #include

#include //Keil library #include //Keil library

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位整型变量 */

typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */

typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */

typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */

typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */ //

#define uchar unsigned char #define uint unsigned int

#define Data_0_time 4

//----------------------------------------------//

//----------------IO口定义区--------------------// //----------------------------------------------//

#define DataPort P1 //LCD1602数据端口

sbit LCM_RS=P2^0; //LCD1602命令端口 sbit LCM_RW=P2^1; //LCD1602命令端口

24

sbit LCM_EN=P2^2; //LCD1602命令端口 sbit P2_0 = P2^3 ; sbit sda=P3^7;// sbit scl=P3^6;//

bit write=0; //写24C02的标志 sbit AlarmTemp=P2^4; sbit AlarmHum=P2^5; sbit staticOK=P2^6; bit set_temp_up=0; bit set_temp_down=0; bit set_humidity_up=0; bit set_humidity_down=0; sbit si=P3^4; sbit rclk=P3^3; sbit sclk=P3^2;

sbit key_set=P0^0; sbit key_up=P0^1; sbit key_down=P0^2; sbit key_ok=P0^3;

//----------------------------------------------// //----------------定义区-------------------- // //----------------------------------------------// 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,num; U8 str[5]={\U16 U16temp1,U16temp2;

U8 a,b,c,aa,selectnum=0,value,downnum=0,checknum; U8 value_shi,value_ge,downnum_shi,downnum_ge; U8 shidu_shi,shidu_ge,wendu_shi,wendu_ge; uchar a,num,sec,tcnt,ge,shi,temp;

U8 temp_uplimit,temp_lowlimit,humidity_uplimit,humidity_lowlimit;

U8 Alarm_temp_up,Alarm_temp_low,Alarm_humidity_up,Alarm_humidity_low; void Delay(U16 j) { U8 i;

25

for(;j>0;j--) scl=1; { delay(); for(i=0;i<27;i++); }

delay();

} void write_byte(uchar date) sda=1; } { {

void delay1ms(uint z) { uint x,y; for(x=z;x>0;x--)

for(y=110;y>0;y--); } void delay() { ;; } void start() //开始信号 { sda=1; delay(); scl=1; delay(); sda=0; delay(); } void stop() //停止 { sda=0; delay(); scl=1; delay(); sda=1; delay(); } void respons() //应答 { uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; void init() }

delay();

uchar i,temp; temp=date; for(i=0;i<8;i++) temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); } scl=0; delay(); sda=1; delay(); } uchar read_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k;

26

}

void write_add(uchar address,uchar date) {

start();

write_byte(0xa0); respons();

write_byte(address); respons();

start();

write_byte(0xa0); respons();

write_byte(address); respons(); start();

write_byte(0xa1); respons();

date=read_byte(); stop(); return date; }

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_10us(void) {

U8 i; i--; i--; i--; i--; i--; i--; }

void COM(void) { U8 i;

write_byte(date); respons(); stop(); }

uchar read_add(uchar address) { uchar date;

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 }

//-------------------------------- //-----湿度读取子程序 ------------ //-------------------------------- //----以下变量均为全局变量--------

27

//----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------ //----湿度高8位== U8RH_data_H----- //----湿度低8位== U8RH_data_L----- //----校验 8位 == U8checkdata----- //----调用相关子程序如下---------- //---- Delay();, Delay_10us();,COM(); {

DataPort=0xff;

LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; }

//--------------------------------

/*******************************/ /*******************************/ void WaitForEnable(void)

void WriteCommandLCM(uchar CMD,uchar Attribc) {

if(Attribc)WaitForEnable(); LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0; }

/*******************************/ void WriteDataLCM(uchar dataW) { WaitForEnable();

LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_();

LCM_EN=1;_nop_();_nop_();LCM_EN=0; }

/***********************************/

void InitLcd() {

WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); }

/***********************************/

void DisplayOneChar(uchar X,uchar Y,uchar DData) { /*******************************/

Y&=1; X&=15; if(Y)X|=0x40; X|=0x80;

WriteCommandLCM(X,0); WriteDataLCM(DData); }

/**************************************

延时5微秒(STC90C51RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改

当改用1T的MCU时,请调整此延时函数**************************************/

void Delay5us() {

_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); }

void conversion(uint temp_data,uint temp1_data) {

wendu_shi=temp_data/10+0x30 ; temp_data=temp_data; //取余运算

wendu_ge=temp_data+0x30;

shidu_shi=temp1_data/10+0x30 ; temp1_data=temp1_data; //取余运算

shidu_ge=temp1_data+0x30; }

28


基于单片机的温室大棚研究 - 图文(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:建筑防火施工方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: