标题:
基于18B20的温度报警系统(可调节温度上下限,超温报警)51单片机源程序
[打印本页]
作者:
uhyiu
时间:
2017-12-14 20:27
标题:
基于18B20的温度报警系统(可调节温度上下限,超温报警)51单片机源程序
使用51单片机为主控芯片,使用18B20温度传感器,实现温度测量,设定温度上下限,超温报警,以及调节温度上下限,使用1602显示
0.jpg
(23.28 KB, 下载次数: 28)
下载附件
2017-12-14 21:01 上传
单片机源程序如下:
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//sbit Buzz = P3^2;
sbit Buzz = P1^5;
/*******************************************lcd1602.c函数声明************************************************/
extern void InitLcd1602(); //lcd1602初始化函数
extern void DisplayLimit(uchar x,uchar y,char dat); //在坐标(x,y)显示温度上限或下限
extern void InitMaxMin(); //进入温度报警值设置界面
extern void Display_user(uchar x); //显示用户自定义的字符“↑”
extern void LcdShowStr(uchar x,uchar y,uchar *str);
extern void LcdShowDat(uchar x,uchar y,uchar num);
extern void Display_laba();
/*******************************************key.c函数声明****************************************************/
extern void KeyDrive();
extern void KeyScan();
/****************************************ds18b20.c函数声明***************************************************/
extern bit RESET_DS18B20(void);
extern uint Read_DS18B20_TEMP(void);
/*****************************************main.c子函数声明***************************************************/
void Timer1Init(uint ms); //定时器1初始化函数
void SetLimit(); //设置报警值函数
void ControlBuzz(); //蜂鸣器控制函数
void delay(uint z);
/**********************************************变量定义******************************************************/
extern uchar code buff[];
uchar T1RH=1; //定时器初值
uchar T1RL=1;
bit flagBuzz=0; //蜂鸣器开关标志
bit EBuzz=0; //蜂鸣器使能标志
char High=20; //温度上限 超过限度蜂鸣器开
char Low=10; //温度下限
uchar mode=0; //模式变量
uchar cnt=0; //ESC按键 变量
uchar tflag; //温度正负标志位
/*************************************主函数***************************************/
void main()
{
EA=1; //开启总中断
Timer1Init(1); //初始化定时器1
RESET_DS18B20(); //复位18B20
delay(20);
InitLcd1602(); //初始化lcd1602
while(1)
{
LcdShowDat(10,1,buff[Read_DS18B20_TEMP()/100]); //显示温度值十位
LcdShowDat(11,1,buff[Read_DS18B20_TEMP()/10%10]); //显示温度值个位
LcdShowStr(12,1,"."); //显示小数点
LcdShowDat(13,1,buff[Read_DS18B20_TEMP()%10]); //显示小数位
KeyDrive(); //按键驱动
SetLimit(); //设置报警值
}
}
/**********************************按键动作函数************************************/
void KeyDown(uchar keycode)
{
if(keycode==0x0D) //回车键:进入模式设置
{
mode++;
if(mode>2)mode=0;
}
else if(keycode==0x26) //向上键:模式1 上限值+1 模式2 下限值+1
{
if(mode==1)
{
High++;
if(High>99)High=99;
}
else if(mode==2)
{
Low++;
if(Low==High)Low=High-1;
}
}
else if(keycode==0x28) //向下键:模式1 上限值-1 模式2 下限值-1
{
if(mode==1)
{
High--;
if(High==Low)High=Low+1;
}
else if(mode==2)
{
Low--;
if(Low<0)Low=0;
}
}
else if(keycode==0x1B) //Esc键:开关蜂鸣器报警
{
if(mode==0)
{
cnt++;
if(cnt>1)cnt=0;
if(cnt==1) //蜂鸣器使能开启 显示喇叭图像
{
EBuzz=1;
Display_laba();
}
else if(cnt==0) //蜂鸣器使能关闭 不显示喇叭
{
EBuzz=0;
LcdShowStr(7,0," ");
}
}
}
}
/************************************报警值设置函数*********************************/
void SetLimit()
{
if(mode==0); //模式0 正常显示 调用蜂鸣器控制函数
{
ControlBuzz();
}
if(mode!=0) //模式1 调整温度上限
{ //模式2 调整温度下限
EBuzz=0;
InitMaxMin();
while(mode!=0)
{
KeyDrive();
if(mode==1)
{
Display_user(3); //显示自定义的 箭头 图像 指向温度上限
DisplayLimit(2,0,High); //显示 温度报警值上下限
DisplayLimit(12,0,Low);
}
else if(mode==2)
{
Display_user(13); //显示自定义的 箭头 图像 指向温度下限
LcdShowStr(3,1," ");
DisplayLimit(2,0,High);
DisplayLimit(12,0,Low);
}
}
InitLcd1602();
}
}
/************************************蜂鸣器控制函数************************************/
void ControlBuzz()
{
if((Read_DS18B20_TEMP()>=(10*High))||(Read_DS18B20_TEMP()<=(10*Low)))
flagBuzz=1;
else
flagBuzz=0;
if((flagBuzz==1)&&(EBuzz==1))
{
Buzz=~Buzz;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
/**********定时器1初始化函数***********/
void Timer1Init(uint ms)
{
ulong tmp; //16位长整型变量tmp
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
Keil代码下载:
11.DS18B20温度报警.rar
(68.75 KB, 下载次数: 113)
2017-12-14 20:27 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
LIUBAOBAO
时间:
2017-12-25 18:29
怎么设置温度上下限?
刷了一下板子 调不了温度上下限
作者:
liaorenhai
时间:
2017-12-25 20:37
谁能根据楼主的程序画个仿真图吗?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1