一.硬件方案
工作原理是由STC89C52单片机和ADC0832组成系统的核心部分,湿度传感器将采集到的数据直接传送到ADC0832的IN端作为输入的模拟信号。选用湿度传感器和AD转换,电路内部包含有湿度采集、AD转换、单片机译码显示等功能。单片机需要采集数据时,发出指令启动A/D转换器工作,ADC0832根据送来的地址信号选通IN1通道,然后对输入的模拟信号进行转换,转换结束时,EOC输出高电平,通知单片机可以读取转换结果,单片机通过调用中断程序,读取转换后的数据。最后,单片机把采集到的湿度数据经过软件程序处理后送到LCD1602进行显示。
主要由STC89C52单片机+ADC0832+LCD1602液晶+土壤湿度传感器+防水温度传感器+抽水电机+ 按键+蜂鸣器设计;如图:
二.设计功能
(1)液晶第一行显示 实际的湿度,液晶第二行显示 湿度上限值 湿度下限值。
(2)按键说明:从左边第一个起,减键、加键、设置键。。
(3)可以设置湿度和温度的上下限报警范围,并具有掉电保存功能,保存在STC单片机内部,上电无需重新设置。
(4)当湿度低于下限值时,打开水泵进行抽水自动灌溉同时声光报警,当湿度高于上限值时,自动关闭水泵停止灌溉。
(5)当温度高于上限值时,打开水泵进行抽水自动灌溉同时声光报警,当温度低于下限值时,自动关闭水泵停止灌溉。
(6)具有手动模式,按减键手动打开抽水电机,可以按加键手动关闭抽水电机。
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:
(2)Protues仿真图如下:
(3)PCB图如下:
四.软件设计
(1)程序流程图
(2)主程序源码
/***************主函数*****************/
void main()
{
init_1602(); //1602液晶初始化
time_init(); //初始化定时器
while(1)
{
key(); //独立按键程序
if(key_can < 10)
{
key_with(); //按键按下要执行的程序
}
if(flag_300ms == 1)
{
flag_300ms = 0;
clock_h_l(); //报警函数
if(beep == 1)
{
shidu = Adc0832(0); //读出湿度
shidu = 99 - shidu * 99 / 255;
}
if(menu_1 == 0)
{
write_sfm2(1,9,shidu); //显示湿度等级
}
}
delay_1ms(1);
}
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{
static uchar value;
TH0 = 0x3c;
TL0 = 0xb0; // 50ms
value ++;
if(value % 6 == 0)
{
flag_300ms = 1; //300ms
value = 0;
}
}
关键字:51单片机 ADC0832
引用地址:
基于51单片机的盆栽自动浇花系统
推荐阅读最新更新时间:2024-11-03 21:18
基于51单片机的电子记分牌C程序编程
#include reg52.h sbit r1=P2^0; sbit r2=P2^1; sbit h1=P3^0; sbit h2=P3^1; void delay(unsigned char x); char scank(); void display(char); unsigned char dispcode ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90}; void main() { char num=0,keynum; while(1) { keynum=scank(); num=num+keynum; if(num 0) n
[单片机]
MCS-51单片机内部数据存储器的RAM结构详细解析
内部数据存储器低128单元 8051单片机的内部RAM共有256个单元,通常把这256个单元按其功能划分为两部分:低128单元(单元地址00H~7FH)和高128单元(单元地址80H~FFH)。如图所示为低128单元的配置图。 寄存器区 8051共有4组寄存器,每组8个寄存单元(各为8),各组都以R0~R7作寄存单元编号。寄存器常用于存放操作数中间结果等。由于它们的功能及使用不作预先规定,因此称之为通用寄存器,有时也叫工作寄存器。4组通用寄存器占据内部RAM的00H~1FH单元地址。 在任一时刻,CPU只能使用其中的一组寄存器,并且把正在使用的那组寄存器称之为当前寄存器组。到底是哪一组,由程序状态字寄存器PSW中RS1、R
[单片机]
51单片机I/O模拟I2C 程序
/ 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序,如发送数据 及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的 与用户程序连接并扩展..... 经过本人验,绝对好用! / bit ack; /*应答标志位*/ /* 起动总线函数 函数原型: void Start_I2c(); 功能: 启动I2C总线,即发送I2C起始条件. / void Start_I2c() { SDA=1; /*发送起始条件的数据信号*/ _Nop(); SCL=1; _Nop(); /*起始条件建立时间大于4.7u
[单片机]
51单片机的延时及定时器
经常看些东西,有时在书上,有时在网上,还有的是突然醒悟,也该做一些总结,最近想总结一下单片机的定时以及延时问题。 单片机主要是两种延时方式: 1.硬件延时:要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时; 2.软件延时:软件延时有时候不能够做到非常精确地延时,主要靠循环体或是一些无意义的指令来完成。 单片机都有一个属于自己的晶振频率:11.0592Mhz(主要是为了设置波特率的方便),12Mhz,6Mhz等(后面的例子全都用12M晶振)。对于12Mhz的晶振频率,一个机器周期为1us,对于51单片机的库函数就有nop()这个函数(调用时需要#include intrins.h ),实现延时一个
[单片机]
基于51单片机的DS18b20汇编源程序
;********************************** FLAG1 BIT F0 ;DS18B20存在标志位 DQ BIT P1.7 TEMPER_L EQU 29H TEMPER_H EQU 28H A_BIT EQU 35H B_BIT EQU 36H ;************程序起始******************** ORG 0000H AJMP MAIN ORG 0100H ;**************主程序开始************ MAIN: LCALL INIT_18B20 ;LCALL RE_CONFIG LC
[单片机]
51单片机UART通信发送接收数字字母中文,控制LED亮灭
1、发送什么就接收什么 /* 工程创建MCU选取,Atmel 89C55 单片机:STC12C5A60S2 晶振:12M 功能:串口的应用 波特率:4800 8 无 1 无 */ #include REG51.h // 可以使用通用的头文件 //串口中断初始化程序 void UART_init(void){ EA=1; //打开总中断【定时器,ADC,串口,比较,计数,外部】等中断类型 ES=1;//允许串口的中断 TMOD=0x20; // 定时器1 T/C1工作方式,用来产生串口工作频率 SCON=0x50; // 串口工作方式1 TH1=0xF3; // 定时器初始值高8位的设置,查表得频率 TL1=0xF3; //
[单片机]
51单片机教程第5讲_C51程序
c51语言程序是 一个由主函数和若干个函数构成。其中主函数就是程序的起点,单片机运行程序,首先会执行主函数里面的第一条语句,直到执行完成主函数的所有语句,单片机的程序一般都是来完成某项具体功能的,所以程序一般都是一个循环结构的语句。 函数从用户使用角度讲,分为两类,一类是标准库函数,一类是用户自定义的函数。标准库函数是由开发环境自带的,比如我们常用的KEIL软件,就自带有很多库函数。库函数可以直接调用。用户自己写的函数,一般都是完成一些库函数里面没有的特定功能。 函数的一般形式为: 返回值类型 函数名(形式参数列表) { 函数体 } 返回值类型可以是基本数据类型或者指针类型,如:int float char double等等。当
[单片机]
C51单片机浮点数运算
第一,不知道你zhi的a和b是什么类型dao的,如果是定义成浮点型,那么,可以这样写: float f_Div = a/b; 如果两个有一个是整形的,那么,把整型强制转换成浮点型: float f_Div = (float)a/(float)b; 注意,那个f_Div变量必须是float型,才能有小数产生 第二,你要进行显示,肯定要把各个位都取出来,这里面肯定有一个取模运算,就是 % , 对于浮点型,不运行取模运算的,所以,你必须把浮点型转换成整型,但是,不能强制转换, 比如: unsigned int I_Div = (unsigned int)f_Div;这是不可以的,你的小数部分就没有了. 所以,你必须要放大一定的倍数,根据
[单片机]