|
由于最近的设计,花费不少心思做出了这个系统,虽然很简单,但是还是想发出来一下。当初在找资料的时候,也辛亏是这个平台的老前辈们的资料拯救了我,现在仿真做完了,调试也没什么问题,就发上去给做个留念,也留给下一个像我一样需要的人。 该系统有5个模块,单片机主体、L298驱动电机模块、SHT11湿度传感器模块、RAM6264存储湿度模块以及按键切换模式模块;该系统功能是:湿度传感器采集湿度信息经过51单片机处理,显示于LCD1602液晶显示屏上,当按下湿度传感器下方按钮,即可存储湿度信息进RAM6264存储器(此处是仿真专用按钮,现实中要实现存储需要设置一个定时),当湿度小于设定值,L298驱动直流电机转动启动浇水功能;当按下功能按钮,可切换当前湿度模式和历史检索模式,另外两个按钮在历史检索模式下发挥作用,用于检索上一条和下一条。另外复位电路还模拟了一个检测阴天的复位电路,当为阴天时,则为开关按下,电路进行复位,电机停止。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下(程序带有非常详细的注释):
- #include <reg52.h> //特殊功能寄存器地址的声明的头文件,如P0-P3口的地址
- #include <intrins.h> //单片机内部头文件,包含很多逻辑指令,如左右移指令crol,空指令nop等
- #include <math.h> //数学公式头文件,如开方sqrt
- #include <stdio.h> //标准输入输出头文件,如print,scanf
- #include <1602.h> //LCD1602液晶显示屏的头文件,用来显示当前湿度和历史湿度
- #include <sht11.h> //湿度传感器头文件,用来采集湿度信息
- #include <absacc.h> //绝对地址访问头文件,如XBYTE
- #define uchar unsigned char //宏定义8位无符号整型,最大256
- #define uint unsigned int //宏定义16位无符号整型,最大65536
- #define RAM_6264 XBYTE[RAMADDR] //6264地址范围8000H-9FFFH
- uint RAMADDR ; //定义6264的地址
- uint humi; //定义湿度
- value humi_val; //定义整型和浮点型共同体 humi_val
- uchar error; //用于检验是否出现错误
- uchar checksum; //CRC:循环冗余校验码
- uchar HUMI_data[6]; //该数组存放采集到的湿度信息
- uchar humi_lowest=15.5; //湿度若小于设定的15.5%时,就启动电机浇水
- uchar humi_search; //用于检索历史湿度
- uchar show_humi[5]; //该数组存放显示历史湿度的信息
- uchar presskeynum; //按键次数变量
- uchar last_humi; //上一条湿度信息
- uchar next_humi; //下一条湿度信息
- uchar code word1[]={" a product of "}; //开机LCD显示单词
- uchar code word2[]={" Humi Display "}; //开机LCD显示单词
- uchar code word3[]={" Welcome........"}; //开机LCD显示单词
- sbit k1=P1^0; //切换模式按键
- sbit k2=P1^1; //上一条湿度信息查询按钮
- sbit k3=P1^2; //下一条湿度信息查询按钮
- sbit k4=P1^3; //存储湿度信息仿真键
- sbit IN1=P1^5; //电机驱动,和IN2相反状态时启动
- sbit IN2=P1^6; //电机驱动,和IN1相反状态时启动
- sbit ENA=P1^7; //短接时电机全速启动
- //********延时函数*********//
- void delay(uint z) //z为毫秒数
- {
- int a,b;
- for(a=z;a>0;a--)
- for(b=120;b>0;b--);
- }
- /************************************************************************/
- //函数名:key
- //功能:按键切换两种模式(显示模式和历史查询模式);查询上下条湿度信息
- /************************************************************************/
- void key()
- {
- if (k1==0) //查询按键是否被按下
- {
- delay(30); //消抖,30ms检查是否是误触
- if (k1==0) //当按键被按下
- {
- presskeynum++; //按键次数加一,切换模式
- if(presskeynum==2) //因为只有两个模式,当再次按下按键,按键次数就会回到0
- presskeynum=0; //因为只有两个模式,当再次按下按键,按键次数就会回到0
- while(k1==0); //按键不被松开就一直循环
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- }
- }
- if(presskeynum==1) //查询历史湿度模式
- {
- if(k2==0) //查询上一条湿度按键是否被按下
- {
- delay(30); //消抖,30ms检查是否是误触
- RAMADDR--; //存储器中指针向前移动一位
- if (RAMADDR<0x8000) //如果指针指向第一位
- {
- RAMADDR=0x8000; //那么指针就停在第一位
- }
- humi_search=RAM_6264;//将6264存储器当前地址的湿度信息取出来放在humi_search中
- while(k2==0); //按键不被松开就一直循环
- }
- if(k3==0) //查询下一条湿度按键是否被按下
- {
- delay(30); //消抖,30ms检查是否是误触
- RAMADDR++; //存储器中指针向后移动一位
- if (RAMADDR>0x83ff) //如果指针指向最后一位(1k)
- RAMADDR=0x83ff; //那么指针就停在最后一位
- humi_search=RAM_6264; //将6264存储器当前地址的湿度信息取出来放在humi_search中
- while(k3==0); //按键不被松开就一直循环
- }
- }
- }
- /************************************************************************/
- //程序名:main主函数
- //功能:,控制显示屏显示湿度、查询湿度;驱动电机;存储8K湿度信息;数据传输;湿度采样及AD转换
- /************************************************************************/
- void main()
- {
- RAMADDR=0x8000; //6264首地址
- LCD_Initial(); //液晶初始化
- GotoXY(0,0); //选择湿度显示开始位置,在第一行第一个字符处
- Print_slow(word1); //显示 a product of 字符串
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0); //选择湿度显示开始位置,在第二行第一个字符处
- Print_slow(word2); //显示 Humidity display 字符串
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- GotoXY(0,0); //选择湿度显示开始位置,在第一行第一个字符处
- Print_slow(word3); //显示 Welcome........ 字符串
- LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
- while(1)
- {
- key(); //开机后,按键在任何时候按下都可切换模式
- if(presskeynum==0) //显示模式,显示当前采集回来的湿度
- {
- s_connectionreset(); //启动连接复位
- error=0; //初始化error=0,即没有错误
- error+=s_measure((unsigned char*)&humi_val.i,&checksum,HUMI); //湿度测量
- if(error!=0) //如果error仍为0则发生错误,因为上一步已经加上要测量的湿度信息
- s_connectionreset(); //如果发生错误,系统复位
- else
- {
- humi_val.f=(float)humi_val.i; //转换为浮点数
- calc_sth10(&humi_val.f); //修正相对湿度及温度
- humi=humi_val.f*10; //修正后的湿度乘10,方便存储
- if(humi/10<humi_lowest) //当湿度小于最小湿度20.5%时,启动电机浇水
- {
- ENA=1; //高电平,最高速转动
- IN1=1; //电机正转
- IN2=0; //电机正转
- }
- else //当湿度小于最小湿度20.5%时,启动电机浇水
- {
- ENA=0;
- IN1=0; //电机停转
- IN2=0; //电机停转
- }
-
- GotoXY(0,0); //选择温度显示开始位置,第一行第一个字符处
- Print(" Current Humi: "); //当前湿度
- GotoXY(0,1); //选择温度显示开始位置,第二行第一个字符处
- Print("Humi: % "); //5格空格
- GotoXY(5,1); //选择温度显示开始位置,第二行第六个字符处
- HUMI_data[0]=humi/1000+'0'; //湿度百位
- if (HUMI_data[0]==0x30) //如果首位为0,ascall码0x30=‘0’
- HUMI_data[0]=0x20; //首位为空格,ascall码0x20=‘空格’
- HUMI_data[1]=humi%1000/100+'0'; //湿度十位
- HUMI_data[2]=humi%100/10+'0'; //湿度个位
- HUMI_data[3]='.' ; //小数点
- HUMI_data[4]=humi%10+'0'; //湿度小数点后第一位
- HUMI_data[5]='\0'; //显示停止标志。str=‘\0‘,停止
- Print(HUMI_data); //输出湿度
- if(k4==0) //按下确定按键
- {
- delay(30); //消抖30ms
- if(k4==0) //按下确定键
- {
- RAM_6264=humi; //将湿度信息存储于6264存储器中
- RAMADDR++; //地址指针后移一位
- while(k4==0); //按键不被松开就一直循环
- }
- }
- }
- }
- if(presskeynum==1) //历史查询湿度时显示的内容
- {
- show_humi[0]=humi_search%1000/100+'0'; //历史湿度十位
- show_humi[1]=humi_search%100/10+'0'; //历史湿度个位
- show_humi[2]='.' ; //小数点
- show_humi[3]=humi_search%10+'0'; //历史湿度信息小数点后一位
- show_humi[4]='\0'; //显示停止标志。str=‘\0‘,停止
- GotoXY (0,0); //选择温度显示开始位置,第一行第一个字符处
- Print("History Of Humi:"); //历史湿度
- GotoXY(0,1); //选择温度显示开始位置,第二行第一个字符处
- Print("Humi: % "); //5格空格
- GotoXY (5,1); //选择温度显示开始位置,第二行第六个字符处
- Print(show_humi); //显示历史湿度
- }
- }
- }
复制代码
所有资料51hei提供下载:
基于SHT11湿度传感器的LCD显示及历史检索 .zip
(135.9 KB, 下载次数: 22)
|
评分
-
查看全部评分
|