基于单片机的智能照明系统

全套资源下载地址:https://download.csdn.net/download/sheziqiong/86772153
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86772153
目 录
摘 要 II
1 绪论 1
2 系统总体设计 3
2.1设计内容 3
2.2主要工作 3
3 硬件设计 4
3.1 电路工作原理 4
3.2 电路控制系统 5
3.3 显示电路 9
3.4 传感器 10
3.5 灯泡控制部分 12
4 程序设计 14
4.1 主程序模块 14
4.2 BH1750FVI初始化模块 15
4.3 部分电路程序 15
5 电路硬件的焊接与调试 19
5.1 电路的焊接 19
5.2 程序烧写 20
5.3 调试 21
小 结 23
参考文献 24
致 谢 25
附录Ⅰ 26
2 系统总体设计

2.1设计内容
本系统采用STC89C52系列的单片机为核心,利用BH1750传感器测量实时光照强度,并将亮度的模拟信号转化成数字信号,大大减少了系统的结构。其特点是有两种模式,为手动和自动两种模式。在自动模式下,根据单片机1获得传感器测得的光照强度数据,传送给单片机2,自动调节灯泡的亮暗强度;在手动模式下,由人机对话,人工控制灯泡亮暗程度。实现多功能智能系统。如图2-1所示:
基于单片机的智能照明系统_第1张图片

图2-1 设计模块图
2.2主要工作如下:
1.利用BH1750模块对环境的实时亮暗强度进行数据采集,并把采集的模拟信号转换成数字信号,发送给单片机进行处理和计算
2.通过编程用单片机和数码管来实现光照强度及相关数据的显示
3.根据单片机串口通信,实现单片机1和单片机2之间的通信
4.实现对小灯泡的驱动及一些相关控制
5.利用串口的输入功能,结合键盘实现相关控制
3.1.1工作原理
本设计是由硬件和软件相结合,应用软件控制硬件的自动智能化工作。采用STC89C52系列的单片机为核心,利用BH1750传感器测量实时光照强度,并将亮度的模拟信号转化成数字信号,大大减少了系统的结构。其特点是有两种模式,为手动和自动两种模式。在自动模式下,根据单片机1获得传感器测得的光照强度数据,传送给单片机2,自动调节灯泡的亮暗强度;在手动模式下,由人机对话,人工控制灯泡亮暗程度。实现多功能智能系统。
3.1.2工作过程
给电路通以+5v电压,电路进入初始化工作,大约1s后,传感器BH1750开始采集检测环境信息,然后将获得的信息通过p3.5和p3.6脚传送到单片机进行数据分析和处理,最后将信号传输至数码管显示与单片机2,经单片机2处理数据后调节灯泡的亮暗。
3.2电路控制系统
本电路的控制系统为单片机最小系统(STC89C52、时钟电路、复位电路)。以单片机芯片STC89C52作为CPU,时钟电路由一个频率为12MHz的晶振和两个30pF的电容组成,复位电路由一个10uF的电容和一个10k的电阻组成。

#include  	
#include      //Keil library  
#include     //Keil library	
#include  
#define   uchar unsigned char
#define   uint unsigned int		
#define	  SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                              //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
uchar code  dis[14]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0xf6,0xf0,0xff};

sbit SCL=P3^6;      //IIC时钟引脚定义
sbit SDA=P3^5;      //IIC数据引脚定义
sbit P27=P2^7;				   
sbit P26=P2^6;				   
sbit P25=P2^5;				   
sbit P24=P2^4;				   
sbit moshi=P1^2;			   //模式按键
sbit qiehuan=P1^3;			   //调档按键
sbit shezhi=P1^4;			   //设置按键
sbit jia=P1^5;				   //加法按键
sbit jian=P1^6;				   //减法按键
sbit zhiling=P1^7;			   //置零按键
sbit zsd=P3^7;				   //模式指示灯
sbit shuju1=P2^3;			   //数据串口1
sbit shuju2=P2^2;			   //数据串口2
sbit shuju3=P2^1;			   //数据串口3
sbit shuju4=P2^0;			   //数据串口4
sbit zsd1=P1^1;            	   //设置指示灯
sbit fmq=P1^0;

