完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
模拟智能灌溉系统 实现土壤湿度测量、土壤湿度和时间显示、湿度阈值设定及存储等基本功能。 1、通过电位器输出电压信号模拟湿度传感器的输出信号,再通过PCF8591采集完成土壤湿度的测量。 2、DS1302提供时间信息,并在数码管上显示。 3、按键设置湿度阈值,并存储到EEPROM中。 4、继电器模拟灌溉设备。 5、自动模式:系统测量湿度,并根据湿度阈值判断打开或关闭灌溉设备。 手动模式:系统测量湿度,并根据湿度阈值判断是否提示湿度过低。提示后,需要人为打开灌溉设备。 智能灌溉系统的基本功能: 1、系统上电后处于自动工作状态,系统初始温度阈值为50%, 低于则设备打开,高于则设备关闭,L1亮指示; 2、手动工作状态,通过按键控制或打开设备,L2亮指示; 系统处于手动工作状态时,若湿度低于阈值,蜂鸣器发出提示音, 可通过按键S6关闭提醒功能; 3、按键S7为系统工作状态切换按键; 手动工作状态:S6控制蜂鸣器启动与关闭; S5打开设备; S4关闭设备; 自动工作状态:S6为温度阈值调整按键,进入或退出调整界面; S5阈值加1; S4阈值减1; 4、DS1302提供实时时钟,初始时间08时30分; 模拟智能灌溉系统编译的.hex文件在附件中。
模拟智能灌溉系统.zip
(2.88 KB, 下载次数: 58
)
本文提供智能灌溉系统的主要源码: #include #include #include"IIC.h" #include"DS1302.h" #include"KEY.h" unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf}; // 0 1 2 3 4 5 6 7 8 9 - unsigned char dspbuf[8]={10,10,10,10,10,10,10,10}; unsigned char dspcom,flag,num; unsigned char hnumi; //当前湿度值 unsigned int hnumi_int; //整型当前湿度值 unsigned int hnumidity_int; //整型湿度阈值 unsigned char EEPROM_flag; ***it S7=P3^0; void timer_Init(); void Display(); void Hnumidity_Judge(); //湿度值判断 void Display_Pro0(); //显示数据处理 void Display_Pro1(); //显示数据处理 void System_Change() { if(S7==0) { if(S7==0) { AUTO_flag=~AUTO_flag; while(!S7); } } } void main() { Timer_Init(); //初始化定时器0,用于显示 ADC_Init(); //初始化ADC,用于采样湿度 DS1302_Init(); //初始化DS1302,用于产生时间 DS1302_SetTime(Init); //设置初始时间 EEPROM_Write(0x00,hnumidity); //设置初始湿度 while(1) { while(!AUTO_flag) //自动模式 { LED_temp=0; LED_Pro(); //指示灯L1亮 KEY_Scan(); //按键扫描 if(!Display_flag) { Display_Pro1(); //处理时间与当前湿度值数据等待显示 EEPROM_Write(0x00,hnumidity1); } if(flag&&set_flag) //每200ms处理一次 { flag=0; hnumidity=EEPROM_Read(0x00); //读取湿度阈值 DS1302_GetTime(); //读取当前时间 hnumi=ADC_Read(); //读取当前湿度值 if(Display_flag) { Display_Pro0(); //处理时间与当前湿度值数据等待显示 } Hnumidity_Judge(); //判断当前湿度值 P0=0x00; //清楚LED数据对蜂鸣器、继电器的影响 RELAY_Pro(); //启动还是关闭继电器 } } while(AUTO_flag) //手动模式 { LED_temp=1; LED_Pro(); //指示灯L2亮 hnumidity=EEPROM_Read(0x00); //读取湿度阈值 if(flag) //每200ms处理一次 { flag=0; DS1302_GetTime(); //读取当前时间 hnumi=ADC_Read(); //读取当前湿度值 Display_Pro0(); //处理时间与当前湿度值数据等待显示 Hnumidity_Judge(); //判断当前湿度值 P0=0x00; //清楚LED数据对蜂鸣器、继电器的影响 KEY_Scan(); //按键扫描 BUZZER_Pro(); //是否启动蜂鸣器 RELAY_Pro(); //启动还是关闭继电器 } } } } void T0_Ser() interrupt 1 { TH0=(65536-2000)/256; TL0=(65536-2000)%256; Display(); //EEPROM_Write(0x00,hnumidity); System_Change(); if(++num==100) { flag=1; num=0; } } void Hnumidity_Judge() { if(hnumi if(!AUTO_flag)//自动模式 { RELAY_temp=0; //启动设备 } if(AUTO_flag&&count==1)//手动模式 { BUZZER_temp=0; //启动蜂鸣器 } } if(hnumi>hnumidity|hnumi==hnumidity)//湿度大于50% { if(!AUTO_flag)//自动模式 { RELAY_temp=1; //关闭设备 } if(AUTO_flag&&count==1)//手动模式 { count=1; } } } void Display_Pro0() { hnumi_int=(unsigned int)hnumi/2.56; dspbuf[0]=now[2]/16; //时 dspbuf[1]=now[2]%16; dspbuf[2]=11; dspbuf[3]=now[0]/16; //分 dspbuf[4]=now[0]%16; dspbuf[5]=10; dspbuf[6]=hnumi_int/10; //当前湿度 dspbuf[7]=hnumi_int%10; } void Display_Pro1() { hnumidity_int=(unsigned int)hnumidity1/2.56; dspbuf[0]=11; dspbuf[1]=11; dspbuf[2]=10; dspbuf[3]=10; //分 dspbuf[4]=10; dspbuf[5]=10; dspbuf[6]=hnumidity_int/10; //当前湿度 dspbuf[7]=hnumidity_int%10; } void Timer_Init() { P2=((P2&0x1f)|0xa0); P0&=0x00; //关闭蜂鸣器,继电器 P2&=0x1f; TMOD|=0x01; TH0=(65536-2000)/256; TL0=(65536-2000)%256; EA=1; ET0=1; TR0=1; } void Display() { P2=((P2&0x1f)|0xe0); P0=0xff; P2=((P2&0x1f)|0xc0); P0=0x01< P0=table[dspbuf[dspcom]]; P2&=0x1f; if(++dspcom==8)dspcom=0; } 由于篇幅的限制,基本的模块驱动这里省略,希望大家自己添加。 |
|
相关推荐
|
|
1330 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1263 浏览 3 评论
2430 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1416 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1847 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 11:12 , Processed in 0.846068 second(s), Total 55, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号