全套资源下载地址: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

基于单片机的智能照明系统相关推荐

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

    设计简介: 本设计是基于单片机的智能照明灯系统,主要实现以下功能: 可通过LCD1602显示光照强度和模式: 可通过按键切换模式和调节灯的亮度: 可通过蓝牙控制灯: 可通过红外遥控器控制. 标签:51 ...

  2. 基于单片机的智能教室控制系统的设计

     word完整版可点击如下下载>>>>>>>> 基于单片机的智能教室控制系统的设计_c++课程设计题目汇总-硬件开发文档类资源-CSDN下载内容包括详细 ...

  3. 单片机声光电子琴程序流程图_基于单片机的智能家居控制系统毕业设计

    次毕业设计主要包括硬件端和软件端,硬件端功能如下: 使用 DS1302 模块产生时钟数据并实现时间和日历实时显示: 使用 DS18B20 模块检测周围环境温度并实时显示: 使用烟雾和光敏传感器模块对房 ...

  4. 单片机c语言慧尾灯编码,(参考)基于单片机的智能尾灯开发文档.doc

    基于单片机的智能尾灯的设计 摘要 本设计是基于单片机的自行车智能尾灯控制器,该设计为STC89S52单片机做为主控芯片的自行车尾灯控制电路的设计方法,用发光二极管模拟自行车尾灯,按键开关作为转弯等控制 ...

  5. 智能循迹避障小车C语言程序编写思路,基于单片机的智能小车红外避障循迹系统设计与制作...

    余秀玲 余秀娟 摘 要:随着科技的高速发展,人们对生活质量的要求越来越高,无人驾驶汽车已经被广为研发和试用,由此智能小车的快速发展也是在情理之中.通过对基于单片机的智能小车的硬件及软件设计分析,实现红 ...

  6. 基于单片机的智能花盆

    设计简介: 本设计是基于单片机的智能花盆,主要实现以下功能: LCD1602显示当前温度.土壤湿度以及光照值 继电器控制加热.水泵.输液以及补光 步进电机模拟松土 可通过按键设置温度.土壤湿度.光照度 ...

  7. 智能窗帘传感器c语言程序,基于单片机的智能窗帘控制系统设计(附程序代码)

    基于单片机的智能窗帘控制系统设计(附程序代码)(论文18000字,程序代码) 摘要:二十一世纪初以来,科学技术不断发展,智能家居涌现于各家各户,人们越来越重视生活质量的提高.但是传统的手动开合窗帘耗时 ...

  8. 基于单片机的智能宠物喂食器设计

     word完整版可点击如下下载>>>>>>>> 基于单片机的智能宠物喂食器设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题 ...

  9. 基于单片机的智能电表-交流电压电流互感器设计

    150[毕设课设]基于单片机的智能电表-交流电压电流互感器设计(电路图+程序+论文) [资源下载]下载地址如下: https://docs.qq.com/doc/DTlRSd01BZXNpRUxl 本 ...

最新文章

  1. 刷新存储器的容量单位是什么_GD25Q80CSIG|相变存储器是什么,具备什么特点?
  2. jdbc 自增id 原理_面试被问分布式ID怎么办? 滴滴(Tinyid)甩给他
  3. data 谷歌浏览器更改user 路径_Chrome浏览器自定义设置个人信息存储路径
  4. OpenStack精华问答 | NOVA计算服务
  5. 学习结构[记录]类型(7) - 结构也可以有构造函数
  6. pl/sql操作数据库之触发器的使用
  7. Oracle database sqldeveloper study(1)
  8. 使用django-admin 上传-下载 文件
  9. 双目估计方法_双目深度估计中的自监督学习概览
  10. blob 在线解码_roon、NAS图文全攻略 | 试听欧博旗舰RDS1电池数字界面转盘+旗舰RDB1电池解码器(三)。...
  11. web 前端面试题50道
  12. [设计模式] 调停者模式(Mediator Pattern)
  13. 前端表格里的数据不换行
  14. 如何让360浏览器打开网页默认为“极速模式”
  15. torchtext.vocab
  16. 零碎知识点之二:循环平稳信号
  17. 初始3D打印机(Hori 3D Z600)
  18. 打破行业困境,大麦如何引领NB-IoT技术的创新应用
  19. 补天SRC漏洞挖掘(一):主域名爬取
  20. LDA模型应用、问题、评估

热门文章

  1. C++基础-字符串的排序与查找案例(查找姓名位置)
  2. yy黑盒测试岗一面面经--这杯水好凉
  3. 让子弹飞飞飞 | 几维安全和子弹短信伴飞
  4. 干货 | 提升演讲能力的7个小技巧
  5. Module not found: Error: Can‘t resolve
  6. 单页面的网站怎么做呢?seo不做竞价,只要权重
  7. networkx绘制网络图的知识点
  8. 秋招手撕代码:verilog实现常规8-3编码器和优先级8-3编码器
  9. SCI 投稿全过程信件模板
  10. 【Python】sklearn 中的 make_blobs() 函数详解