本帖最后由 木头12333 于 2020-12-30 12:52 编辑
功能说明:
1、上电之后LED灯点亮,代表当前灯是自动控制模式;
2、通过按键K5可以在自动和手动模式来回切换;
3、在手动模式下,按键K2,K3,K4分别对应一个灯光亮度;(k1按下时不可用)
4、在自动模式下,首先要检测到有人,才进行亮度的自动控制,否则台灯熄灭。可以挡住光敏电阻
的光线,或用手电筒来照射光敏电阻,模拟光照的变化,从而就可以看到台灯的亮度会随着环境中的
光照强度的改变而改变,效果是光照越弱,台灯越亮。如果人体传感器1分钟检测不到有人,台灯就
会自动熄灭。(光敏电阻在USB灯后面);
5、无论是自动模式还是手动模式,都是把亮度分为10个等级的,并在LCD上显示0-9;
6、设置日期时间:按下K1(设置)键,显示年位置会有光标闪烁,表示此时可以调节年份,如需调节年份,
按K3(加),K4(减)即可对年份进行调节。然后按K2(移动)键,显示月份位置会光标闪烁,同样的方法可
以调节月,再按K2键分别可设置日,时,分,秒。
7、靠近超声波时,蜂鸣器报警。
制作出来的实物图如下:
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
PCB文件:
部分源程序:
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include "eeprom52.h"
#include "intrins.h"
#include "ds1302.h"
#include "lcd1602.h"
#include "ultrasonic_wave.h"//超声波头函数
bit flag_200ms ;
bit flag_100ms ;
bit flag_beep1_en;//定时模式开启标志
bit flag_beep2_en;
bit flag_beep3_en;
sbit k1=P1^4; //时间设置切换
sbit k2=P1^5; //光标移动
sbit k3=P1^6; //加
sbit k4=P1^7; //减
sbit k5=P2^7; //手动/自动
sbit ADC_CS = P3^5; //ADC0832引脚定义
sbit ADC_CLK = P3^6;
sbit ADC_DAT = P3^7;
sbit LED = P2^6; //自动模式指示灯
sbit dq = P2^1; //18b20 IO口的定义
sbit Module = P2^2; // 人体红外感应引脚定义
sbit Beep = P2^0; // 蜂鸣器引脚定义
sbit Lamp = P1^3; // 照明灯定义
uchar gCount=0; // 全局计数变量
uchar gIndex; // 亮度变量,0是最暗,9是最亮,一共10档
uint gTime=0; // 计时变量,用于计时多久没检测到有人
uint temperature ; //温度变量
uchar menu_1; //时间/定时模式切换
uchar menu_2; //调整时间
uchar ret; //AD采集结果
uchar key_time,flag_value; //用做连加的中间变量
bit key_500ms ;
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, fen1);
byte_write(0x2001, shi1);
byte_write(0x2002, open1);
byte_write(0x2058, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
fen1 = byte_read(0x2000);
shi1 = byte_read(0x2001);
open1 = byte_read(0x2002);
a_a = byte_read(0x2058);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
fen1 = 3;
shi1 = 8;
open1 = 1;
a_a = 1;
write_eeprom(); //保存数据
}
}
/*********************************************************/
// ADC0832的时钟脉冲
/*********************************************************/
void WavePlus()
{
_nop_();
ADC_CLK = 1;
_nop_();
ADC_CLK = 0;
}
/*********************************************************/
// 获取指定通道的A/D转换结果
/*********************************************************/
uchar Get_ADC0832()
{
uchar i;
uchar dat1=0;
uchar dat2=0;
ADC_CLK = 0; // 电平初始化
ADC_DAT = 1;
_nop_();
ADC_CS = 0;
WavePlus(); // 起始信号
ADC_DAT = 1;
WavePlus(); // 通道选择的第一位
ADC_DAT = 0;
WavePlus(); // 通道选择的第二位
ADC_DAT = 1;
for(i=0;i<8;i++) // 第一次读取
{
dat1<<=1;
WavePlus();
if(ADC_DAT)
dat1=dat1|0x01;
else
dat1=dat1|0x00;
}
for(i=0;i<8;i++) // 第二次读取
{
dat2>>= 1;
if(ADC_DAT)
dat2=dat2|0x80;
else
dat2=dat2|0x00;
WavePlus();
}
_nop_(); // 结束此次传输
ADC_DAT = 1;
ADC_CLK = 1;
ADC_CS = 1;
if(dat1==dat2) // 返回采集结果
return dat1;
else
return 0;
}
软件下载及使用说明.rar
(4.07 MB, 下载次数: 79)
仿真.rar
(78.23 KB, 下载次数: 71)
源程序.rar
(74.89 KB, 下载次数: 82)