基于51单片机的电子智能补光器设计

引言

如今科技的飞速发展,各种大型隧道的修建也越来越多。伴随着交通的便利,各种交通事故也屡见不鲜。特别是在光线变化比较大的隧道出入口以及照明状况不理想的路段,很多照明设备都局限于路灯。而且由于不能实现智能控制,经常会导致使用寿命减少,容易损坏从而增加使用成本。

为了响应我国绿色发展的号召,智能补光器的发展自然也在其中。随着当今社会科技的高速发展以及人们对生活质量的越发重视、生活安全意识的显著提高,更加智能、有效的照明控制系统自然应运而生。为应对更加节能环保高效的照明需求,设计了基于单片机的智能补光器,根据不同季节的日照强度以及时长的不同采用对应的补光模式。满足照明强度的同时兼顾智能控制,延长使用寿命降低成本。

1 系统方案设计

1.1 系统整体设计

电子智能补光器的设计思路:首先通过单片机判断特殊天气模式是否启用,如果启用则直接亮黄灯并在手机上显示出来。确定特殊天气模式没有启用时,通过季节模块判断当前月份对应的季节来确定补光模式。通过光照传感器将外界光照强度与对应季节设定光照阈值进行比较,当外界光照强度大于设定阈值时进行补光操作,并通过蓝牙连接在手机上显示当前补光模式以及光照强度。

编辑切换为居中

图1-1 系统框图

1.2 设计任务

主要任务简述:以单片机为核心,设计电子智能补光器,以满足各种不同情境下对光照需求的差异。

要求简述:

(1)在外界光照强度大于所设定阈值时补光器保持不工作状态,光照强度小于设定阈值时开始补光;

(2)可选择春、夏、秋、冬四种模式,分别对应四种不同的阈值电压;

(3)设置特殊天气模式,开启特殊天气模式后亮起黄色雾灯;

(4)通过蓝牙连接手机,显示当前的模式和光照强度。

1.3 模块方案选型

1.3.1主控方案选型

STC89C52单片机是宏晶科技推出的高反应速度、低功率消耗、有着很强抵的挡外界干扰能力的单片机,而且该单片机的指令代码非常切合传统的8051单片机,并且与传统51单片机对比而言,该单片机速度更快,是传统51单片机的8~12倍。除此之外,该单片机还有6时钟周期和12时钟周期可以任意选择。

主要特性如下:

(1)新一代8051单片机,6时钟机器周期和12时钟机器周期可以任意选择,指令代码非常契合传统8051单片机。

(2)工作电压:5.5V~3.3V(5V单片机)。

(3)工作频率范围处于0~40MHz之间,相当于普通8051单片机工作频率的0~80MHz范围,而且新一代单片机的实际工作频率可达48MHz。

(4)一共具有3个16位定时器,也就是定时器T0、T1、T2。

(5)外部中断4路,低电平触发或下降沿中断电路,PowerDown模式可通过外部中断低电平触发中断的方式触发。

1.3.2光电转换器的选择

ADC0832是NS(National Semiconductor)公司生产的串行接口8位A/D转换器,通过三线接口与单片机连接,功耗低,性能价格比较高,合适使用在袖珍式的智能仪器仪表中。ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。芯片具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件连接和处理器控制变得更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。其主要特点如下:

(1)8位分辨率,其最高分辨可达256级;

(2)双通道A/D转换;

(3)电源供电时光电转换器的输入电压在0~5V之间;

选择该A/D转换芯片,不仅因为其体积小、功耗低,而且可以适应一般的模拟量转换要求,完全满足系统的要求。另外,其内部电源输入与参考电压的复用,使得转换芯片的模拟电压输入在0~5V之间,电源电路供电可以同时满足51单片机和该芯片的共同使用。除此之外该芯片的转换时间极短,仅为32μS,反应非常迅速,另外该芯片具有双数据输出可作为数据校验的工具,以此来减少实验数据误差,转换速度快并且稳定性能出色。单独工作的芯片的使能输入,可以更轻松地对多元件进行连接,同时也可以更加方便地控制处理器。通过DI 数据输入端,使得实现通道功能的选择变的易如反掌。除此之外,价格上的优势同样也是选择它的原因之一。

