基于51单片机的蔬菜大棚温湿度智能控制系统设计模块使用:使用dht11、74hc595数码管模块、继电器模块
任务
1)根据检测到的温湿度信息控制通风与加热;
2)采用MCU、温湿度传感器、继电器、按键、数码管等;
3)通过按键设定大棚温湿度报警值;
4)上传信息到PC机;
5)当温度或适度超限时用继电器控制小灯状态模拟相应动作的发生。
单片机源程序如下:
////////////////////////////////////////////////////10.3 17:58////////////////////////////////////////////////////////
#include #include #include #define uchar unsigned char #define uint unsigned int sbit RS = P1^0; //定义端口 sbit RW = P1^1; sbit EN = P2^5; sbit DU = P2^0; sbit WE = P2^1; sbit Data = P3^6;//定义数据线 uchar rec_dat[19]; //用于显示的接收数据数组 #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 void cmg88()//关数码管,点阵函数 { DU=1; P0=0X00; DU=0; } /*------------------------------------------------ uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延时1mS DelayUs2x(245); DelayUs2x(245); } } // 判忙函数 bit LCD_Check_Busy(void) { DataPort= 0xFF; RS_CLR; RW_SET; EN_CLR; _nop_(); EN_SET; return (bit)(DataPort & 0x80); } // 写入命令函数 void LCD_Write_Com(unsigned char com) { while(LCD_Check_Busy()); //忙则等待 RS_CLR; RW_CLR; EN_SET; DataPort= com; _nop_(); EN_CLR; } // 写入数据函数 void LCD_Write_Data(unsigned char Data) { while(LCD_Check_Busy()); //忙则等待 RS_SET; RW_CLR; EN_SET; DataPort= Data; _nop_(); EN_CLR; } // 清屏函数 void LCD_Clear(void) { LCD_Write_Com(0x01); DelayMs(5); } // 写入字符串函数 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_Write_Com(0x80 + x); //表示第一行 } else { LCD_Write_Com(0xC0 + x); //表示第二行 } while (*s) { LCD_Write_Data( *s); s ++; } } // 写入字符函数 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) { if (y == 0) { LCD_Write_Com(0x80 + x); } else { LCD_Write_Com(0xC0 + x); } LCD_Write_Data( Data); } // 初始化函数 void LCD_Init(void) { LCD_Write_Com(0x38); /*显示模式设置*/ DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); DelayMs(5); LCD_Write_Com(0x38); LCD_Write_Com(0x08); /*显示关闭*/ LCD_Write_Com(0x01); /*显示清屏*/ LCD_Write_Com(0x06); /*显示光标移动设置*/ DelayMs(5); LCD_Write_Com(0x0C); /*显示开及光标设置*/ } /*------------------------------------------------ DHT11延时函数 ------------------------------------------------*/ void DHT11_delay_us(uchar n) { while(--n); } void DHT11_delay_ms(uint z) { uint i,j; for(i=z;i>0;i--) for(j=110;j>0;j--); } /*------------------------------------------------ DHT11开始信号 ------------------------------------------------*/ void DHT11_start() { Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(20); //延时18ms以上 Data=1; DHT11_delay_us(30); } // 接收八位二进制 uchar DHT11_rec_byte() //接收一个字节 { uchar i,dat=0; for(i=0;i<8;i++) //从高到低依次接收8位数据 { while(!Data); ////等待50us低电平过去 DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //移位使正确接收8位数据,数据为0时直接移位 if(Data==1) //数据为1时,使dat加1来接收数据1 dat+=1; while(Data); //等待数据线拉低 } return dat; } // 接收40bit数据 void DHT11_receive() //接收40位的数据 { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; DHT11_start(); if(Data==0) { while(Data==0); //等待拉高 DHT11_delay_us(40); //拉高后延时80us R_H=DHT11_rec_byte(); //接收湿度高八位 R_L=DHT11_rec_byte(); //接收湿度低八位 T_H=DHT11_rec_byte(); //接收温度高八位 T_L=DHT11_rec_byte(); //接收温度低八位 revise=DHT11_rec_byte(); //接收校正位 DHT11_delay_us(25); //结束 if((R_H+R_L+T_H+T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } /*数据处理,方便显示*/ rec_dat[0]='0'+(RH/10); rec_dat[1]='0'+(RH%10); rec_dat[2] =' '; rec_dat[3] = 'R' ; rec_dat[4] = 'H'; rec_dat[5]=' '; rec_dat[6]=' '; rec_dat[7]=' '; rec_dat[8]=' '; rec_dat[9]='0'+(TH/10); rec_dat[10]='0'+(TH%10); rec_dat[11] =' '; rec_dat[12] = 'C'; rec_dat[13] = ' ' ; rec_dat[14]=' '; rec_dat[15] =(RH/10); rec_dat[16] =(RH%10); rec_dat[17] =(TH/10) ; rec_dat[18]=(TH%10); } } /////////////////数码管/////////////////////////////////////////////// unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; unsigned char disbuf[8]={0,0,0,0,0,0,0,0}; unsigned char code LED_0F[]; // LED字模表 sbit DIO = P1^0; //串行数据输入 sbit rclck = P1^1; //时钟脉冲信号——上升沿有效 sbit SCLK = P1^2; //打入信号————上升沿有效 //----------------------------------------------------------------------------- // 全局变量 uchar LED[8]; //用于LED的8位显示缓存 unsigned char code LED_0F[] = {// 0 1 2 3 4 5 6 7 8 9 A b C d E F - 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf }; void LED_OUT(uchar X) { uchar i; for(i=8;i>=1;i--) { if (X&0x80) DIO=1; else DIO=0; X<<=1; SCLK = 0; SCLK = 1;
上一篇:单片机按键的三种方法
下一篇:基于51单片机的语音合成模块
设计资源 培训 开发板 精华推荐
- LTC3632EMS8E 高效 15V、4mA 稳压器的典型应用电路
- LTM4632EY 3.3V 输入、1.5V/3A VDDQ、0.75V/±3A VTT 和 10mA VTTR 设计的典型应用电路
- 带有 PTN5110 USB PD TCPC PHY 的 Type-C 适配器的典型应用
- AMP_LPF:运放实现有源滤波器DEMO板
- 使用 Analog Devices 的 LTC2256-14 的参考设计
- 单片双电池电源管理器增加运行时间并减少充电时间
- LT3791EFE 98.5% 高效 100W (33.3V/3A) 降压-升压型 LED 驱动器的典型应用电路
- EV1HMC1120LP4、HMC1120LP4E 射频集成电路评估板
- 基于STC89C52RC的智能雾化器
- BD48xxx系列BD48K52电压检测IC的典型应用