目 录
一、主要功能
基于51单片机,具有晶振电路、复位电路、DS18B20温度传感器、LED灯和蜂鸣器灯光报警模块、LCD1602显示模块、L298N驱动电机散热模块和按键模块。
主要功能:
系统开始运行,显示屏显示最大温度阈值和最小温度阈值,并且通过DS18B20温度传感器读取当前温度值显示出来,和显示当前的状态。可以通过按键来增减温度上限阈值和温度下限阈值,如果当前温度在阈值之内,显示状态位正常;温度超过最大阈值,灯光报警模块启动,散热模块启动,驱动电机转动,实现降温功能;温度低于最小阈值,灯光报警模块启动,加热模块启动,告知人们正在加热升温。
主要实现要求:
1、温度采集
2、温度上下限调值
3、超值报警,具有加热和降温功能
4、LCD1602液晶显示温度、状态
二、硬件资源
1、51单片机最小系统
2、电机模块
3、按键模块
4、蜂鸣器和LED灯模块
5、LCD1602显示模块
6、DS18B20温度传感器模块
/*****************************************************************************************************************************
CSDN 夜间去看海制作
*******************************************************************************************************************************/
#include <REGX52.H>
#include<intrins.h>
#include<stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit led = P1^7; //LED灯引脚
sbit P22 = P2^5; //蜂鸣器引脚
sbit DS=P2^4; //DS18B20温度传感器
sbit Motor1_IN1 = P2^0; //电机IN口
sbit Motor1_IN2 = P2^1;
sbit Motor1_EN = P2^3; //电机使能端
sbit key1=P3^2;
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;
unsigned char count;
typedef unsigned char u8;
typedef unsigned int u16;
static flag=1,flag1=1;
static int n1=1;
static uint temp;
static float ftemp = 0.0f;//温度转变
uint temp;
static unsigned char num;
static int maxnumber=60,minnumber=30;
int i=0;
static int c,temp1;
void tmpchange();
uint tmp();
void beep_warning(uint);
void Time0_Init() //定时器初始化
{
TMOD = 0x01; //定时器0工作在方式1
IE = 0x82;
TH0 = 0xfe;
TL0 = 0x33; //11.0592MZ晶振,0.5ms
TR0=1; //定时器开始
EA=1;
}
void Time0_Int() interrupt 1 //中断程序
{
TH0 = 0xfe; //重新赋值
TL0 = 0x33;
num++;
if(num==200)
{
tmpchange(); //让18b20开始转换温度
temp = tmp(); //读取温度
ftemp = temp/10.0f; //转换温度
num=0;
}
}
void dsreset(void) //发出命令
{
uint i;
DS=0;
i=103; //将总线拉低480us~960us
while(i>0)i--;
DS=1; //然后拉高总线,若DS18B20做出反应会将在15us~60us后将总线拉低
i=4; //15us~60us等待
while(i>0)i--;
//while(DS);
}
bit tmpreadbit(void) //读取数据
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}
uchar tmpread(void) //读取数据
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tmpwritebyte(uchar dat) //传输数据给DS18B20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
void tmpchange(void) //DS18B20开始工作
{
dsreset();
Delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0x44);
}
uint tmp() //获得温度
{
float tt;
uchar a,b;
dsreset();
Delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();//低八位
b=tmpread();//高八位
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不能取小数点后的数
return temp;
}
void beep_warning(uint ftemp) //温度传感器蜂鸣器警报并且电机转动
{
if(ftemp>maxnumber)
{
P22=1; //蜂鸣器报警
Motor1_IN1 = 1; //电机IN口
Motor1_IN2 = 0;
Motor1_EN = 1; //打开
LCD_ShowString(2,11,"zt:gw");
}
else if(ftemp<minnumber)
{
P22=1; //蜂鸣器报警
led=1; //打开加热模块
Motor1_EN = 0; //关掉
LCD_ShowString(2,11,"zt:dw");
}
else
{
Motor1_EN = 0;
P22=0;
led=0;
LCD_ShowString(2,11,"zt:zc");
}
}
void main() //主函数
{
led=0;
P22=0; //蜂鸣器关掉
LCD_Init(); //显示屏初始化
LCD_ShowString(1,1,"max:");//显示最高温度
LCD_ShowString(1,9,"min:");//显示最低温度
LCD_ShowString(2,1,"wendu:");
LCD_ShowString(2,11,"zt:zc");
Time0_Init();
ET0=1;
EA=1;
while(1)
{
if(key1==0)
{
Delay(150);
if(key1==0)
{
maxnumber++;
}
}
if(key2==0)
{
Delay(150);
if(key2==0)
{
maxnumber--;
}
}
if(key3==0)
{
Delay(150);
if(key3==0)
{
minnumber++;
}
}
if(key4==0)
{
Delay(150);
if(key4==0)
{
minnumber--;
}
}
LCD_ShowNum(2,7,ftemp,2); //第一行显示温度
LCD_ShowString(2,9,"C ");
LCD_ShowNum(1,5,maxnumber,3);
LCD_ShowNum(1,13,minnumber,3);
beep_warning(ftemp); //温度超出报警,舵机转动
}
}
四、实现现象
此为开机状态,当前温度位47°,上限为60°,下限为30°;
调节温度到61°,此时散热模块启动,灯光报警;
其他效果看B站演示视频: https://www.bilibili.com/video/BV1PX4y1y7A8/share_source=copy_web&vd_source=fecfee84aca7f4057aa7cd6a4b3a809d
源程序和仿真文件:
链接:https://pan.baidu.com/s/1Z7oXxJIf4ab9y6bYM50gDw
提取码:40m4
--来自百度网盘超级会员V4的分享c