当前位置: 首页 > news >正文

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

全套资源下载地址: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所示:
在这里插入图片描述

图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  <REG51.H>	
#include  <math.h>    //Keil library  
#include  <stdio.h>   //Keil library	
#include  <INTRINS.H>
#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<k;i++)
{			
for(j=0;j<121;j++)			
{;}}						
}

//*********************************************************

/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
    _nop_();_nop_();_nop_();_nop_();
    _nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
}

/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
    WORD n = 560;

    while (n--);
}

/**************************************
起始信号
**************************************/
void BH1750_Start()
{
    SDA = 1;                    //拉高数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 0;                    //产生下降沿
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
}

/**************************************
停止信号
**************************************/
void BH1750_Stop()
{
    SDA = 0;                    //拉低数据线
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SDA = 1;                    //产生上升沿
    Delay5us();                 //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(bit ack)
{
    SDA = ack;                  //写应答信号
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时
}

/**************************************
接收应答信号
**************************************/
bit BH1750_RecvACK()
{
    SCL = 1;                    //拉高时钟线
    Delay5us();                 //延时
    CY = SDA;                   //读应答信号
    SCL = 0;                    //拉低时钟线
    Delay5us();                 //延时

    return CY;
}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(BYTE dat)
{
    BYTE i;

    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;              //移出数据的最高位
        SDA = CY;               //送数据口
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    BH1750_RecvACK();
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{
    BYTE i;
    BYTE dat = 0;

    SDA = 1;                    //使能内部上拉,准备读取数据,
    for (i=0; i<8; i++)         //8位计数器
    {
        dat <<= 1;
        SCL = 1;                //拉高时钟线
        Delay5us();             //延时
        dat |= SDA;             //读数据               
        SCL = 0;                //拉低时钟线
        Delay5us();             //延时
    }
    return dat;
}

//*********************************

void Single_Write_BH1750(uchar REG_Address)
{
    BH1750_Start();                  //起始信号
    BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
    BH1750_SendByte(REG_Address);    //内部寄存器地址,
  //  BH1750_SendByte(REG_data);       //内部寄存器数据,
    BH1750_Stop();                   //发送停止信号
}

//********单字节读取*****************************************
/*
uchar Single_Read_BH1750(uchar REG_Address)
{  uchar REG_data;
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress);           //发送设备地址+写信号
    BH1750_SendByte(REG_Address);                   //发送存储单元地址,从0开始	
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    REG_data=BH1750_RecvByte();              //读出寄存器数据
	BH1750_SendACK(1);   
	BH1750_Stop();                           //停止信号
    return REG_data; 
}
*/
//*********************************************************
//
//连续读出BH1750内部数据
//
//*********************************************************
void Multiple_read_BH1750(void)
{   uchar i;	
    BH1750_Start();                          //起始信号
    BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
	
	 for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF
    {
        BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
        if (i == 3)
        {

           BH1750_SendACK(1);                //最后一个数据需要回NOACK
        }
        else
        {		
          BH1750_SendACK(0);                //回应ACK
       }
   }

    BH1750_Stop();                          //停止信号
    Delay5ms();
}


//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
   Single_Write_BH1750(0x01);  

}
void time1(void) interrupt 1	 //定时器中断1,每20ms中断一次
{   TH0 = 0x0FF;
    TL0 = 0x38;
  switch(daima)
  {case 0:
   P27=0;P26=0;P25=0;P24=0;  
   P0 =dis[qian];  
   P27=1;P26=0;P25=0;P24=0;      
   break;

   case 1:
   P27=0;P26=0;P25=0;P24=0;  
   P0 =dis[bai];  
   P27=0;P26=1;P25=0;P24=0;      
   break;

   case 2:
   P27=0;P26=0;P25=0;P24=0;  
   P0 =dis[shi];  
   P27=0;P26=0;P25=1;P24=0;      
   break;

   case 3:
   P27=0;P26=0;P25=0;P24=0;  
   P0 =dis[ge];  
   P27=0;P26=0;P25=0;P24=1;      
   break;

  }
  daima++;
  if(daima==4)
  daima=0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86772153
全套资源下载地址:https://download.csdn.net/download/sheziqiong/86772153

相关文章:

  • 做外贸网站有什么用/合肥网
  • espcms易思企业网站管理系统破解/百度热搜榜第一
  • 在线做logo的网站/seo综合查询工具
  • 深圳北站设计者/武汉关键词排名推广
  • 网站建设岗位能力/网络推广营销软件
  • 有没有专业做特产的网站/什么广告推广最有效果
  • Visual Studio扩展插件
  • 12.MongoDB系列之副本集管理
  • 【初学者入门C语言】之编译预处理(十)
  • 【JavaWeb】之Maven
  • 牛客网专项练习30天Pytnon篇第25天
  • 【RPA前置知识】 整理并总结 Assign 和 AssignT 类
  • SpringBoot整合RabbitMq实现ACK机制--消息回退机制--消息确认机制
  • 关于“八音盒自定义弹奏”的一些想法
  • linux学习(青少年学Linux)
  • 从此刻开始走进HTML的大门!!!
  • TCP通信相关函数
  • Codeforces Global Round 23(A~C)