功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时循环显示多点温度值
2.当温度超过设定温度阈值范围时,蜂鸣器报警
3.按键可设定温度阈值范围/可控制报警开关
原理图:
PCB:
主程序:
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "main.h"
unsigned char dispFlag = 0; //更新显示标志
enum _MODE_DF_ dispMode;
unsigned char num = 0;
int tempBuf = 0; //读取温度值
float temperature; //实际温度值
int tempMin = 10;
int tempMax = 50;
bit alarmFlag = OFF;
bit alarmSwitch = ON;
unsigned char setIndex = 0;
char dis0[16]; //定义显示区域临时存储数组
void main(void)
{
unsigned int channel = 0;
Timer0_Init();
LCD_Init(); //初始化液晶
DelayMs(200); //延时有助于稳定
LCD_Clear(); //清屏
LCD_DispStr(0, 0, " Welcome ");
DelayS(1);
LCD_Clear(); //清屏
DispNormal();
num = DS18B20_SearchROM();
while (1) //主循环
{
if (dispFlag == 1)
{
dispFlag = 0;
if (dispMode == NORMAL)
{
TR0 = 0;
if (channel == num)
{
channel = 0;
}
DS18B20_Start();
tempBuf = DS18B20_GetTemp(channel);
channel++;
temperature = (float)tempBuf * 0.0625; //温度值转换
sprintf(dis0, "%01d", channel); //打印通道值
LCD_DispStr(1, 1, dis0);
sprintf(dis0, "%5.1f", temperature); //打印温度值
LCD_DispStr(3, 1, dis0);
TR0 = 1;
if (temperature < tempMin || temperature > tempMax)
{
alarmFlag = ON;
}
else
{
alarmFlag = OFF;
}
if (alarmSwitch == ON)
{
LCD_DispStr(11, 1, "ON "); //显示报警开关状态
if (alarmFlag == ON)
{
BUZZER_ON;
LCD_DispStr(14, 1, " !"); //显示报警标志
}
else
{
BUZZER_OFF;
LCD_DispStr(14, 1, " ");
}
}
else
{
LCD_DispStr(11, 1, "OFF "); //显示报警开关状态
BUZZER_OFF;
}
}
}
KeyProcess();
}
}
void DispNormal(void)
{
LCD_WriteCommand(0x0C, 0); //关闭光标闪烁
LCD_DispStr(0, 0, " Temperature ");
LCD_DispStr(0, 1, "T0: ");
LCD_DispOneChar(8, 1, 0xdf); //写入温度右上角点
LCD_DispOneChar(9, 1, 'C'); //写入温度的C
}
void DispSetTemp(unsigned char setIndex)
{
LCD_DispStr(0, 0, " Set Temp Limit ");
sprintf(dis0, " L:%03d H:%03d ", tempMin, tempMax);
LCD_DispStr(0, 1, dis0);
switch (setIndex)
{
case 1: LCD_SetCursor(6, 1, 1); break;
case 2: LCD_SetCursor(13, 1, 1); break;
default:;
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Timer0_Init(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
EA = 1; //总中断打开
ET0 = 1; //定时器中断打开
TR0 = 1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_Interrupt(void) interrupt 1
{
static unsigned char time20ms = 0;
TH0 = (65536 - 18432) / 256; //重新赋值 20ms
TL0 = (65536 - 18432) % 256;
time20ms++;
if (time20ms > 50)
{
time20ms = 0;
dispFlag = 1; //读标志位置1
}
}