功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示时间/当前温度
2.按键可进行闹钟设置和温度上下限设置
3.到达闹钟时间或温度超过阈值范围,蜂鸣器报警
4.到达闹钟时间,蜂鸣器将报警30s,可手动提前停止报警
5.采用DC002作为电源接口可直接输入5V给整个系统供电
原理图:
PCB :
主程序:
#define __MAIN_C
#include <reg52.h>
#include "main.h"
enum DISP_MODE_DF DispMode; //显示模式
unsigned char setIndex = 0; //设置位置标志
unsigned char alarmTime[3] = {21, 0, 0}; //闹钟时间
bit dispFlag = 1; //显示标志
bit setFlag = 0; //设置标志
bit alarmSwitch = 0; //闹钟开关
bit buzzerFlag1 = 0; //蜂鸣器报警标志1
bit buzzerFlag2 = 0; //蜂鸣器报警标志2
unsigned char buzzerDelay = 0; //蜂鸣器报警倒计时
int tempBuf = 0; //温度
float f_temperature = 0.0; //温度
int minTemp = 15; //温度阈值下限
int maxTemp = 35; //温度阈值上限
void main()
{
//初始化
DispMode = NORMAL;
setFlag = 0;
Timer0_Init();
LCD_Init();
DS1302_Init();
DelayMs(20);
if (!KEY_ENTER) //启动过程中确定键按下,初始化时间
{
DelayMs(10);
if (!KEY_ENTER)
{
DS1302_WriteTime(); //写入时间
}
}
//开机显示
LCD_DispStr(0, 0, " Welcome! ");
DS18B20_Start();
DS18B20_GetTemp(&tempBuf);
f_temperature = (float)tempBuf * 0.0625;
DelayS(2);
LCD_Clear();
while(1)
{
// LCD1602液晶显示
if ((dispFlag == 1) && (setFlag == 0))
{
dispFlag = 0;
DS1302_ReadTime(); //读取时间
//检测温度
DS18B20_Start();
DS18B20_GetTemp(&tempBuf);
f_temperature = (float)tempBuf * 0.0625;
if (DispMode == NORMAL)
{
DispNormal(setIndex);
}
if (alarmSwitch == 1) //闹钟开关打开
{
if (alarmTime[0] == timeBufDec[4] && alarmTime[1] == timeBufDec[5] && alarmTime[2] == timeBufDec[6])
{
buzzerFlag1 = 1;
buzzerDelay = 120; //报警30s 250ms*120
//buzzerDelay = 20; //报警5s 250ms*20
}
}
if (f_temperature < minTemp || f_temperature > maxTemp)
{
buzzerFlag2 = 1;
buzzerDelay = 20; //报警5s 250ms*20
}
else
{
buzzerFlag2 = 0;
}
if (buzzerFlag1 == 1 || buzzerFlag2 == 1)
{
if (buzzerDelay != 0)
{
BUZZER = ON;
buzzerDelay--;
}
else
{
BUZZER = OFF;
}
}
else
{
BUZZER = OFF;
}
}
KeyProcess(); //按键处理
}
}
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值 50ms
TR0 = 1; //启动T0计时
ET0 = 1; //打开T0中断
EA = 1; //打开总中断
}
void Timer0_Intterupt(void) interrupt 1
{
static unsigned char time50ms = 0;
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值 50ms
time50ms++;
if (time50ms >= 5) //250ms刷新一次状态
{
time50ms = 0;
dispFlag = 1;
}
}