#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include <intrins.h>
//#include "lcd1602.h"
sbit CS=P2^4; //CS定义为P2口的第4位脚,连接ADC0832CS脚
sbit SCL=P2^3; //SCL定义为P2口的第3位脚,连接ADC0832SCL脚
sbit DO=P2^2; //DO定义为P2口的第4位脚,连接ADC0832DO脚
sbit controlUp=P3^3;
sbit controlDown=P3^4;
sbit DQ=P3^7; //定义DS18B20总线I/O
signed char m=15; //温度值全局变量 温度值整数
uchar n; //温度值全局变量 温度值小数
sbit beep = P3^2; //蜂鸣器IO口定义
long dengji,tempUp = 25; //压力
long tempDown=17;
bit flag_300ms ;
bit flag=0;
bit people=0;
bit start=0;
uchar key_can; //按键值的变量
uchar menu_1;
uchar flag_clock;
#include "eeprom52.h"
#include "lcd1602.h"
//============================================================================================
//====================================DS18B20=================================================
//============================================================================================
/*****18b20延时子程序*****/
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay_DS18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_DS18B20(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay_DS18B20(14);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--) //循环8次,读出一个字节
{
DQ = 0; // 给脉冲信号
dat>>=1; //数据右移一位
DQ = 1; // 给脉冲信号
if(DQ) //如果该位为1
dat|=0x80; //将数据 | 0x80后,存入dat
Delay_DS18B20(4); //延时
}
return(dat); //返回一字节数据
}
/*****写一个字节*****/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--) //循环8次,写入一个字节
{
DQ = 0; //拉低
DQ = dat&0x01; //将dat数据&0x01后,送入IO口
Delay_DS18B20(5); //保持一会
DQ = 1; //io口拉高
dat>>=1; //dat右移一位
}
}
/*****读取温度*****/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b; //将高8位数据存入t
t<<=8; //t左移8位
t=t|a; //将t|a得到一个16位的温度数据
tt=t*0.0625; //一个最低位代表0.0625°C,所以要*0.0625得到实际温度,因为有小数运算,所以定义的tt是float浮点型变量
t= tt*10+0.5; //放大10倍输出并四舍五入(将温度放大10倍可以得到小数部分)
return(t); //返回得到的温度值
}
/*****读取温度*****/
void check_wendu(void)
{
uint a,b,c;
c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差
a=c/100; //计算得到十位数字
b=c/10-a*10; //计算得到个位数字
m=c/10; //计算得到整数位
n=c-a*100-b*10; //计算得到小数位
if(m<0){m=0;n=0;} //设置温度显示上限
if(m>99){m=99;n=9;} //设置温度显示上限
m++;
}
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
// byte_write(0x2000, s_dengji);
// byte_write(0x2001, s_dengji);
// byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
// s_dengji = byte_read(0x2000);
//s_dengji = byte_read(0x2001);
//a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 2) //新的单片机初始单片机内问eeprom
{
//s_dengji = 200;
a_a = 2;
write_eeprom();
}
}
/***********读数模转换数据********************************************************/
//请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的
// 1 0 0 通道
// 1 1 1 通道
unsigned char ad0832read(bit SGL,bit ODD)
{
unsigned char i=0,value=0,value1=0;
SCL=0;
DO=1;
CS=0; //开始
SCL=1; //第一个上升沿
SCL=0;
DO=SGL;
SCL=1; //第二个上升沿
SCL=0;
DO=ODD;
SCL=1; //第三个上升沿
SCL=0; //第三个下降沿
DO=1;
for(i=0;i<8;i++)
{
SCL=1;
SCL=0; //开始从第四个下降沿接收数据
value<<=1;
if(DO)
value++;
}
for(i=0;i<8;i++)
{ //接收校验数据
value1>>=1;
if(DO)
value1+=0x80;
SCL=1;
SCL=0;
}
CS=1;
SCL=1;
if(value==value1) //与校验数据比较,正确就返回数据,否则返回0
return value;
return 0;
}
/*************定时器0初始化程序***************/
void time_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0、定时器1工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
}
/****************按键处理显示函数***************/
void key_with()
{
if(key_can == 1)
{
if(flag==0)
{
tempUp ++ ; //酒精浓度设置数加1
if(tempUp > 99)
tempUp = 99;
}
else
{
tempDown ++;
if(tempDown > 99)
tempDown = 99;
}
}
if(key_can == 2)
{
if(flag==0)
{
tempUp -= 1; //酒精浓度设置数减1
if(tempUp <= 1)
tempUp = 1 ;
}
else
{
tempDown -= 1;
if(tempDown <= 1)
tempDown = 1 ;
}
}
if(tempDown>=tempUp && flag==0)
{
tempUp++;
}
if(tempDown>=tempUp && flag==1)
{
tempDown--;
}
if(key_can == 3)
{
flag=!flag;
if(flag==0)
{
write_com(0x80+6);
write_data('<'); //设置压力报警值
write_com(0x80+7);
write_data(' ');
}
else
{
write_com(0x80+6);
write_data(' '); //设置压力报警值
write_com(0x80+7);
write_data('>');
}
}
}
/********************独立按键程序*****************/
uchar key_can; //按键值
void key() //独立按键程序
{
static uchar key_new;
key_can = 20; //按键值还原
P1 |= 0x1f;
if((P1 & 0x1f) != 0x1f) //按键按下
{
delay_1ms(1); //按键消抖动
if(((P1 & 0x1f) != 0x1f) && (key_new == 1))
{ //确认是按键按下
key_new = 0;
switch(P1 & 0x1f)
{
case 0x1b: key_can = 2; break; //得到减键值
case 0x17: key_can = 1; break; //得到加键值
case 0x1d: key_can = 3; break; //得到设置键值
}
}
}
else
key_new = 1;
}
/****************报警函数***************/
void clock_h_l()
{
static uchar value;
if(m >= tempUp || m <= tempDown) //报警
{
value ++;
if(value >= 2)
{
value = 10;
beep = ~beep; //蜂鸣器报警
}
}else
{
value = 0;
beep = 1;
}
}
/****************温度控制函数***************/
void control()
{
if(m >= tempUp) //报警
{
controlDown = 0;
controlUp=1;
}else if(m <= tempDown)
{
controlDown = 1;
controlUp=0;
}else
{
controlDown = 1;
controlUp=1;
}
}
/***************主函数*****************/
void main()
{
beep = 0; //开机叫一声
delay_1ms(150);
P0 = P1 = P2 = 0xff; //单片机IO口初始化为1
init_eeprom(); //读eeprom数据
time_init(); //初始化定时器
init_1602();
check_wendu();
check_wendu();
//K = 1;
while(1)
{
key(); //独立按键程序
if(key_can < 10)
{
key_with(); //按键按下要执行的程序
}
if(flag_300ms == 1)
{
flag_300ms = 0;
clock_h_l();
check_wendu();
write_sfm2(2,13,m);
}
write_sfm2(1
基于单片机的空调机的温度控制系统设计-仿真
版权申诉
95 浏览量
2023-11-08
19:10:25
上传
评论 2
收藏 194KB RAR 举报
电气_空空
- 粉丝: 3047
- 资源: 741
最新资源
- 基于matlab开发的根据rvm回归模型自己编的matlab程序.rar
- 高效C++学生成绩管理系统:教育技术+C++17编程+数据管理+教务自动化
- 基于matlab开发的Tipping的相关向量机RVM的回归MATLAB程序,有英文注释,可以运行.rar
- 一个点击正反转程序实例,可实现案件电机正反转
- 搜索链接淘特搜索引擎共享版-tot-search-engine.rar
- 第十八届全国大学生智能汽车竞赛 摄像头组/镜头组
- 基于matlab开发的AUV惯性导航系统matlab仿真程序,包括轨迹生成、gps和sins组合、gps和dvl组合.rar
- 基于SSM的“个性化电子相册”的设计与实现.zip
- 如何在撰写科研文献时,使用ai工具辅助去完成科研工作
- 吉林大学计组笔记 自用 基于b站翼云图灵的课.pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