typedef   unsigned char BYTE;
typedef   unsigned short WORD;
BYTE    BUF[8];                         //接收数据缓存区      	
void InitLcd();
void Init_BH1750(void);
void disp();
void Delay(uint i);
void delay_nms(unsigned int k);
void key(void);
void qudou(void);
void xianshi();
void csh();
void jingbao();		
void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据
uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据
void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BH1750_Start();                    //起始信号
void BH1750_Stop();                     //停止信号
void BH1750_SendACK(bit ack);           //应答ACK
bit  BH1750_RecvACK();                  //读ack
void BH1750_SendByte(BYTE dat);         //IIC单个字节写
BYTE BH1750_RecvByte();                 //IIC单个字节读
void conversion(uint temp_data);

uchar   ge=12;shi=11;bai=11;qian=10;guangzhao,daima=0;            //光照变量
int     dis_data;xxs;dang;dt;              //变量
int yi=100;er=200;san=300;si=400;e=0;linshi=0;h=0;
int ms=0;p=1;ss=0;td=0;mode_flag=1;shijian=0;
  /**************************************
 **************主函数*******************
**************************************/
void main()
{  float temp;
   TMOD=0x01;  //中断开启   
   TH0 = 0x0FF;
   TL0 = 0x38;
   TR0=1;      
   ET0=1;
   EA=1;        
   csh();				//初始化显示
   Init_BH1750();       //初始化BH1750
  while(1)              //循环
  { Single_Write_BH1750(0x01);   // power on
    Single_Write_BH1750(0x10);   // H- resolution mode

     delay_nms(180);              //延时180ms

    Multiple_Read_BH1750();       //连续读出数据,存储在BUF中

    dis_data=BUF[0];
    dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
    
    temp=(float)dis_data/1.2;
    conversion(temp);    		  //数据转换

	key();
  }								  
} 
  /**************************************
 ***********数据转换和显示**************
**************************************/
void conversion(uint temp_data)  //数据转换
{  guangzhao=temp_data;
   if(!ss)
   { if(p==1)
    {if(shijian<=0) 
     {qian=guangzhao%10000/1000;   
      bai=guangzhao%10000%1000/100;
      shi=guangzhao%10000%1000%100/10;
      ge=guangzhao%10000%1000%100%10;
	 }
	 else
	 { shijian--;
	   qian=10;
       bai=dang/10;
  	   shi=dang%10;
	   ge=12;
	 }
	}
	 else
   {if(shijian<=0) 
    {qian=10;
     bai=dang/10;
  	 shi=dang%10;
	 ge=12;
    }
	else
    { shijian--;
	  qian=guangzhao%10000/1000;   
      bai=guangzhao%10000%1000/100;
      shi=guangzhao%10000%1000%100/10;
      ge=guangzhao%10000%1000%100%10;
	}
   }
   }
   else
   {qian=yi/1000;
    bai=yi%1000/100;
	shi=yi%1000%100/10;
	ge=yi%1000%100%10;
   }
   if(guangzhao>1000)
   { jingbao();  }
   else	 
    fmq=1;   
}
void jingbao()
{h++;
 if(h<4)
 {fmq=0;}
 else if(h<8)
 {fmq=1;}
 else h=0;
}


  /**************************************
 **********按键确认子函数***************
**************************************/
void jia_key()				 //加法扫描
{

if (jia==0)
{  if(mode_flag==2)
   { yi++; }
   else
   if(!p)
   { td++;
     if(td==5)
	 td=4;
   }

}while(jia==0);

}
void jian_key()				 //减法扫描
{

if (jian==0)
{ if (mode_flag==2)
  { yi--;
    if(yi<=0)
    yi=0;
  }
  else
  if(!p)
  { td--;
    if(td<=0)
	td=0;
  }
}while(jian==0);

}
void shezhi_key( )		      //设置扫描
{

if(shezhi==0)
{
mode_flag++;
if (mode_flag==3)
{
mode_flag=1;
}
}while(shezhi==0);

switch(mode_flag)
{
case 1:
ss=0;zsd1=1;
break;
case 2:
ss=1;zsd1=0;
break; 
}
} 
void moshi_key()				//模式切换扫描
{   
     if(moshi==0)
    {ms++;
     if (ms==2)
    {ms=0;p=1;}
	 else p=0;
    }while(moshi==0);
    
   
}
void zhiling_key()				//置零扫描
{  
     if(zhiling==0)
    { yi=100;
    }while(zhiling==0);
    
}
void qiehuan_key()				//切换显示扫描
{
	 if(qiehuan==0)
	{ shijian=30;
	}while(qiehuan==0);
	
}
/**************模式调用子函数******************/
void zidong()			//自动
{ if(guangzhao<=yi)
  {shuju1=1;shuju2=1;shuju3=1;shuju4=1;dang=4;}	  //0档
  else if(guangzhao<=er)					  
  {shuju1=0;shuju2=1;shuju3=1;shuju4=1;dang=3;}	  //1档
  else if(guangzhao<=san)
  {shuju1=1;shuju2=0;shuju3=1;shuju4=1;dang=2;}	  //2档
  else if(guangzhao<=si)
  {shuju1=1;shuju2=1;shuju3=0;shuju4=1;dang=1;}	  //3档
  else 
  {shuju1=1;shuju2=1;shuju3=1;shuju4=0;dang=0;}	  //4档
}
void shoudong()			//手动
{
switch(td)
    {case 4:		
	 shuju1=0;shuju2=0;shuju3=0;shuju4=0;dang=4;	  //4档
     break;
     case 3:		 
	 shuju1=1;shuju2=0;shuju3=0;shuju4=0;dang=3;	  //3档
     break;
	 case 2:		
	 shuju1=0;shuju2=1;shuju3=0;shuju4=0;dang=2;	  //2档
     break;
     case 1:		 
	 shuju1=0;shuju2=0;shuju3=1;shuju4=0;dang=1;	  //1档
     break;
	 case 0:
	 shuju1=0;shuju2=0;shuju3=0;shuju4=1;dang=0;	  //0档
	 break;	 }
}
void jisuan()	//档限计算
{ er=yi+100;
  san=er+100;
  si=san+100;
}
/*********键盘扫描********/
void key(void)
{  jia_key();	   //加法
   jian_key();	   //减法
   shezhi_key();   //设置
   moshi_key();	   //模式切换
   zhiling_key();  //置零
   qiehuan_key();  //切换显示
   jisuan();	   //档限计算
  switch(p)
    { case 1:		 //自动
	  zidong(),zsd=1;
      break;
      case 0:		 //手动
	  shoudong(),zsd=0;
      break;}
}
/*********初始化********/
void csh()
{  int i;
   for(i=0;i<300;i++)
   { 
   shuju1=1;shuju2=1;shuju3=1;shuju4=0;
   }
}


//-----------------------------------
//毫秒延时**************************
void delay_nms(unsigned int k)	
{						
unsigned int i,j;				
for(i=0;i

基于单片机的智能照明系统_第2张图片

基于单片机的智能照明系统_第3张图片
基于单片机的智能照明系统_第4张图片
基于单片机的智能照明系统_第5张图片
基于单片机的智能照明系统_第6张图片
基于单片机的智能照明系统_第7张图片
基于单片机的智能照明系统_第8张图片
基于单片机的智能照明系统_第9张图片
基于单片机的智能照明系统_第10张图片
基于单片机的智能照明系统_第11张图片
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86772153
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86772153

你可能感兴趣的:(单片机,stm32,嵌入式硬件,智能照明系统,毕业设计)