基于单片机的智能照明系统
全套资源下载地址: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