51单片机实训(一)

您所在的位置:网站首页 智能灯光亮度调节原理 51单片机实训(一)

51单片机实训(一)

2024-06-13 05:03| 来源: 网络整理| 查看: 265

文章目录 前言一、项目概述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~K2之间时,档位指示灯蓝灯亮起,表示中档。显示模块:采用共阴极数码管显示光照强度,可以直观地告诉用户此时的光照情况。照明模块:当系统位于高档和中档时,LED灯不亮;当系统位于弱档时,LED灯亮,实现照明功能。

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

在这里插入图片描述

二、项目硬件设计

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

2.1 AT89C51单片机最小系统

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

显示模块 单片机读取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 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 beep=0; led1=1;led2=0;led3=0; } if((light20)) //中 { led1=0;led2=1;led3=0; beep=1; lamp=1; flag=0; } if(light


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3