#include

#define uchar unsigned char

#define uint unsigned int

sbit ad_cs=P1^3;         //ADC0832的控制位

sbit ad_clk=P1^0;

sbit ad_dat=P1^1;

sbit lcd_rs=P2^7;         //LCD1602的控制位

sbit lcd_e=P2^6;

sbit key1=P1^4;                 //独立按键

sbit key2=P3^2;

sbit key3=P3^3;

sbit relay=P1^6;     //继电器

bit flag=1;                     //工作模式标志

bit flag_motor=1;         //手动模式下,抽水机开关标志

bit flag_jia=0;

bit flag_jian=0;

uchar Hum_H=60;                 //自动模式下,湿度设定最大值

uchar Hum_L=30;                 //自动模式下,湿度设定最小值

uchar num=0;

/********************延时函数1ms*****************

void delay_ms(uint a)

{

uint i;

while(a--)

for(i=0;i<125;i++);

}

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

/*******************延时函数50us******************/

void delay_50us(uint a)

{

uint i;

while(a--)

for(i=0;i<19;i++);

}

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

/*******************ADC读取******************/

uchar read_ad(uchar channel)

{

uchar i;

uchar dat1,dat2;

ad_clk=0;

ad_cs=0;

ad_dat=1;

ad_clk=1;

ad_clk=0;  //起始信号

ad_dat=1;

ad_clk=1;

ad_clk=0;  //选择单通道模式

ad_dat=channel;//0对应通道0,1对应通道1

ad_clk=1;

ad_clk=0;

ad_dat=1;

for(i=0;i<8;++i)

{

ad_clk=1;

ad_clk=0;

dat1=dat1<<1;

if(ad_dat)

dat1|=0x01;

}

for(i=0;i<8;i++)

{

dat2=dat2>>1;

if(ad_dat)

dat2|=0x80;

ad_clk=1;

ad_clk=0;

}

ad_cs=1;

return (dat1==dat2)?dat1:0;

}

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

/*******************LCD1602初始化******************/

void write_com(uchar com)        //写指令

{

lcd_e=0;

lcd_rs=0;

P0=com;

delay_50us(10);

lcd_e=1;

delay_50us(10);

lcd_e=0;

}

void write_data(uchar dat)  //写数据

{

lcd_e=0;

lcd_rs=1;

P0=dat;

delay_50us(10);

lcd_e=1;

delay_50us(10);

lcd_e=0;

}

void init_lcd1602()                 //lcd 初始化

{

delay_50us(300);

write_com(0x38);

delay_50us(100);

write_com(0x38);

delay_50us(100);

write_com(0x38);

write_com(0x38);

write_com(0x08);

write_com(0x01);

write_com(0x06);

write_com(0x0c);

}

void display_shu(uchar add,uchar dat)          //显示数字

{

uchar l,m;

//        k=dat/100;

l=dat%100/10;

m=dat%10;

write_com(0x80+add);

//        write_data(k+0x30);

write_data(l+0x30);

write_data(m+0x30);

}

void display_string(uchar add,uchar *dat)  //显示字符串

{

uchar i;

write_com(0x80+add);

while(dat!=0&&(*dat!='\0')&&i<16)

{

write_data(*dat);

dat++;

i++;

if(i==15) i=0;

}

}

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

/****************主函数*******************/

void main()

