#include<reg52.h> //头函数
#include <intrins.h>
#define uchar unsigned char //宏定义
#define uint unsigned int
#include "eeprom52.h"
bit ZF1,ZF2,ZF3,ZF4; //温度值的符号位,=0为正数,=1为负数
bit flag,shanshuo; //flag:为0时是巡检模式,为1时是单组检测模式
#include<Lcd.h> //包含显示函数
#include<DS18B20.h> //包含温度读取函数
sbit LED1=P1^4;
sbit LED2=P1^5;
sbit LED3=P1^6;
sbit LED4=P1^7; //四路报警LED
sbit BUZZER=P2^0; //蜂鸣器接口,低电平时鸣响
sbit K1 =P3^3; //设置键
sbit K2 =P3^4; //加键
sbit K3 =P3^5; //减键
sbit K4 =P3^6; //巡检模式按键
sbit K5 =P3^7; //单组测量按键
uchar Mode=0; //Mode为0时测量第一路,为1时测量第二路... ...
//uchar S=0; //
//uint SI=0;
uint TT =0; //读取温度变量
bit flag_BJ1,flag_BJ2,flag_BJ3,flag_BJ4; //单路是否报警标志位
bit ZFH1=0,ZFL1=0,ZFH2=0,ZFL2=0,ZFH3=0,ZFL3=0,ZFH4=0,ZFL4=0; //每路的上下限的正负号标志位(为0时是正数,为1时是负数)
char TEMH1=0,TEML1=0,TEMH2=0,TEML2=0,TEMH3=0,TEML3=0,TEMH4=0,TEML4=0; //初始各路上下限温度值
uchar set; //设置变量
void delay(uint ms) //延时函数,大约延时ms ms(ms为1时延时1ms)
{
uint i,j; //延时函数用变量
for(i=0;i<ms;i++) //for循环,循环ms次
for(j=0;j<110;j++); //当ms为5时,此句重复执行5次
}
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, ZFH1);
byte_write(0x2001, TEMH1);
byte_write(0x2002, ZFL1);
byte_write(0x2003, TEML1);
byte_write(0x2004, ZFH2);
byte_write(0x2005, TEMH2);
byte_write(0x2006, ZFL2);
byte_write(0x2007, TEML2);
byte_write(0x2008, ZFH3);
byte_write(0x2009, TEMH3);
byte_write(0x200a, ZFL3);
byte_write(0x200b, TEML3);
byte_write(0x200c, ZFH4);
byte_write(0x200d, TEMH4);
byte_write(0x200e, ZFL4);
byte_write(0x200f, TEML4);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
ZFH1 =byte_read(0x2000);
TEMH1 =byte_read(0x2001);
ZFL1 =byte_read(0x2002);
TEML1 =byte_read(0x2003);
ZFH2 =byte_read(0x2004);
TEMH2 =byte_read(0x2005);
ZFL2 =byte_read(0x2006);
TEML2 =byte_read(0x2007);
ZFH3 =byte_read(0x2008);
TEMH3 =byte_read(0x2009);
ZFL3 =byte_read(0x200a);
TEML3 =byte_read(0x200b);
ZFH4 =byte_read(0x200c);
TEMH4 =byte_read(0x200d);
ZFL4 =byte_read(0x200e);
TEML4 =byte_read(0x200f);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
ZFH1 =0;
TEMH1 =40;
ZFL1 =0;
TEML1 =20;
ZFH2 =0;
TEMH2 =39;
ZFL2 =0;
TEML2 =21;
ZFH3 =0;
TEMH3 =36;
ZFL3 =0;
TEML3 =23;
ZFH4 =0;
TEMH4 =33;
ZFL4 =0;
TEML4 =27;
a_a = 1;
write_eeprom(); //保存数据
}
}
void key() //按键函数
{
if(K1==0) //设置键按下
{
delay(10); //延时去抖
if(K1==0) //再次判断
{
set++; //设置变量加
if(set>=3) //当设置完下限,也就是加到大于等于3,
{
set=0; //设置变量清零,退出设置
flag=0; //进入巡检模式
}
}
while(!K1); //按键释放(当按键一直按下时,K1是接地为0的,!是位取反,所以!K1是1,所以while就会成立一直执行,直到按键放开,跳出此处)
}
if(set!=0) //当set不为0时,就是进入设置状态
{
flag=1; //关闭巡检,显示单路温度
BUZZER=1; //关闭蜂鸣器
flag_BJ1=0;flag_BJ2=0;flag_BJ3=0;flag_BJ4=0; //关闭各路报警标志位
LED1=1;LED2=1;LED3=1;LED4=1; //关闭各路报警指示灯
}
if(K2==0) //当加键按下时
{
delay(10); //延时去抖
if(K2==0) //再次判断按键是否按下
{
if(set==1) //判断现在是设置上限还是下限(set=1是设置上限,set=2是设置下限)
{
if(Mode==0) //判断是设置哪一路温度(Mode为0时是设置第一路)
{
if(ZFH1==0) //判断第一路的上限值是正数
{
TEMH1++; //上限值加
if(TEMH1>=99) //最大加到99
TEMH1=99; //等于99
}
else //如果上限值是负数
{
TEMH1--; //则将上限值减(负数加就是去掉符号后的数减)
if(TEMH1==0) //减到0
ZFH1=0; //将符号变为正
} //同理下面各路限值设置都是一样的,注释略
}
if(Mode==1)
{
if(ZFH2==0)
{
TEMH2++;
if(TEMH2>=99)
TEMH2=99;
}
else
{
TEMH2--;
if(TEMH2==0)
ZFH2=0;
}
}
if(Mode==2)
{
if(ZFH3==0)
{
TEMH3++;
if(TEMH3>=99)
TEMH3=99;
}
else
{
TEMH3--;
if(TEMH3==0)
ZFH3=0;
}
}
if(Mode==3)
{
if(ZFH4==0)
{
TEMH4++;
if(TEMH4>=99)
TEMH4=99;
}
else
{
TEMH4--;
if(TEMH4==0)
ZFH4=0;
}
}
}
if(set==2) //set==2,设置下限值
{
if(Mode==0) //设置第一路
{
if(ZFL1==0) //下限值为正数
{
TEML1++; //下限值加
if(TEML1==TEMH1) //下限值等于上限值时
TEML1=TEMH1-1; //下限值比上限值小1
if(TEML1>=99) //最大加到99
TEML1=99; //等于99
}
else //下限值为负数
{
TEML1--; //下限值减(负数减就是数值去掉符号后加)
if(ZFH1==1&&TEML1==TEMH1) //上限值是负数时下限值不能小于上限
TEML1=TEMH1+1; //下限值比上限值大1
else if(ZFH1==0&&TEMH1==0&&TEML1==0) //如果上限值是正数且上限值和下限值都是0
TEML1=1; //下限值为1
if(TEML1==0) //下限值为0时
ZFL1=0; //符号变为正
} //同理下面各路限值设置都是一样的,注释略
}
if(Mode==1)
{
if(ZFL2==0)
{
TEML2++;
if(TEML2==TEMH2)
TEML2=TEMH2-1;
if(TEML2>=99)
TEML2=99;
}
else
{
TEML2--;
if(ZFH2==1&&TEML2==TEMH2)
TEML2=TEMH2+1;
else if(ZFH2==0&&TEMH2==0&&TEML2==0)
TEML2=1;
if(TEML2==0)
ZFL2=0;
}
}
if(Mode==2)
{
if(ZFL3==0)
{
TEML3++;
if(TEML3==TEMH3)
TEML3=TEMH3-1;
if(TEML3>=99)
TEML3=99;
}
else
{
TEML3--;
if(ZFH3==1&&TEML3==TEMH3)
TEML3=TEMH3+1;
else if(ZFH3==0&&TEMH3==0&&TEML3==0)
TEML3=1;
if(TEML3==0)
ZFL3=0;
}
}
if(Mode==3)
{
if(ZFL4==0)
{
TEML4++;
if(TEML4==TEMH4)
TEML4=TEMH4-1;
if(TEML4>=99)
TEML4=99;
}
else
{
TEML4--;
if(ZFH4==1&&TEML4==TEMH4)
TEML4=TEMH4+1;
else if(ZFH4==0&&TEMH4==0&&TEML4==0)
TEML4=1;
if(TEML4==0)
ZFL4=0;
}
}
}
write_eeprom(); //保存数据
}
while(!K2);
}
if(K3==0) //减按键按下时
{
delay(10); //按键去抖
if(K3==0)
{
if(set==1) //设置上限时
{
if(Mode==0) //设置第一路时
{
if(ZFH1==0) //上限值为正数时
{
TEMH1--; //上限值减
if(ZFL1==0&&TEMH1==TEML1) //下限值为正数且上限值等于下限值
TEMH1=TEML1+1; //上限值比下限值大1
else if(ZFL1==1&&TEML1==1&&TEMH1<0)//下限值为负数且下限值=1,上限值小于0
TEMH1=0; //上限值=0
if(TEMH1<0) //上限值小于0
{
TEMH1=1; //上限值置1
ZFH1=1; //符号变为负数
}
}
else //上限符号位为负数
{
TEMH1++; //上限值加(负数减就是数值去掉符号后加)
if(ZFL1==1&&TEMH1==TEML1) //下限值为负数且上限值等于下限值
TEMH1=TEML1-1; //上限值比下限值小一
if(TEMH1>=50) //上限值最大50(负数的最大)
TEMH1=50;
} //同理下面各路限值设置都是一样的,注释略
}
if(Mode==1)
{
if(ZFH2==0)
{
TEMH2--;
if(ZFL2==0&&TEMH2==TEML2)
TEMH2=

努力改掉拖延症的小白
- 粉丝: 5247
最新资源
- 西门子PLC与触摸屏在变频恒压供水系统中的设计与仿真研究
- 永磁同步电机PMSM位置三闭环控制仿真模型的设计与研究
- 马尔可夫转移场技术在一维时序信号至二维图像转换中的应用及其实现方法
- 基于MATLAB的高级蓝色车牌识别系统:集成计算机视觉与图像处理技术实现精准识别与语音播报 车牌识别
- 基于S7-200 PLC与组态王的工业锅炉温度闭环控制系统设计与实现
- 基于A与DWA融合的MATLAB路径规划算法:提高机器人避障能力 MATLAB 专业版
- 西门子S7-1200PLC与TP700触摸屏联机仿真程序:混凝土搅拌控制之博途V16及运行效果视频(带IO表)
- 独立变桨控制与统一变桨控制的OpenFast与Simlink联合仿真模型
- 永磁同步电机(PMSM)匝间短路故障的Simulink仿真分析及应用
- 密歇根大学燃料电池仿真:Simulink建模及关键组件控制策略
- 电力系统优化:基于改进粒子群算法的微电网多目标调度模型研究
- 自动驾驶路径规划与动态避障系统的实现及实验验证 · 自动驾驶 v2.5
- DEGWO-BP算法:基于差分改进灰狼优化的BP神经网络数据回归预测Matlab程序 - MATLAB
- 基于MATLAB与CarSimPreScan联合仿真的自动驾驶路径规划与动态避障模型研究 · 自动驾驶 终极版
- 恒压供水系统:西门子Smart200+海为B-7s触摸屏控制,一拖一与一拖多模式,手机远程控制程序 经典版
- 低照度图像增强技术:七大算法解析及其Python代码实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


