#include<reg52.h> //头文件
#include<intrins.h>
#include"eeprom52.h" //STC89C52 EEPROM 程序文件
#define uchar unsigned char //宏定义
#define uint unsigned int
#define LCD1602_dat P0 //LCD1602数据口宏定义
sbit LCD1602_rs=P2^5; //LCD1602控制数据IO口
sbit LCD1602_rw=P2^6;
sbit LCD1602_e=P2^7;
sbit beep=P1^3; //蜂鸣器 IO
sbit led_1=P1^4; //LED指示灯 IO
sbit led_2=P1^6;
sbit key_1=P3^2; //系统控制按键IO口
sbit key_2=P3^3;
sbit key_3=P3^4;
sbit alarm_1=P2^0; //控制继电器IO口//
sbit ADC0832_CS=P1^2; //ADC0832 控制IO口 使能口
sbit ADC0832_CLK=P1^1; //时钟IO口
sbit ADC0832_DIO=P1^0; //数据输入输出IO口
uint sum, waterCount; //10次AD值的综合变量,水量统计
uchar RH_H=12,RH_L=8,state,ms,cs,motorTimeCount,aimLevel; //当前水位, 水位上限,下限, 设置项变量,50ms变量 ,cs 为计次数变量 ,电机时间计量,用水上限
bit beep1,s1,overLimit,pidFlag; //报警标志位, 闪烁标志位 ,用水过量标志,pid运行标志
static float ki = 0.3;//积分系数
int motorRunTime = -1;//若为-1,不动作,大于0,开启几秒
uchar pidCount,pidTime;
uchar zt;//模式标志
float motorKP;//比例系数
float RH;//当前水位
float Ad_dat,Ad_datN;
/*
ADC0832是一款8位Ad芯片,因为单片机不能直接处理模拟信号(电压),所以单片机测电压的时候基本都是先经过一个模数转换芯片,将模拟量
转化成数字量,然后处理,ADC0832测量的电压范围是0-5V,它能够将0—5V的电压转化成对应比例关系的0-255(8位是0-255)的数据,单片机直
接读取ADC0832的数据获取AD值数据,然后因为0-5V对应0-255数据,所以1V电对应的AD值就是51,就会有如下公式
电压=AD值/51;
如果想把电压数据精确到小数点后一位就是 电压=AD值/5.1;
小数点后两位就是 电压=AD值/0.51;
不要问我为什么,纯数学,小学生都会算。
*/
/********************************************************************
* 名称 : delay()
* 功能 : 小延时。
* 输入 : 无
* 输出 : 无
***********************************************************************/
void delay(uint T) //延时函数
{
while(T--);
}
void saveWaterCount()
{
SectorErase(0x2400); //保存上限值 保存到单片机中EEPROM
byte_write(0x2400,waterCount);
}
void openMotorTime(uchar time)//开启电机time秒
{
motorRunTime = time;
}
uint motorControl(uchar flag)//开=1,关=0,切换=2,什么都不做并且获取当前状态=3
{
bit a;
if(flag == 0)//关
{
alarm_1 = 1;
saveWaterCount();
}
else if(flag == 1&&alarm_1 == 1)//开
{
alarm_1 = 0;
}
else if(flag == 2)
{
alarm_1 = !alarm_1;
// if(alarm_1 == 1)
// saveWaterCount();
}
else if(flag == 3)
{
return !alarm_1;
}
delay(500);
return 2;
}
unsigned int A_D() //ADC0832 读值程序
{
unsigned char i;
unsigned char dat;
ADC0832_CS=1; //一个转换周期开始
ADC0832_CLK=0; //为第一个脉冲作准备
ADC0832_CS=0; //CS置0,片选有效
ADC0832_DIO=1; //DIO置1,规定的起始信号
ADC0832_CLK=1; //第一个脉冲
ADC0832_CLK=0; //第一个脉冲的下降沿,此前DIO必须是高电平
ADC0832_DIO=1; //DIO置1, 通道选择信号
ADC0832_CLK=1; //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道RH0
ADC0832_CLK=0; //第二个脉冲下降沿
ADC0832_DIO=0; //DI置0,选择通道0
ADC0832_CLK=1; //第三个脉冲
ADC0832_CLK=0; //第三个脉冲下降沿
ADC0832_DIO=1; //第三个脉冲下沉之后,输入端DIO失去作用,应置1
ADC0832_CLK=1; //第四个脉冲
for(i=0;i<8;i++) //高位在前
{
ADC0832_CLK=1; //第四个脉冲
ADC0832_CLK=0;
dat<<=1; //将下面储存的低位数据向右移
dat|=(unsigned char)ADC0832_DIO; //将输出数据DIO通过或运算储存在dat最低位
}
ADC0832_CS=1; //片选无效
return dat; //将读书的数据返回
}
/*
1602液晶,是常用的显示器件,一共是16个管脚,其中有八个管脚是数据传输管脚,有三个管脚是数据命令使能端管脚,还有两组电源管脚,
其中一组电源管脚是给整个液晶进行供电的,还有一组电源是单纯的背景光电源,还剩下的最后一个管脚是对比度调节管脚,一般接上一个3K电
阻再接地即可。
*/
/********************************************************************
* 名称 : LCD1602_write(uchar order,dat)
* 功能 : 1602写如数据函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_write(uchar order,dat) //1602 一个字节 处理
{
LCD1602_e=0;//使能信号,1读取信息,下降沿执行指令,先行置零
LCD1602_rs=order;//rs,0输入指令,1输入数据
LCD1602_dat=dat;//P0口
LCD1602_rw=0;//read/write,0写1读
LCD1602_e=1;
delay(1);
LCD1602_e=0;
}
/********************************************************************
* 名称 : LCD1602_writebye(uchar *prointer)
* 功能 : 1602写入数据函数 指针式
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_writebyte(uchar *prointer) //1602 字符串 处理
{
while(*prointer!='\0')
{
LCD1602_write(1,*prointer);
prointer++;
}
}
/********************************************************************
* 名称 : LCD1602_cls()
* 功能 : 初始化1602液晶
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_cls() //1602 初始化
{
LCD1602_write(0,0x01); //1602 清屏 指令
delay(1500);
LCD1602_write(0,0x38); // 功能设置 8位、5*7点阵001(指令标识,必须为1),1(数据接口位数,1=8,=4), 1(点阵设置)000,
delay(1500);
LCD1602_write(0,0x0c); //原0x0c,设置 光标 00001100 最后三位标识,右4必须定义为1,不显示开关、不显示光标、字符不闪烁
LCD1602_write(0,0x06); //原x06,0000 0110 进入模式设置指令,右2 写入数据后左移/右移,右1显示移动/不显示
LCD1602_write(0,0xd0);
delay(1500);
}
/********************************************************************
* 名称 : show()
* 功能 : LCD1602液晶显示程序
* 输入 : 无
* 输出 : 无
***********************************************************************/
/*
数据显示的时候一般的处理:
首先,无论是数码管显示还是液晶显示,进行显示的时候绝对都是一个一个进行显示的,那么,比如说一个数据123,一百二十三,
进行显示的时候,要先显示1,然后是2,然后是3,那么怎么把数据提取出来??
提取百位 123/100=1
提取十位 123/10=12 12%10=2 “%”是取余的意思,像这个,就是12对10取余,换句话说,12除以10,然后取余数,就是2
提取个位 123%10=3 解释同上
取余的用法也有很多种,大家只要知道出现这个的时候,一般都是进行数据提取的就行
然后
如果您是数码管显示数据,将提取的数据放到段码数组里面送给IO即可,
如果是液晶显示,需要将数据转化成字符,因为液晶是字符屏,只能显示字符数据,数据0对应的字符是0x30,数据1对应的字符是0x31,
所以将提取出的数据直接加上0x30送给液晶即可,或者加上'0' 也是一样的
*/
void show()
{
if(state==0) //当前水位及工作模式显示,用水过度显示
{
LCD1602_write(0,0x80);//设置DDRAM显存地址指令,效果上类似于设置光标,1+xxx,xxxx 首位必须1,剩下几位标识地址,左二为0时,第一行,为1时第2行//
LCD1602_writebyte("WaterLevel:"); //当前水位
LCD1602_write(0,0x80+11);
if(RH>=10)LCD1602_write(1,0x30+((int)RH)/10);//dat换rh
else LCD1602_writebyte(" ");
LCD1602_write(0,0x80+12);
LCD1602_write(1,0x30+((int)RH)%10);
LCD1602_write(0,0x80+13);
LCD1602_writebyte(".");
LCD1602_write(1,0x30+((int)(RH*10))%10);
//LCD1602_writebyte("cm");
if(0)//overLimit == 1),舍弃了统计功能,不写了,待删
{
LCD1602_write(0,0xC0); LCD1602_writebyte("WARN:Over Using"); //过度用水
}
else
{
LCD1602_write(0,0xC0);
if(zt==0)
{
LCD1602_writebyte("State:Manul ");
}else if(zt==1)
{
LCD1602_writebyte("State:auto ");
if(RH>RH_H) //如果当前水位值达到水位上限值则
{
LCD1602_write(0,0xC0);
LCD1602_writebyte("Over Toplimit");
}
else if(RH<=RH_L) //如果当前水位值低于水位下限值则
{
LCD1602_writebyte("Over LowerLimit");
}else //否则
{
LCD1602_writebyte("State:Auto ");
}
}
else if(zt == 3)
{
LCD1602_writebyte("State:PidNormal ");
}
else if(zt == 2)
{
LCD1602_writebyte("State:PIDAuto ");
}
}
}else if(state == 1 || state == 2) //水位上下限设置界面,
{
LCD1602_write(0,0x80);
LCD1602_writebyte("Water_H:"); //水位上限
onnx
- 粉丝: 9801
- 资源: 5603
最新资源
- 基于 SpringBoot 的 JavaWeb 宠物猫认养系统:功能设计与领养体验优化
- _root_license_license_8e0ac649-0626-408f-881c-6603da48ce72.lrf
- 学习threejs,通过设置纹理属性来修改纹理贴图的位置和大小,贴图
- 中医知识宝库(自己治病、自学中医)
- 利用网页设计语言制作的一款简易的时钟网页,可供初学者借鉴,学习 语言:html+css+script
- PHP企业物资管理系统源码带文字安装教程数据库 MySQL源码类型 WebForm
- BD网盘不限速补丁+最新进程修改脚本亲测有效
- 【java毕业设计】大学生心理健康管理系统的设计与实现源码(springboot+vue+mysql+说明文档+LW).zip
- PCAN UDS VI,用于UDS诊断
- 【java毕业设计】多媒体素材库的开发与应用源码(springboot+vue+mysql+说明文档+LW).zip
- uniCloud社区交友入门实战视频.zip
- 100种运动影像分类数据集(13K+ 训练、500 测试、500 验证图像、14K+ 记录)JPG+CSV
- 城乡居民基本医疗信息管理系统基于 SpringBoot 与 JavaWeb:推动医疗管理信息化进程
- 阶段七作业-JavaEE-博学谷
- 【java毕业设计】美食烹饪互动平台的设计与实现源码(springboot+vue+mysql+说明文档+LW).zip
- 实训课程设计-基于Java实现人力资源管理系统+源码+实训报告+文档说明(高分作品)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