51单片机实训(一)————基于Proteus的光控灯


前言

  • 大家好,我是三🐎!这是我51单片机专栏的第三篇文章,本文将完整地分享一个小项目————基于Proteus的光控灯。

一、项目概述

1.1 系统概述

本文针对目前长时间照明,造成能源浪费的问题,设计一种基于Proteus的光控灯。要求该系统能够实时监测室内的光照变化,能够在光照正常、光照较强时关闭灯光,光照弱时自动打开灯光,提供照明。同时,在光照超过一定阈值时,开启蜂鸣器,实现报警功能。

1.2 功能设计

根据以上的需求分析需要如下几个关键模块:光照测量模块、指示灯模块、照明模块、显示模块和报警模块。

  • 光照测量模块:在光照检测电路部分,可以通过调节光照强度来模拟实际光照情况,改变光敏电阻阻值,控制LED灯的亮与灭。
  • 指示灯和报警模块:系统检测到光照强度高于某一确定值K1时,可以实现蜂鸣器报警,提醒用户此时光照过强,档位指示灯黄灯亮起,表示强档;光照强度低于另一确定值K2时,档位指示灯绿灯亮起,表示弱档,蜂鸣器不启动;光照强度在K1~K2之间时,档位指示灯蓝灯亮起,表示中档。
  • 显示模块:采用共阴极数码管显示光照强度,可以直观地告诉用户此时的光照情况。
  • 照明模块:当系统位于高档和中档时,LED灯不亮;当系统位于弱档时,LED灯亮,实现照明功能。

系统整体方案设计如下图所示:

在这里插入图片描述


二、项目硬件设计

本系统的硬件设计包括AT89C51控制器核心电路以及外设电路设计,光照测量电路设计、指示灯电路设计、照明电路、报警电路和显示模块电路设计,并在Proteus仿真软件上设计系统的仿真电路。

2.1 AT89C51单片机最小系统

单片机最小系统电路,又称最小应用电路,是指用最少的元件组成的单片机可以工作的系统,AT89C51的最小系统电路主要由单片机、晶振电路、复位电路组成。如下图所示:

在这里插入图片描述

2.2 外设电路

  1. 光照检测模块
    光照检测模块核心部分为光敏电阻和ADC0832芯片,通过调节光照,改变光敏电阻阻值大小,通过A/D转换,实现光照检测。

在这里插入图片描述

  1. 指示灯模块
    当系统数码管显示数值大于30时,系统置于强档,黄灯亮;数码管显示数值大于20且能小于等于30时,系统置于中档,蓝灯亮;数码管显示数值小于等于20时,系统置于弱档,绿灯亮。

在这里插入图片描述

  1. 照明模块
    当光控灯系统置于弱档时,LED灯亮,实现照明功能。

在这里插入图片描述

  1. 报警模块
    当光控灯系统置于强档时,LED黄灯亮,关闭照明功能,开启蜂鸣器,实现报警功能。但可以通过按钮S2关闭蜂鸣器报警。

在这里插入图片描述

  1. 显示模块
    单片机读取ADC,将模拟信号转化成数字信号,通过共阴极数码管显示不同时刻的光照强度,可以让用户直观地看到此时的光照情况。

在这里插入图片描述


三、项目软件设计

本系统的软件代码设计采用Keil uVision4编写。利用基于Proteus仿真软件的单片机设计流程对系统进行仿真测试,通过向单片机中烧录编写的程序,来实现系统所需要完成的全部功能。程序首先完成初始化过程,通过调节光照,改变光敏电阻阻值,然后根据光照强度来实现LED灯的亮与否以及蜂鸣器报警。基于Proteus的光控灯系统软件流程如图所示。
在这里插入图片描述

3.1 程序代码设计

  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;	//返回数模转换的数值
}
  1. 指示灯、报警、照明模块

通过定时器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 元件清单图
在这里插入图片描述

附录B 仿真文件在我的资源里面可以下载

评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐三馬

你的鼓励将是对我最大的帮助!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值