{

EA=1;                                                          //开总中断

EX0=1;                                                          //开外部中断0

EX1=1;                                                          //开外部中断1

IT0=0;                                                          //外部中断0触发方式为低电平

IT1=0;                                                          //外部中断1触发方式为低电平

init_lcd1602();

display_string(0,"Hum:  %");      //实时显示当前的湿度

display_string(11,"H:  %");       //显示设置的湿度最大值

display_string(0x40,"Mode:");          //显示工作模式

display_string(0x40+11,"L:  %");  //显示设置的湿度最小值

while(1)

{

uchar i;

i=100-read_ad(0)*0.39;

display_shu(4,i);

display_shu(13,Hum_H);

display_shu(0x40+13,Hum_L);

if(key1==0)

{

delay_50us(100);

if(key1==0)

{

while(!key1);

num++;

if(num>2) num=0;

}

switch (num)                                         //选择工作模式和调整湿度设置最大、最小值

{

case 0:flag=~flag;

flag_jia=0;

flag_jian=0;

//write_com(0x80+0x40);

//write_com(0x0f);

break;

case 1://write_com(0x80+9);

//write_com(0x0f);

//delay_50us(1000);

//write_com(0x0c);

flag_jia=1;

flag_jian=0;

break;

case 2://write_com(0x80+0x40+9);

//write_com(0x0f);

//delay_50us(1000);

//write_com(0x0c);

flag_jian=1;

flag_jia=0;

break;

}

if(flag==0&&num==1)

{

flag=~flag;

num=0;

flag_jia=0;

flag_jian=0;

}

}

if(flag==0)                              //手动模式

{

display_string(0x40+5,"MT");

if(flag_motor) relay=1;

else if(i

else relay=1;

}

else                                                          //自动模式

{

display_string(0x40+5,"AT");

if(i

{

relay=0;

}

else relay=1;

}

}

}

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

/***********************外部中断*********************/

void int0() interrupt 0

{

delay_50us(20);

if(key2==0)

while(!key2);

flag_motor=~flag_motor;

if(flag&&flag_jia)

{

//write_com(0x80+9);

//write_com(0x0f);

//delay_50us(1000);

//write_com(0x0c);

//delay_50us(1000);

Hum_H++;

if(Hum_H>=99) Hum_H=99;

}

if(flag&&flag_jian)

{

//write_com(0x80+0x40+9);

//write_com(0x0f);

//delay_50us(1000);

//write_com(0x0c);

//delay_50us(1000);

Hum_L++;

if(Hum_L>=Hum_H) Hum_L=Hum_H-1;

}

}

void int1() interrupt 2

{

delay_50us(20);

if(key3==0)

while(!key3);

if(flag&&flag_jian)

{

//write_com(0x80+0x40+9);

//write_com(0x0f);

//delay_50us(1000);

//write_com(0x0c);

//delay_50us(1000);

Hum_L--;

if(Hum_L<=1) Hum_L=1;

}

if(flag&&flag_jia)

{

//write_com(0x80+9);

//write_com(0x0f);

//delay_50us(1000);

//write_com(0x0c);

//delay_50us(1000);

Hum_H--;

if(Hum_H<=Hum_L) Hum_H=Hum_L+1;

}

}

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

diy 单片机 自动浇花_单片机自动浇花系统(附原理图、仿真文件、源程序)相关推荐

  1. 根据stc89原理图画pcb_基于STC89C52单片机毕业设计(完整版) 附 原理图 pcb图 源程序 仿真图...

    基于stc89c52单片机毕业设计 附 原理图 pcb图 源程序 仿真图 表3-1 P3口管脚备选功能 3.2 晶体振荡器 晶体振荡器,简称晶振,其作用在于产生原始的时钟频率,这个频率经过频率发生器的 ...

  2. java 写文件 权限不够_教你解决Linux系统中JAVA创建文件后权限不足的问题

    在作业中,项目使用文件上传. 这个功能很常见. 当Kai Ge今天更改其官方帐户时,他遇到了一个问题,即无法访问下载的文件,也无法通过浏览器访问该文件. 它是怎么发生的? 经过许多问题之后,事实证明这 ...

  3. 单片机知识点总结框图_单片机基础知识

    什么是单片机: 顾名思义,单片机中的"单片"就是只有一个芯片, "机"就是指计算机,只有有一个芯片,她却具有简单计算机的功能,这就叫做单片机,也教微处理器微控制 ...

  4. 单片机烧录软件编写_单片机技术系列之一:单片机概述

    按控制要求设计好单片机电路原理图后,还要依据电路原理图将实际的单片机电路制作出来.制作单片机电路有两种方法:一种是用电路板设计软件(如Protel99SE软件)设计出与电路原理图相对应的PCB图(印制 ...

  5. python控制mt4自动交易软件排名_股票自动交易软件排名

    原标题:股票自动交易软件排名 提起股票自动交易软件,大家都很不陌生了,很多用户也使用过很多不同品牌的产品,那么谁比较好呢?接下来我们就为大家来总体排名一下: 第一名:智能A股管家股票自动交易系统 把它 ...

  6. python实现软件自动点击_鼠标自动点击、键盘自动输入?几行Python代码搞定

    第一步:安装并导入相关模块 只需要安装PyUserInput,如下:pip install PyUserInput 如果你是Win10系统,肯定会报错,具体怎么解决,我放在文章结尾讲,先把主要思路讲完 ...

  7. 单片机彩灯移动实验_单片机动态控制64个彩灯实验报告

    目录 一.课题名称---------------------3 二.设计目的---------------------3 三.系统原理图--------------------3 四.方案论证---- ...

  8. stm32f103r6最小系统原理图_超强PCB布线设计经验谈附原理图

    在当今激烈竞争的电池供电市场中,由于成本指标限制,设计人员常常使用双面板.尽管多层板(4层.6层及8层)方案在尺寸.噪声和性能方面具有明显 优势,成本压力却促使工程师们重新考虑其布线策略,采用双面板. ...

  9. iphone屏蔽系统更新_手机资讯:iOS12 屏蔽系统更新的描述文件已失效怎么办

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多知识的,这些知识很多小伙伴一般都是不知道的,就好比最近就有很多小伙伴们想要知道iOS12 屏蔽系统更新的描述文件已失效怎么办,那 ...

最新文章

  1. win7计算机创建新用户,win7系统无法创建新用户的解决方法
  2. ASP.NET WebApi技术从入门到实战演练
  3. Camelot:从pdf中提取表格数据
  4. Jackson 框架使用教程,轻易转换JSON
  5. Oracle 数据库启动 startup和startup force的区别
  6. datetime timestamp的区别
  7. Three Strings CodeForces - 1301A
  8. 小说中人称转换作用_长篇儿童小说《合欢》:一树红绒落马缨
  9. Python多线程学习(上)
  10. 4.4 Hibernate高级功能
  11. Xshell5连接服务器
  12. matlab 矩形窗汉明窗幅频特性对比
  13. 控制教程 —— 介绍篇:6.状态空间控制器设计
  14. java bmp透明底色_C++ 设置透明背景图片
  15. Day16:C++之STL应用篇(推箱子cxk限定)
  16. Sothink Logo Maker 4.2.4254 中文绿色便携版(LOGO设计工具)
  17. Kali Linux 详细安装步骤
  18. Cesium位置拾取
  19. Excel教程之什么是好的仪表板工具
  20. 如何使用unity制作雷达探测目标效果动画

热门文章

  1. 他人的建议和意见对自已做决定的影响
  2. Python算法题笔记
  3. 线性代数之——行列式公式及代数余子式
  4. 如何核算一个软件开发项目的成本?
  5. 【ZeloEngine】ImGui汇总
  6. HLK-W801-LVGL8之横屏显示
  7. 使用vue/cli出现defineConfig is not function 错误
  8. W: 校验数字签名时出错。此仓库未被更新,所以仍然使用此前的索引文件。GPG 错误:http://packages.ros.org/ros/ubuntu xenial InRelease: 下列签名无
  9. 计算机性能指标ppt,计算机网络—评价网络的性能指标知识讲解.ppt
  10. python语言基础-字典