基于单片机的智能照明系统
全套资源下载地址: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(); //初始化BH1750while(1) //循环{ Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution modedelay_nms(180); //延时180msMultiple_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++; }elseif(!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;}elseif(!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
基于单片机的智能照明系统相关推荐
- 基于单片机的智能照明灯系统
设计简介: 本设计是基于单片机的智能照明灯系统,主要实现以下功能: 可通过LCD1602显示光照强度和模式: 可通过按键切换模式和调节灯的亮度: 可通过蓝牙控制灯: 可通过红外遥控器控制. 标签:51 ...
- 基于单片机的智能教室控制系统的设计
word完整版可点击如下下载>>>>>>>> 基于单片机的智能教室控制系统的设计_c++课程设计题目汇总-硬件开发文档类资源-CSDN下载内容包括详细 ...
- 单片机声光电子琴程序流程图_基于单片机的智能家居控制系统毕业设计
次毕业设计主要包括硬件端和软件端,硬件端功能如下: 使用 DS1302 模块产生时钟数据并实现时间和日历实时显示: 使用 DS18B20 模块检测周围环境温度并实时显示: 使用烟雾和光敏传感器模块对房 ...
- 单片机c语言慧尾灯编码,(参考)基于单片机的智能尾灯开发文档.doc
基于单片机的智能尾灯的设计 摘要 本设计是基于单片机的自行车智能尾灯控制器,该设计为STC89S52单片机做为主控芯片的自行车尾灯控制电路的设计方法,用发光二极管模拟自行车尾灯,按键开关作为转弯等控制 ...
- 智能循迹避障小车C语言程序编写思路,基于单片机的智能小车红外避障循迹系统设计与制作...
余秀玲 余秀娟 摘 要:随着科技的高速发展,人们对生活质量的要求越来越高,无人驾驶汽车已经被广为研发和试用,由此智能小车的快速发展也是在情理之中.通过对基于单片机的智能小车的硬件及软件设计分析,实现红 ...
- 基于单片机的智能花盆
设计简介: 本设计是基于单片机的智能花盆,主要实现以下功能: LCD1602显示当前温度.土壤湿度以及光照值 继电器控制加热.水泵.输液以及补光 步进电机模拟松土 可通过按键设置温度.土壤湿度.光照度 ...
- 智能窗帘传感器c语言程序,基于单片机的智能窗帘控制系统设计(附程序代码)
基于单片机的智能窗帘控制系统设计(附程序代码)(论文18000字,程序代码) 摘要:二十一世纪初以来,科学技术不断发展,智能家居涌现于各家各户,人们越来越重视生活质量的提高.但是传统的手动开合窗帘耗时 ...
- 基于单片机的智能宠物喂食器设计
word完整版可点击如下下载>>>>>>>> 基于单片机的智能宠物喂食器设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题 ...
- 基于单片机的智能电表-交流电压电流互感器设计
150[毕设课设]基于单片机的智能电表-交流电压电流互感器设计(电路图+程序+论文) [资源下载]下载地址如下: https://docs.qq.com/doc/DTlRSd01BZXNpRUxl 本 ...
最新文章
- 刷新存储器的容量单位是什么_GD25Q80CSIG|相变存储器是什么,具备什么特点?
- jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他
- data 谷歌浏览器更改user 路径_Chrome浏览器自定义设置个人信息存储路径
- OpenStack精华问答 | NOVA计算服务
- 学习结构[记录]类型(7) - 结构也可以有构造函数
- pl/sql操作数据库之触发器的使用
- Oracle database sqldeveloper study(1)
- 使用django-admin 上传-下载 文件
- 双目估计方法_双目深度估计中的自监督学习概览
- blob 在线解码_roon、NAS图文全攻略 | 试听欧博旗舰RDS1电池数字界面转盘+旗舰RDB1电池解码器(三)。...
- web 前端面试题50道
- [设计模式] 调停者模式(Mediator Pattern)
- 前端表格里的数据不换行
- 如何让360浏览器打开网页默认为“极速模式”
- torchtext.vocab
- 零碎知识点之二:循环平稳信号
- 初始3D打印机(Hori 3D Z600)
- 打破行业困境,大麦如何引领NB-IoT技术的创新应用
- 补天SRC漏洞挖掘(一):主域名爬取
- LDA模型应用、问题、评估
热门文章
- C++基础-字符串的排序与查找案例(查找姓名位置)
- yy黑盒测试岗一面面经--这杯水好凉
- 让子弹飞飞飞 | 几维安全和子弹短信伴飞
- 干货 | 提升演讲能力的7个小技巧
- Module not found: Error: Can‘t resolve
- 单页面的网站怎么做呢?seo不做竞价,只要权重
- networkx绘制网络图的知识点
- 秋招手撕代码:verilog实现常规8-3编码器和优先级8-3编码器
- SCI 投稿全过程信件模板
- 【Python】sklearn 中的 make_blobs() 函数详解