硬件设计
链接:https://pan.baidu.com/s/1Sl6u_BGjrjMKFC8JS90O-A
提取码:67xo
仿真文件1: 功能如下图所示
原理图
仿真文件2:
程序设计
/******定义头文件**************/
#include<reg52.h>
#include <INTRINS.H>
#include"lcd.h"
#include "ds1302.h"
/******类型重定义*************/
typedef unsigned char uchar;
typedef unsigned int uint;
/******引脚定义***************/
sbit key_1 = P1^0; //定义4个按键
sbit key_2 = P1^1;
sbit key_3 = P1^2;
sbit key_4 = P1^3;
sbit key_5=P3^0;//手动/自动模式切换
sbit key_6=P3^1;//手动模式路灯开关
sbit led_1 = P1^4;
sbit Beep = P2^3; //定义声光报警
sbit AD_clk = P3^4; //定义ADC0832
sbit AD_do = P3^5;
sbit AD_di = P3^5;
sbit AD_cs = P3^6;
sbit red_sr = P3^7; //红外检测
/******定义变量***************/
char hour,min,sec; //定义小时、分钟、秒变量
char time;
char work_time_Start = 16,work_time_End = 5; //设定起始、结束时间
bit light_flag;
uchar light; //定义光照强度
uchar light_limit; //定义光照阈值
uchar Data;
/******声明函数***************/
void delayms(unsigned int x); //延时函数
void display(); //显示
void Read_time();
void set_work_time(); //设定工作时间
void set_limit_light(); //设定光照阈值
void work(); //工作状态
void set_time(); //设定时间
void delay10ms(int d);
void InitTimer0(void); //T0定时器初始化程序
uchar AD(bit Channel); //ADC0832程序
void kongzhi()
{
if(key_6==0)
{
led_1=1;
}
else
{
led_1=0;
}
}
void qiehaun()
{
if(key_5==0)
{
kongzhi();
}
else
{
work();
// if(red_sr==1)
// {
// led_1=1;
// }
// if(red_sr==0)
// {
// led_1=0;
// }
}
}
void main()
{
Beep = led_1 = 0; //声光报警,LED关闭
InitTimer0(); //T0定时器初始化程序
LcdInit(); //lcd1602初始化
while(1)
{
Ds1302ReadTime(); //读取时间
set_work_time(); //设定工作时间
set_limit_light(); //设定光照阈值
set_time();
light = AD(0); //读取ADC0832数值
display(); //显示
qiehaun();
// work(); //工作状态
}
}
void Timer0Interrupt(void) interrupt 1
{
static uchar count;
TH0 = 0x0D8;
TL0 = 0x0F0;
count ++;
if(count>=100)
{
time ++;
count = 0;
}
//add your code here
}
/*******************************************************************************
* 函数名 : InitTimer0()
* 函数功能 : T0定时器初始化程序
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0D8;
TL0 = 0x0F0;
EA = 0;
ET0 = 1;
TR0 = 1;
}
/*******************************************************************************
* 函数名 : work()
* 函数功能 : 工作状态
* 输入 : 无
* 输出 : 无
*******************************************************************************/
void work()
{
Read_time(); //转换时间
if(work_time_End!=0 && work_time_Start!=0) //工作时间已设置
{
if(hour >= work_time_Start) //当前时间大于起始时间,如起始时间为19:00,当前时间为21:00。
{
Data = AD(1);
led_1 = 1; //点亮LED
if(Data < 50) //未检测到LED点亮
Beep = 1; //声光报警
else //检测到Led点亮
Beep = 0; //停止报警
}
else if(hour < work_time_End) //当前时间小于结束时间,如结束时间为06:00,当前时间为04:00。
{
if(red_sr) //检测到人或车
{
time = 0;
light_flag = 1; //LED标志置1,开始T0定时器计时,点亮LED,10s后LED标志清零,LED熄灭
}
if(light_flag) //LED标志置1,检测到人或车
{
led_1 = 1; //点亮LED
EA = 1; //开启中断
if(time > 10) //10s后
{
light_flag = 0; //LED标志清零
EA = 0; //关中断
time = 0; //计时清零
}
Data = AD(1);
if(Data < 50) //未检测到LED点亮
Beep = 1; //声光报警
else //检测到Led点亮
Beep = 0; //停止报警
}
else
led_1 = 0;
}
else
{
if(light < light_limit)
{
led_1 = 1;
Data = AD(1);
if(Data < 50) //未检测到LED点亮
Beep = 1; //声光报警
else //检测到Led点亮
Beep = 0; //停止报警
}
else
led_1 = Beep = 0;
}
}
}
/*******************************************************************************
* 函数名 : set_work_time()
* 函数功能 : 设定工作时间
* 输入 : 无
* 输出 : 无
*******************************************************************************/
.
文件仅供参考
.