文章目录
- 前言
- 一、项目概述
-
- 1.1 系统概述
- 1.2 功能设计
- 二、项目硬件设计
-
- 2.1 AT89C51单片机最小系统
- 2.2 外设电路
- 三、项目软件设计
-
- 3.1 程序代码设计
- 四、项目调试分析
-
- 4.1 Proteus 仿真调试
- 4.2 结果分析
- 总结
- 附录
前言
- 大家好,我是三个!这是我51单片机专栏的第三篇文章。本文将基于一个小项目完全分享——Proteus光控夜灯。
一、项目概述
1.1 系统概述
针对长期照明造成能源浪费的问题,本文设计了一种基于Proteus光控夜灯。该系统需要实时监控室内照明变化,在正常和强光下关闭照明,并在弱光下自动打开照明以提供照明。同时,当光线超过一定阈值时,打开蜂鸣器,实现报警功能。
1.2 功能设计
根据上述需求分析,需要以下关键模块:光测量模块、指示灯模块、照明模块、显示模块和报警模块。
- 光测量模块:在光检测电路部分,可通过调节光强度来模拟实际光情况,改变光电阻值,控制LED灯亮灭。
- 指示灯和报警模块:系统检测到光强高于某一确定值K1.蜂鸣器报警可实现,提醒用户此时光线过强,档位指示灯亮黄,表示强档;光强低于另一定值K2时,档位指示灯绿灯亮起,表示弱档,蜂鸣器不启动;光强在K1~K二、档位指示灯蓝灯亮起,表示中档。
- 显示模块:使用共阴极数字管显示光强,可直观地告知用户此时的光情况。
- 照明模块:当系统位于高档和中档时,LED灯不亮;当系统位于弱档时,LED照明,实现照明功能。
如下图所示:
二、项目硬件设计
该系统的硬件设计包括AT89C51控制器核心电路和外部电路设计、照明电路、报警电路和显示模块电路设计Proteus仿真软件上设计系统的仿真电路。
2.1 AT89C51单片机最小系统
单片机最小系统电路,又称最小应用电路,是指由最小元件组成的单片机能够工作的系统,AT89C51最小系统电路主要由单片机、晶振电路和复位电路组成。如下图所示:
2.2 外设电路
- 光检测模块 光检模块的核心部分是光敏电阻ADC0832芯片通过调节光,改变光敏电阻值A/D转换,实现光检测。
- 指示灯模块 当系统数字管显示值大于30时,系统处于强档,黄灯亮;当数字管显示值大于20且小于30时,系统处于中档,蓝灯亮;当数字管显示值小于或等于20时,系统处于弱档,绿灯亮。
- 照明模块 当光控夜灯系统处于弱档时,LED照明,实现照明功能。
- 报警模块 当光控夜灯系统处于强档时,LED黄灯亮,关闭照明功能,打开蜂鸣器,实现报警功能。S关闭蜂鸣器报警。
- 显示模块 单片机读取ADC,将模拟信号转换为数字信号,通过共阴极数字管显示不同时刻的光强,用户可以直观地看到此时的光强。
三、项目软件设计
本系统的软件代码设计采用Keil uVision4编写。利用基于Proteus模拟软件的单片机设计过程对系统进行模拟测试,通过将编写的程序烧录到单片机中,实现系统所需的所有功能。程序首先完成初始化过程,调整光,改变光敏电阻值,然后根据光强度实现LED灯的亮与否以及蜂鸣器报警。基于Proteus如图所示。
3.1 程序代码设计
- 光检测模块
采用照明检测模块LDR光敏电阻和ADC0832芯片,系统启动运行后,首先初始化单片机,然后通过光检测读取单片机ADC,将模拟信号转换为数字信号,以获得当前的光强并显示在共阴极数字管上。ADC()函数程序代码如下:
unsigned char ADC() //通道ch0 {
unsigned char temp0,temp1,i; CS=1; ///开始转换周期 CLK=0; //准备第一个脉冲 _nop_(); _nop_(); ///空操作两个机械周期 CS=0; //片选能,低电平芯片使能,芯片开始工作 temp0=0; temp1=0; _nop_();
_nop_();
DI=1; //开始位,开始转换
_nop_();
_nop_();
CLK=1; //第一个脉冲
_nop_();
_nop_();
CLK=0; //第一个脉冲的下降沿,之前DI为高电平
_nop_();
_nop_();
DI=0;
_nop_();
_nop_();
//选择通道CH0,在第2、3个脉冲的下降沿之前。DI端口输入两位数据,用于选择数据采集通道 //
DI=1; //DI置1,通道选择信号
_nop_();
CLK=1; //第二个脉冲
_nop_();
CLK=0; //第二个脉冲下降沿
_nop_();
DI=0; //DI置零,选择通道CH0
_nop_();
CLK=1; //第三个脉冲
_nop_();
CLK=0;
_nop_();
DI=1; //第三个脉冲下沉之后,输入端DI失去作用,应置1,释放总线
//********通道选择结束开始读取转换后的二进制数****
//下降沿读数,一下进行判断和处理,共8次
for(i=0;i<8;i++) //每个下降沿处都可以从DO读出一位数据,一共读8位,最高位在最前
{
temp0=temp0<<1; //将一个数的各二进制位左移1位,高位舍弃,低位补0,依次输出
CLK=1;
if(DO)
temp0++;
_nop_();
CLK=0;
}
for(i=0;i<8;i++) //再读8位,最低位在最前,用于做校验
{
temp1=temp1>>1; //将一个数的各二进制位右移1位,最高位为0,右移后,空缺位补0;最高位为1,空缺位补10。//
CLK=1;
if(DO)
temp1=temp1 +0x80;
_nop_();
CLK=0;
}
CS=1;
if(temp1=temp0) //校验两次读数
return temp0;
return temp0; //返回数模转换的数值
}
- 指示灯、报警、照明模块
通过定时器0中断,实现指示灯、报警、照明功能。定时器0初始化具体程序代码如下:
void tminer0_Init()
{
led1=0;led2=0;led3=0;
TMOD|=0X01; //TMOD定时器模式寄存器,选择工作方式为16位定时器
TH0=0X3C; //设置初始值,计数起点50ms
TL0=0XB0;
ET0=1; //打开定时器0中断
EA=1; //打开总中断
TR0=1; //定时器0 开始计时
}
//主程序可以实现数码管的显示。
void main()
{
tminer0_Init();
while(1)
{
//显示光照数据
P0=smgduan[light/10]; //第一个数码管
smg1=0;
delay(100); //延时100ms
smg1=1;
P0=smgduan[light%10]; //第二个数码管
smg2=0;
delay(100);
smg2=1;
//停止报警
if(!k1)
{
flag=1;
beep=1;
}
}
}
//中断子程序如下:
void Timer0() interrupt 1
{
unsigned int D;
TH0=0X3C; //重新赋初始值,保证每次进入中断函数都是50ms
TL0=0XB0;
if(time<10) //0.5s
time++;
else
{
time=0;
D=ADC();
light=D*100/256;
//判断
if((light>30)&&(flag==0)) //强
{
beep=0;
led1=1;led2=0;led3=0;
}
if((light<31)&&(light>20)) //中
{
led1=0;led2=1;led3=0;
beep=1;
lamp=1;
flag=0;
}
if(light<21) //弱
{
led1=0;led2=0;led3=1;
beep=1;
lamp=0;
flag=0;
}
}
}
四、项目调试与分析
打开Protues软件,可以对系统进行Proteus仿真,将程序生成的.hex文件导入仿真系统的单片机内,运行仿真系统。
4.1 Proteus 仿真调试
- 进行仿真时,可以调试光照强度,改变光敏电阻阻值,模拟实际光照情况。当数码管显示光照大于阈值30时,强指示灯会亮起,并且蜂鸣器开始报警,提醒人们光照较强。通过控制按钮S2可以停止报警,控制按钮S1,复位后仍可重新报警。
- 当数码管显示光照小于等于20时,弱指示灯会亮起,同时,小夜灯(LED-4)开始照明工作,且蜂鸣器不会报警,此时模拟实际光照较弱的情况。
4.2 结果分析
通过测试,本系统设计可以实现课题预期所有功能。光照检测模块能够比较完美地模拟出实际光照情况。 当光照小夜灯位于强档时,数码管可以显示当前光照强度数值,关闭照明功能,同时开启报警功能,提醒用户此时光照过强,而且可以通过按键开启停止报警功能;当位于中档时,数码管同样显示当前光照强度数值,关闭照明功能和报警功能。当光照小夜灯位于弱档时,数码管可以显示此时光照强度数值,关闭报警功能,开启照明功能。
总结
本文设计了一种基于Protues的光照小夜灯。针对目前社会上长时间照明,既不环保也不节能,大量浪费电能,造成能源资源浪费问题设计的光控小夜灯。模拟实际中不同光照情况,实现自动控制照明。 本系统以AT89C51单片机为主控单元,通过光照检测模块检测此时的光照情况,反馈给主控单元,由主控单元决策照明模块是否工作。而且通过数码管显示当前光照强度。如果此时系统位于高档状态,蜂鸣器启动,实现报警功能来告诉用户此时光照过强,并且该报警功能可以手动停止。 具体功能实现如下: (1)光照小夜灯位于强档时,数码管显示当前的光照强度数值应大于30,关闭照明功能,同时开启报警功能,提醒用户此时光照过强,而且可以通过按键开启停止报警功能。 (2)光控小夜灯位于中档时,数码管显示的当前光照强度数值应大于20且小于等于30,关闭照明功能和报警功能。 (3)光照小夜灯位于弱档时,数码管显示的当前光照强度数值应小于等于20,关闭报警功能,开启照明功能。 最后通过模拟测试,系统可以满足设计需求,基本实现预期目标。
附录
附录A 元件清单图