功能介绍:
0.本系统采用STC89C52作为单片机
1.LCD1602液晶实时显示当前时间/环境光强/工作模式
2.当检测到人体距离灯光太近时,蜂鸣器报警提醒
3.当使用时间超过设定阈值时,蜂鸣器报警提醒
4.可通过按键更改当前时间/工作模式/灯光亮度
原理图:
PCB:
主程序:
#define __MAIN_C
#include <reg52.h>
#include "main.h"
//变量定义
bit dispFlag = 1;
bit setFlag = 0;
bit alarmFlag = 0;
unsigned char alarmTimeCnt = 0;
unsigned char setIndex = 0;
unsigned char timeLimit[2] = {0, 1};
int lightValue;
char dispMode = 0;
bit autoFlag = 0;
bit lampASwitch;
unsigned char lampAPWM = 2;
unsigned int time500us = 0;
unsigned char second = 0;
unsigned int minute = 0;
void main()
{
//初始化
LCD_Init();
DS1302_Init();
Timer0_Init();
DelayMs(20);
//开机显示
LCD_DispStr(0, 0, " Welcome! ");
DelayS(1);
LCD_Clear();
DS1302_ReadTime();
DispNormal(setIndex);
lampASwitch = ON;
while(1)
{
// LCD1602液晶显示
if (dispFlag == 1)
{
dispFlag = 0;
if (lampASwitch == ON) //灯光打开
{
LampCtr(); //灯光控制
}
if (alarmFlag == 1) //响铃1s
{
BUZZER = ON; //蜂鸣器报警
alarmTimeCnt++;
if (alarmTimeCnt >= 4)
{
alarmTimeCnt = 0;
alarmFlag = 0;
}
}
else
{
BUZZER = OFF;
}
if (setFlag == 0) //非设置状态
{
DS1302_ReadTime();
if (dispMode == DISP_NORMAL)
{
DispNormal(setIndex);
}
else if (dispMode == SET_TIME_LIMIT)
{
DispSetLimit(setIndex);
}
}
}
if (lampASwitch == ON) //灯光打开状态
{
if (minute >= 60 * timeLimit[0] + timeLimit[1]) //时间到设定阈值提醒一次
{
minute = 0;
alarmFlag = 1;
}
if (IRFLAG == 0) //距离太近提醒一次
{
alarmFlag = 1;
}
}
else
{
second = 0;
minute = 0;
alarmFlag = 0;
BUZZER = OFF;
}
KeyProcess(); //按键检测和处理
}
}
void LampCtr(void)
{
lightValue = 99 - 99 * ReadADC1(AIN0_GND) / 255; //读取当前光照强度
if (autoFlag)
{
if (lightValue <= 30)
{
lampAPWM = 4;
}
else if (lightValue > 30 && lightValue <= 60)
{
lampAPWM = 3;
}
else
{
lampAPWM = 2;
}
}
}
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值 500us
TR0 = 1; //启动T0计时
ET0 = 1; //打开T0中断
EA = 1; //打开总中断
}
void Timer0_Intterupt(void) interrupt 1
{
static int cnt = 0;
static unsigned char ACount = 0;
static unsigned int time500us = 0;
TL0 = 0x33; //设置定时初值
TH0 = 0xFE; //设置定时初值 500us
cnt++;
if (cnt >= 500) //250ms刷新一次状态
{
cnt = 0;
dispFlag = 1;
if (setFlag == 1)
{
LCD_WriteCommand(0x0F, 0);
LCD_WriteCommand(0x0F, 0);
}
else
{
LCD_WriteCommand(0x0C, 0);
LCD_WriteCommand(0x0C, 0);
}
}
if (lampASwitch == ON) //灯光PWM控制
{
ACount++;
if (ACount <= lampAPWM) //占空比调节
{
LAMPA = ON;
}
else if ((ACount > lampAPWM) && (ACount <= 4))
{
LAMPA = OFF;
}
else
{
ACount = 0;
}
}
else
{
LAMPA = OFF;
}
if (lampASwitch == ON)
{
//灯开启后计时
time500us++;
if (time500us >= 2000)
{
time500us = 0;
second++;
if (second >= 60)
{
second = 0;
minute++;
}
}
}
}