1.3.3显示器的选择

LCD1602液晶显示器是广泛使用的一种工业字符型液晶显示模块。由字符型液晶显示器(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成,能够同时显示16x02即32个字符。(16列2行)。但寄存器不止32个,有一些显示效果,如字符一个个显示、字符从左到右或从右到左显示等等,显示效果简单。当然也有其他更好的选择,例如12864液晶显示器,它的显示模块是128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,具有多种功能:光标显示、画面移位、睡眠模式等。

其实综合来说,二者编程方面的难度差不多,原理方面也差不多,甚至12864液晶显示器更胜一筹,因为该显示器显示更全面,字符也更多,需要进行更多操作的话自然是12864液晶显示器能够胜任。但是对比来说的话,1602液晶显示器也能实现设计的要求,而且相对来说更重要的原因就是1602液晶显示器比较廉价,网上购买也比较便宜,最低五六块钱左右。而12864液晶显示器网上购买最便宜的也要在二三十左右。所以从造价方面以及使用方面考虑,当然是价格低廉而且功能也不欠缺的优先。因此选择1602液晶显示器作为显示器件。

2 硬件设计

2.1 单片机模块

单片机的主要特点有:

(1)有出色的性能单价比,高效能、低电压,易于制作便携式产品。

(2)集成度高,体积小,有较高的稳定性。而且单片机把各功能零件组合在一块芯片上,内部结构使用的是总线结构,不仅减轻了各芯片彼此之间的连线,还大大增加了单片机的安全性和抗干扰能力。

(3)控制功能强。为求满足工业控制的要求,通常单片机的指令系统中均

有极多样的转移指令、I/O口的逻辑操作和位处理特性。单片机的逻辑控制功能及运转速度均远高于同一等级的微机。

(4)外部总线增加了I2C(Inter-Integrated Circuit)及SPI(Serial Peripheral Interface)等串行总线方式,逐步缩小了体积,精简了构造。单片机的系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统。

PORT0(P0.0~P0.7):端口0是一个8位宽的开路汲极双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。

PORT1(P1.0~P1.7):端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。

PORT2(P2.0~P2.7):端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。P2除了当做一般I/O端口使用外,若是在STC89C52扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。

PORT3(P3.0~P3.7):端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。单片机的引脚图如图3-1所示。

2.2 最小系统

最小系统电路由复位电路模块、晶振电路模块和组成,既可以通过电容上电直接复位也可以通过按键手动复位;时钟电路由晶体振荡器和两个瓷片电容组成,给单片机提供时钟信号。最小系统模块电路如图3-2所示。

2.3 传感器模块

正常情况下 ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于 DO 端与 DI 端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO 和 DI 并联在一根数据线上使用。由于 ADC0832 的数据转换时间仅为 32μS,所以 A/D 转换的数据采样频率可以很快,从而也保证的某些场合对 A/D 转换数据实时性的要求。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示起始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能,数据读取程序以子程序调用的形式出现,方便了程序的移植。传感器原件的电路原理图如下3-3所示。

2.4 显示器模块

LCD1602A是一种工业字符型液晶显示器,它的重量很轻,而且体积小,功耗也低,能够同时显示多种字符。16级LCD驱动电压调整电路内置上电复位电路(POR)液晶显示器通过显示器上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。其性能如下。

(1)指令功能强,能够组合各种输入、显示、位移方式以满足不同的要求。

(2)接口简单方便,内置32 kHz RC振荡器可与8位微处理器或微控制器相连;

(3)功耗低,抵抗干扰能力强,可靠性高。寿命为50,000小时(25℃);

显示器电路如图3-4所示。

器电路

#include "51Lib_Configure.h"
#include "51Lib_Declaration.h"

#if _CONFIG_FUNC_ADC1_ == CH_ENABLE

unsigned int dat = 0x00;      //AD值

/****************************************************************************
函数功能:AD转换子程序
入口参数:CH   0 or 1
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
      unsigned char i,test,adval;
     adval = 0x00;
     test = 0x00;
     ADC_Clk = 0;       //初始化
     ADC_DATI = 1;
    _nop_();
    ADC_CS = 0;
    _nop_();
    ADC_Clk = 1;
   _nop_();


   if ( CH == 0x00 )      //通道选择
   {
       ADC_Clk = 0;
       ADC_DATI = 1;      //通道0的第一位
       _nop_();
      ADC_Clk = 1;
        _nop_();
        ADC_Clk = 0;
      ADC_DATI = 0;      //通道0的第二位
      _nop_();
      ADC_Clk = 1;
      _nop_();
    } 
    else
    {
       ADC_Clk = 0;
    ADC_DATI = 1;      //通道1的第一位
      _nop_();
      ADC_Clk = 1;
      _nop_();
      ADC_Clk = 0;
      ADC_DATI = 1;      //通道1的第二位
    _nop_();
     ADC_Clk = 1;
     _nop_();
   }

      ADC_Clk = 0;
      ADC_DATI = 1;
    for( i = 0;i < 8;i++ )      //读取前8位的值
    {
       _nop_();
       adval <<= 1;
       ADC_Clk = 1;
       _nop_();
       ADC_Clk = 0;
       if (ADC_DATO)
          adval |= 0x01;
      else
          adval |= 0x00;
    }
      for (i = 0; i < 8; i++)      //读取后8位的值
      {
           test >>= 1;
           if (ADC_DATO)
              test |= 0x80;
           else 
              test |= 0x00;
          _nop_();
          ADC_Clk = 1;
          _nop_();
          ADC_Clk = 0;
      }
      if(adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
       dat = test;
       nop_();
       ADC_CS = 1;        //释放ADC0832
       ADC_DATO = 1;
       ADC_Clk = 1;
       return dat;
}


#endif

#if _CONFIG_FUNC_ADC_PARSE_ == CH_ENABLE
//根据实际情况调节数据
int Parse_Dat(unsigned int Get_Dat, unsigned char Type)
{
  unsigned int dParse_Dat;
  switch(Type)
  {
    case 0:
    {
      if(Get_Dat > 2)
      {
        dParse_Dat = ((Get_Dat-2)/WATER_PARSE);
      }
      else
        dParse_Dat = 0;
      break;
    }
    
    case 1:
    {
      dParse_Dat = Get_Dat + (Get_Dat * PM25_PARSE);
      break;
    }
    
    case 2:
    {
      Get_Dat = (Get_Dat/PH_ADC);
      if(Get_Dat>=368) 
      {
        dParse_Dat=0;
      }
      else 
      {
        Get_Dat = ((368-Get_Dat) /PH_DAT)+(((368-Get_Dat) /PH_DAT)*0.05);
        if(Get_Dat>140) 
        {
          dParse_Dat=140;
        }
        else
        {
          dParse_Dat = Get_Dat;
        }
      }
      break;
    }
    
    case 3:
    {
      dParse_Dat = (Get_Dat/5) *45;
      
      break;
    }
    
    case 4:
    {
      dParse_Dat = 11;
      if(Get_Dat <= (255/8)*1)
        dParse_Dat = 0;
      else if(Get_Dat <= (255/8)*2)
        dParse_Dat = 1;
      else if(Get_Dat <= (255/8)*3)
        dParse_Dat = 2;
      else if(Get_Dat <= (255/8)*4)
        dParse_Dat = 3;
      else if(Get_Dat <= (255/8)*5)
        dParse_Dat = 4;
      else if(Get_Dat <= (255/8)*6)
        dParse_Dat = 5;
      else if(Get_Dat <= (255/8)*7)
        dParse_Dat = 6;
      else// if(Get_Dat <= (255/8)*8)
        dParse_Dat = 7;
      break;
    }
    default:
      break;
  }
  return dParse_Dat;
}

#endif

image.png

image.png

image.png

image.png

 文章借鉴于此纷传

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值