单片机温度监控系统设计
时间: 2023-09-23 20:03:03 浏览: 44
单片机温度监控系统的设计可以分为以下几个步骤:
1. 选择合适的单片机:选择能够满足温度监控系统需求的单片机芯片,比如常用的51系列、STM32系列等。
2. 硬件设计:根据需求,设计硬件电路,包括传感器电路、单片机电路、显示电路等。
3. 传感器选择:选择合适的温度传感器,如NTC热敏电阻、PT100温度传感器、DS18B20数字温度传感器等。
4. 温度采集:使用单片机对温度传感器进行采集,将温度值转换成数字信号。
5. 数据处理:根据采集到的温度值,进行数据处理,如温度值的平均值、最大值、最小值等。
6. 显示:将处理后的温度值通过液晶显示屏、LED灯等方式显示出来。
7. 报警:当温度超过预设阈值时,触发报警功能,可以通过声音、灯光等方式进行报警。
8. 调试:对整个系统进行调试和测试,确保系统的正常运行。
总之,单片机温度监控系统的设计需要考虑到硬件和软件两个方面,需要有一定的电子技术和编程能力。
相关问题
基于51单片机的温度检测系统设计
以下是一个基于51单片机的温度检测系统的设计方案:
硬件设计:
1. AT89S52单片机
2. DS18B20数字温度传感器
3. 16x2 LCD液晶显示屏
4. 4.7K欧姆电阻
5. 9V电源
6. 杜邦线和面包板
软件设计:
1. Keil C51编译器
2. Proteus仿真软件
基本思路:
1. 将DS18B20数字温度传感器连接到单片机上,并进行初始化设置。
2. 单片机启动后,通过读取DS18B20传感器的数据获取当前环境温度。
3. 将温度数据显示在LCD液晶显示屏上。
4. 通过串口通信将温度数据发送到上位机,实现远程监控。
5. 使用电路连接线和电阻,将整个系统连接到9V电源模块上,以保证系统正常运行。
6. 使用Keil C51编译器编写程序,实现系统逻辑和功能。
7. 使用Proteus仿真软件进行系统仿真和测试。
以下是一个基于51单片机的温度检测系统的程序代码:
```c
#include <reg52.h>
#include <stdio.h>
#include <string.h>
sbit DQ = P3^7; // DS18B20数据线连接到P3.7
sbit RS = P2^0; // LCD液晶显示屏RS引脚连接到P2.0
sbit RW = P2^1; // LCD液晶显示屏RW引脚连接到P2.1
sbit EN = P2^2; // LCD液晶显示屏EN引脚连接到P2.2
void Delay1ms(unsigned int i) // 延时函数
{
unsigned int j;
while(i--)
{
for(j=0;j<120;j++);
}
}
void LCD_Write_Cmd(unsigned char cmd) // 写指令函数
{
RW = 0;
RS = 0;
P0 = cmd;
EN = 1;
Delay1ms(5);
EN = 0;
}
void LCD_Write_Data(unsigned char dat) // 写数据函数
{
RW = 0;
RS = 1;
P0 = dat;
EN = 1;
Delay1ms(5);
EN = 0;
}
void LCD_Init() // LCD初始化函数
{
LCD_Write_Cmd(0x38);
LCD_Write_Cmd(0x0c);
LCD_Write_Cmd(0x06);
LCD_Write_Cmd(0x01);
}
void LCD_Write_String(unsigned char x, unsigned char y, unsigned char *s) // 在LCD上显示字符串函数
{
unsigned char i;
if(x<16)
{
if(y) x |= 0x40;
x |= 0x80;
LCD_Write_Cmd(x);
}
i = 0;
while(s[i])
{
LCD_Write_Data(s[i]);
i++;
}
}
unsigned char DS18B20_Reset() // DS18B20复位函数
{
unsigned char i;
DQ = 1;
Delay1ms(1);
DQ = 0;
Delay1ms(480);
DQ = 1;
Delay1ms(60);
i = DQ;
Delay1ms(420);
return i;
}
void DS18B20_Write_Byte(unsigned char dat) // DS18B20写字节函数
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat & 0x01;
Delay1ms(5);
DQ = 1;
dat >>= 1;
}
}
unsigned char DS18B20_Read_Byte() // DS18B20读字节函数
{
unsigned char i, dat = 0;
for(i=0;i<8;i++)
{
DQ = 0;
Delay1ms(5);
DQ = 1;
dat >>= 1;
if(DQ) dat |= 0x80;
Delay1ms(5);
}
return dat;
}
void DS18B20_Start() // DS18B20开始转换函数
{
DS18B20_Reset();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0x44);
}
float DS18B20_Read_Temp() // DS18B20读温度函数
{
unsigned char temp_l, temp_h;
float temp;
DS18B20_Reset();
DS18B20_Write_Byte(0xcc);
DS18B20_Write_Byte(0xbe);
temp_l = DS18B20_Read_Byte();
temp_h = DS18B20_Read_Byte();
temp = temp_h;
temp *= 256;
temp += temp_l;
temp /= 16;
return temp;
}
void main()
{
float temp;
unsigned char str[16];
LCD_Init();
while(1)
{
DS18B20_Start();
temp = DS18B20_Read_Temp();
sprintf(str, "Temp:%.2fC", temp);
LCD_Write_String(0, 0, str);
Delay1ms(1000);
}
}
```
该代码中使用了DS18B20数字温度传感器和LCD液晶显示屏。需要注意的是,由于51单片机没有内置的ADC模块,因此我们选择了DS18B20数字温度传感器,需要使用DS18B20相关函数进行温度值的读取。同时,LCD液晶显示屏的初始化也需要在程序中进行。
基于51单片机做温度监控系统ds18b20
好的,针对您的问题,我可以给出一个基本的方案:
1. 硬件设计
硬件部分需要有以下几个模块:
- 51单片机
- DS18B20温度传感器
- 1602液晶显示屏
- 4个按键(分别为上、下、确认和返回)
- 蜂鸣器(可选)
其中,DS18B20是常用的数字温度传感器,它可以直接通过单总线进行通讯。1602液晶显示屏可以用来显示温度值和一些提示信息,按键用于菜单的操作和参数的设置,蜂鸣器可以用于报警。
2. 软件设计
软件部分需要实现以下几个功能:
- DS18B20温度传感器数据采集和转换为温度值
- 液晶屏显示温度值和菜单信息
- 按键操作和参数设置
- 温度报警功能
由于您并未提供具体的要求,因此我这里只提供一个基本的程序框架,您可以根据自己的需求进行修改和完善。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P3^7; //定义DS18B20数据引脚
uchar tempH, tempL; //存储温度值高八位和低八位
uchar alarmTemp = 30; //报警温度
uchar menuIndex = 0; //菜单选择项
uchar setTemp = 0; //设定温度
bit isTempSet = 0; //是否已经设置温度
bit isAlarmOn = 0; //是否报警
//延时函数,约1ms
void delay(uint i)
{
while(i--);
}
//DS18B20复位
uchar ds18b20Reset()
{
uchar presence;
DQ = 0;
_nop_();
_nop_();
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
presence = DQ;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return presence;
}
//DS18B20写一个字节
void ds18b20WriteByte(uchar dat)
{
uchar i;
for (i = 0; i < 8; i++)
{
DQ = 0;
_nop_();
_nop_();
DQ = dat & 0x01;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
dat >>= 1;
}
}
//DS18B20读一个字节
uchar ds18b20ReadByte()
{
uchar i, dat = 0;
for (i = 0; i < 8; i++)
{
dat >>= 1;
DQ = 0;
_nop_();
_nop_();
DQ = 1;
_nop_();
_nop_();
if(DQ) dat |= 0x80;
_nop_();
_nop_();
DQ = 0;
}
return dat;
}
//DS18B20转换温度
void ds18b20Convert()
{
ds18b20Reset();
ds18b20WriteByte(0xcc);
ds18b20WriteByte(0x44);
}
//DS18B20读取温度
void ds18b20ReadTemp()
{
ds18b20Reset();
ds18b20WriteByte(0xcc);
ds18b20WriteByte(0xbe);
tempL = ds18b20ReadByte();
tempH = ds18b20ReadByte();
ds18b20Reset();
}
//显示温度值
void showTemp()
{
uchar str[6];
sprintf(str, "%d.%dC", tempH, tempL);
lcdWriteCom(0x80); //设置光标位置为第一行第一列
lcdWriteStr(str);
}
//显示菜单
void showMenu()
{
uchar str[16];
lcdWriteCom(0x80); //设置光标位置为第一行第一列
switch(menuIndex)
{
case 0:
lcdWriteStr("1) Set alarm temp ");
break;
case 1:
lcdWriteStr("2) Clear alarm ");
break;
case 2:
lcdWriteStr("3) Exit menu ");
break;
}
lcdWriteCom(0xc0); //设置光标位置为第二行第一列
sprintf(str, "Alarm: %d.%dC", alarmTemp, 0);
lcdWriteStr(str);
}
//设置报警温度
void setAlarmTemp()
{
uchar key = getKey();
if(key == 1) //上键
{
if(alarmTemp < 100) alarmTemp++;
}
else if(key == 2) //下键
{
if(alarmTemp > -50) alarmTemp--;
}
else if(key == 3) //确认键
{
isTempSet = 1;
menuIndex++;
}
else if(key == 4) //返回键
{
isTempSet = 0;
menuIndex++;
}
}
//清除报警
void clearAlarm()
{
uchar key = getKey();
if(key == 3) //确认键
{
isAlarmOn = 0;
menuIndex++;
}
else if(key == 4) //返回键
{
menuIndex++;
}
}
//获取按键值
uchar getKey()
{
uchar key = 0;
delay(20); //去抖动
if(P2 != 0xf0) //有按键按下
{
delay(1000); //延时等待按键稳定
if(P2 != 0xf0) //再次检测是否有按键按下
{
switch(P2)
{
case 0xe0: //上键
key = 1;
break;
case 0xd0: //下键
key = 2;
break;
case 0xb0: //确认键
key = 3;
break;
case 0x70: //返回键
key = 4;
break;
}
}
}
return key;
}
//温度报警
void tempAlarm()
{
if(isTempSet && tempH < alarmTemp) //温度低于设定值
{
if(!isAlarmOn) //报警未开启
{
isAlarmOn = 1;
beep();
}
}
else
{
isAlarmOn = 0;
}
}
//蜂鸣器响
void beep()
{
P1 |= 0x01; //蜂鸣器接在P1.0
delay(1000);
P1 &= ~0x01;
delay(1000);
}
//初始化LCD1602
void initLcd()
{
lcdWriteCom(0x38); //开显示
lcdWriteCom(0x0c); //光标不显示
lcdWriteCom(0x06); //光标移动
lcdWriteCom(0x01); //清屏
}
//写命令到LCD1602
void lcdWriteCom(uchar com)
{
lcdEnable();
P0 = com;
P2 &= ~0x01; //RS=0,写入命令
lcdDelay();
P2 &= ~0x04; //E=0,清除使能位
}
//写数据到LCD1602
void lcdWriteData(uchar dat)
{
lcdEnable();
P0 = dat;
P2 |= 0x01; //RS=1,写入数据
lcdDelay();
P2 &= ~0x04; //E=0,清除使能位
}
//使能LCD1602
void lcdEnable()
{
P2 |= 0x04; //E=1,产生脉冲
lcdDelay();
P2 &= ~0x04; //E=0,清除使能位
}
//LCD1602延时函数
void lcdDelay()
{
delay(500);
}
//主函数
void main()
{
initLcd(); //初始化LCD1602
while(1)
{
ds18b20Convert(); //DS18B20开始转换温度
delay(1000); //等待转换完成
ds18b20ReadTemp(); //读取温度值
showTemp(); //显示温度值
tempAlarm(); //温度报警
if(!isTempSet) //未设置温度
{
showMenu(); //显示菜单
switch(menuIndex)
{
case 0: //设置报警温度
setAlarmTemp();
break;
case 1: //清除报警
clearAlarm();
break;
case 2: //退出菜单
menuIndex = 0;
break;
}
}
}
}
```
以上是一个简单的基于51单片机的温度监控系统的方案,您可以根据自己的需求进行修改和完善。注意,该方案只提供了基本的硬件和软件设计思路,实际实现过程中需要根据具体情况进行调试和优化。