仿真图:
芯片/模块的特点:
ADC0832特点:
8位分辨率:ADC0832可以将模拟输入信号转换为8位数字输出。这意味着它可以将模拟信号划分为256个不同的离散电平,提供相对较低的分辨率。
双通道输入:ADC0832具有两个模拟输入通道,使其能够同时转换两个模拟信号。这对于需要同时测量多个信号的应用非常有用。
内部参考电压源:ADC0832提供了一个内部的参考电压源,它可以用作模拟输入信号的参考电压。这样可以简化外部电路设计,并提供更稳定和准确的参考电压。
串行输出:ADC0832通过串行接口(SPI或I2C)输出转换结果。这种串行输出形式使其与微控制器或其他数字设备的通信变得更加简单和方便。
低功耗:ADC0832具有较低的功耗特性,适合在低功耗应用中使用。
可编程时钟频率:ADC0832的转换速度可以通过控制输入时钟频率进行编程。这使得可以根据应用的需求调整转换速度,并平衡转换精度和速度。
内部自校准:ADC0832具有内部自校准电路,可以降低转换误差,并提供更准确的转换结果。
DS1302特点:
高精度时间计数:DS1302能够提供高精度的实时时钟计数,可以记录年、月、日、星期、小时、分钟和秒等时间信息。它内部集成了晶体振荡器,提供稳定的时钟信号。
低功耗设计:DS1302采用低功耗设计,可以在低功耗模式下运行,有效延长电池寿命。即使在停电情况下,它也能保持时间数据,并通过外部连接电池继续提供计时功能。
串行接口:DS1302通过串行实时时钟接口(SPI)进行通信和控制。使用少数几个引脚,可以与主控器件进行数据交换和时钟同步。
容易集成:DS1302集成了时钟计数和RAM存储器功能,并具有简单的接口和命令,容易与各种微控制器和单片机集成。它不需要复杂的控制信号,可以通过简单的读写命令进行操作。
可编程控制功能:DS1302具有可编程的控制功能,可以设置闹钟、写保护等特殊功能。它还支持多种时间格式的选择,例如24小时制或12小时制。
温度补偿:DS1302内置温度补偿功能,可以校正温度对时钟频率的影响,提高时钟计数的准确性。
高稳定性和抗震动能力:DS1302具有高稳定性和抗震动能力,适用于各种工业和消费类应用场景。
主程序:
#define __MAIN_C
#include <reg52.h>
#include "main.h"
enum _MODE_DF_ dispMode; //显示模式
bit dispFlag = 1; //显示标志
bit setFlag = 0; //设定标志
bit sendFlag = 0; //发送标志
unsigned char setIndex = 0; //设置坐标
unsigned char lightValue; //环境光强
unsigned char lightValueA; //灯光A光强
unsigned char lightValueB; //灯光B光强
unsigned char lightLimit = 40; //光强阈值
unsigned char timeLimit[4] = {17, 0, 5, 0}; //工作时间
unsigned char modeFlag = 0; //模式标志
bit lampBDelay = 0; //灯光B延时
bit lampAError = 0; //灯光A故障标志
bit lampBError = 0; //灯光B故障标志
bit lampASwitch; //灯光A开关
bit lampBSwitch; //灯光B开关
void main()
{
//初始化
lampASwitch = LAMP_OFF;
lampBSwitch = LAMP_OFF;
Timer0_Init();
LCD_Init();
DS1302_Init();
DelayMs(20);
//开机显示
LCD_DispStr(0, 0, " Welcome! ");
DelayS(2);
LCD_Clear();
DS1302_ReadTime();
DispNormal(setIndex);
while(1)
{
// LCD1602液晶显示
if (dispFlag == 1 && setFlag == 0)
{
dispFlag = 0;
LampCtr(); //灯光自动控制
CheckLamp(); //灯光检测
DS1302_ReadTime(); //读取时间
if (dispMode == DISP_NORMAL) //正常显示模式
{
DispNormal(setIndex);
}
else if (dispMode == SET_TIME_LIMIT) //工作时间设定
{
DispSetLimit(setIndex);
}
else if (dispMode == SET_LIGHT) //光强阈值设定
{
DispSetLight(setIndex);
}
else if (dispMode == CHECK_LIGHT) //灯光检测界面
{
DispCheckLight(setIndex);
}
}
KeyProcess(); //按键处理
}
}
void LampCtr()
{
lightValue = 99 - 99 * ReadADC1(AIN0_GND) / 255; //读取当前光照强度
if (modeFlag == 1) //在定时模式下
{
if ((timeBufDec[4] == timeLimit[0] && timeBufDec[5] >= timeLimit[1]) || (timeBufDec[4] > timeLimit[0]) \
|| (timeBufDec[4] == timeLimit[2] && timeBufDec[5] < timeLimit[3]) || (timeBufDec[4] < timeLimit[2])) //工作时间内路灯操作
{
lampASwitch = LAMP_ON;
if ((timeBufDec[4] >= 0 && timeBufDec[4] < timeLimit[2]) || (timeBufDec[4] == timeLimit[2] && timeBufDec[5] < timeLimit[3]))
{
if (!lampBDelay)
{
lampBSwitch = LAMP_OFF;
if (IRFLAG == 0) //检测到有人或车经过 启动10s定时
{
lampBDelay = 1;
}
}
}
else
{
lampBSwitch = LAMP_ON;
lampBDelay = 0;
}
}
else
{
lampASwitch = LAMP_OFF;
lampBSwitch = LAMP_OFF;
}
}
if (modeFlag == 2) //在自动模式下
{
if ((timeBufDec[4] == timeLimit[0] && timeBufDec[5] >= timeLimit[1]) || (timeBufDec[4] > timeLimit[0]) \
|| (timeBufDec[4] == timeLimit[2] && timeBufDec[5] < timeLimit[3]) || (timeBufDec[4] < timeLimit[2])) //工作时间内路灯操作
{
lampASwitch = LAMP_ON;
if ((timeBufDec[4] >= 0 && timeBufDec[4] < timeLimit[2]) || (timeBufDec[4] == timeLimit[2] && timeBufDec[5] < timeLimit[3]))
{
if (!lampBDelay)
{
lampBSwitch = LAMP_OFF;
if (IRFLAG == 0) //检测到有人或车经过 启动10s定时
{
lampBDelay = 1;
}
}
}
else
{
lampBSwitch = LAMP_ON;
lampBDelay = 0;
}
}
else //工作时间外路灯操作
{
if (lightValue < lightLimit) //光照强度低于设定阈值
{
lampASwitch = LAMP_ON;
lampBSwitch = LAMP_ON;
}
else
{
lampASwitch = LAMP_OFF;
lampBSwitch = LAMP_OFF;
}
}
}
if (lampASwitch == LAMP_ON)
{
LAMPA = LAMP_ON;
}
else
{
LAMPA = LAMP_OFF;
}
if (lampBSwitch == LAMP_ON)
{
LAMPB = LAMP_ON;
}
else
{
LAMPB = LAMP_OFF;
}
}
void CheckLamp()
{
if (lampASwitch == LAMP_ON) //路灯A打开时,检测对应光强
{
lightValueA = 99 - 99 * ReadADC2(AIN1_GND) / 255; //读取当前光照强度
if (lightValueA < 50) //路灯A故障声光报警 阈值可根据实际情况调整
{
lampAError = 1;
BUZZER = 0; //打开蜂鸣器
}
else
{
lampAError = 0;
}
}
if (lampBSwitch == LAMP_ON) //路灯B打开时,检测对应光强
{
lightValueB = 99 - 99 * ReadADC2(AIN0_GND) / 255; //读取当前光照强度
if (lightValueB < 50) //路灯B故障声光报警 阈值可根据实际情况调整
{
lampBError = 1;
BUZZER = 0; //打开蜂鸣器
}
else
{
lampBError = 0;
}
}
if (lampAError == 0 && lampBError == 0) //灯都没有故障
{
BUZZER = 1; //关闭蜂鸣器
}
if (lampASwitch == LAMP_OFF && lampBSwitch == LAMP_OFF) //灯全部关闭
{
BUZZER = 1; //关闭蜂鸣器
}
}
//定时器0初始化
void Timer0_Init(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值 50ms
TR0 = 1; //启动T0计时
ET0 = 1; //打开T0中断
EA = 1; //打开总中断
}
//定时器0中断
void Timer0_Intterupt(void) interrupt 1
{
static unsigned char cnt = 0;
static unsigned int time50ms = 0;
TL0 = 0x00; //设置定时初值
TH0 = 0x4C; //设置定时初值 50ms
cnt++;
if (cnt >= 5) //250ms刷新一次状态
{
cnt = 0;
dispFlag = 1;
}
if (modeFlag == 1 || modeFlag == 2) //在自动模式或定时模式下
{
if (lampBDelay == 1)
{
time50ms++;
lampBSwitch = LAMP_ON;
if (time50ms >= 200) //定时10s关闭路灯B
{
lampBDelay = 0;
lampBSwitch = LAMP_OFF;
time50ms = 0;
}
}
}
}
设计文件: