找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3166|回复: 1
打印 上一主题 下一主题
收起左侧

51单片机+BH1750FVI制作的智能楼道灯光系统源程序

[复制链接]
跳转到指定楼层
楼主
51单片机制作的智能楼道灯光系统
本系统采用51单片机为主要控制器,通过BH1750FVI传感器采集光照强度、HC-SR501监控用户行为,通过一些外围电路以及接口具设计具有以下功能的走廊智能控制系统:
1、人来灯亮,人走灯灭;
2、能根据环境光照强度来调节灯照亮度;
3、节约设计成本,减少能源消耗。
整个系统设计可以分为三个大的模块:光照度采集,人体活动轨迹采集,系统控制与逻辑处理。


        BH1750FVI是一款数字型光强度传感器集成芯片,内部由光敏二极管、运算放大器、ADC采集和晶振等组成,光敏二极管通过光生伏特效应将光照强度转换成电信号,通过运算放大电路放大后,由ADC采集电压,然后通过逻辑电路转换成16位二进制数字信号存储。BH1750FVI支持IIC协议,单片机通过IIC通讯可以选择BH1750FVI的工作模式以及读取16位的光照度数据。

HC-SR501是基于红外技术的自动化控制模块,采用LHI788探头,灵敏度高,可靠性强,低电压工作模式。探测范围内检测到人体活动输出高电平,人体离开之后延迟一段时间之后输出低电平,使用简单。

制作出来的实物图如下:


单片机源程序如下:
  1. #include  <REG51.H>       
  2. #include  <math.h>    //Keil library  
  3. #include  <stdio.h>   //Keil library       
  4. #include  <INTRINS.H>
  5. #define   uchar unsigned char
  6. #define   uint unsigned int       
  7. #define          SlaveAddress   0x46         //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
  8. //-----------------------------------                                                                //ALT  ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
  9. sbit          SCL=P1^4;      //IIC时钟引脚定义
  10. sbit            SDA=P1^3;      //IIC数据引脚定义                              
  11. typedef   unsigned char BYTE;
  12. typedef   unsigned short WORD;
  13. BYTE    BUF[8];                         //接收数据缓存区             
  14. uchar   ge,shi,bai,qian,wan;            //显示变量
  15. int     dis_data;                       //变量
  16. //-----------------------------------

  17. //-----------------------------------
  18. void delay_nms(unsigned int k);
  19. void Init_BH1750(void);
  20. void  Single_Write_BH1750(uchar REG_Address);               //单个写入数据
  21. uchar Single_Read_BH1750(uchar REG_Address);                //单个读取内部寄存器数据
  22. void  Multiple_Read_BH1750();                               //连续的读取内部寄存器数据
  23. void Delay5us();
  24. void Delay5ms();
  25. void BH1750_Start();                    //起始信号
  26. void BH1750_Stop();                     //停止信号
  27. void BH1750_SendACK(bit ack);           //应答ACK
  28. bit  BH1750_RecvACK();                  //读ack
  29. void BH1750_SendByte(BYTE dat);         //IIC单个字节写
  30. BYTE BH1750_RecvByte();                 //IIC单个字节读
  31. //-----------------------------------
  32. //*****************************************************//
  33. /*红外探测器检测到有人就开灯,灯的亮度根据光照强度探****/
  34. /*测器反馈回来的lux值来确定,灯的亮度通过PWM来控制******/
  35. //*****************************************************//
  36. uchar time,zkb;        //定时器中断次数,zkb PWM占空比,高电平时间
  37. sbit PWM=P1^0;         //灯光控制引脚
  38. sbit SR501_IO=P1^1; //红外探测器反馈引脚


  39. //毫秒延时**************************
  40. void delay_nms(unsigned int k)       
  41. {                                               
  42.         unsigned int i,j;                               
  43.         for(i=0;i<k;i++)
  44.         {                       
  45.         for(j=0;j<121;j++)                       
  46.         {;}}                                               
  47. }

  48. /**************************************
  49. 延时5微秒
  50. 不同的工作环境,需要调整此函数,注意时钟过快时需要修改
  51. 当改用1T的MCU时,请调整此延时函数
  52. **************************************/
  53. void Delay5us()
  54. {
  55.     _nop_();_nop_();_nop_();_nop_();
  56.     _nop_();_nop_();_nop_();_nop_();
  57.         _nop_();_nop_();_nop_();_nop_();
  58.         _nop_();_nop_();_nop_();_nop_();
  59. }

  60. /**************************************
  61. 延时5毫秒
  62. 不同的工作环境,需要调整此函数
  63. 当改用1T的MCU时,请调整此延时函数
  64. **************************************/
  65. void Delay5ms()
  66. {
  67.     WORD n = 560;

  68.     while (n--);
  69. }

  70. /**************************************
  71. 起始信号
  72. **************************************/
  73. void BH1750_Start()
  74. {
  75.     SDA = 1;                    //拉高数据线
  76.     SCL = 1;                    //拉高时钟线
  77.     Delay5us();                 //延时
  78.     SDA = 0;                    //产生下降沿
  79.     Delay5us();                 //延时
  80.     SCL = 0;                    //拉低时钟线
  81. }

  82. /**************************************
  83. 停止信号
  84. **************************************/
  85. void BH1750_Stop()
  86. {
  87.     SDA = 0;                    //拉低数据线
  88.     SCL = 1;                    //拉高时钟线
  89.     Delay5us();                 //延时
  90.     SDA = 1;                    //产生上升沿
  91.     Delay5us();                 //延时
  92. }

  93. /**************************************
  94. 发送应答信号
  95. 入口参数:ack (0:ACK 1:NAK)
  96. **************************************/
  97. void BH1750_SendACK(bit ack)
  98. {
  99.     SDA = ack;                  //写应答信号
  100.     SCL = 1;                    //拉高时钟线
  101.     Delay5us();                 //延时
  102.     SCL = 0;                    //拉低时钟线
  103.     Delay5us();                 //延时
  104. }

  105. /**************************************
  106. 接收应答信号
  107. **************************************/
  108. bit BH1750_RecvACK()
  109. {
  110.     SCL = 1;                    //拉高时钟线
  111.     Delay5us();                 //延时
  112.     CY = SDA;                   //读应答信号
  113.     SCL = 0;                    //拉低时钟线
  114.     Delay5us();                 //延时

  115.     return CY;
  116. }

  117. /**************************************
  118. 向IIC总线发送一个字节数据
  119. **************************************/
  120. void BH1750_SendByte(BYTE dat)
  121. {
  122.     BYTE i;

  123.     for (i=0; i<8; i++)         //8位计数器
  124.     {
  125.         dat <<= 1;              //移出数据的最高位
  126.         SDA = CY;               //送数据口
  127.         SCL = 1;                //拉高时钟线
  128.         Delay5us();             //延时
  129.         SCL = 0;                //拉低时钟线
  130.         Delay5us();             //延时
  131.     }
  132.     BH1750_RecvACK();
  133. }

  134. /**************************************
  135. 从IIC总线接收一个字节数据
  136. **************************************/
  137. BYTE BH1750_RecvByte()
  138. {
  139.     BYTE i;
  140.     BYTE dat = 0;

  141.     SDA = 1;                    //使能内部上拉,准备读取数据,
  142.     for (i=0; i<8; i++)         //8位计数器
  143.     {
  144.         dat <<= 1;
  145.         SCL = 1;                //拉高时钟线
  146.         Delay5us();             //延时
  147.         dat |= SDA;             //读数据               
  148.         SCL = 0;                //拉低时钟线
  149.         Delay5us();             //延时
  150.     }
  151.     return dat;
  152. }

  153. //*********************************

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


  162. //*********************************************************
  163. //
  164. //连续读出BH1750内部数据
  165. //
  166. //*********************************************************
  167. void Multiple_read_BH1750(void)
  168. {   uchar i;       
  169.     BH1750_Start();                          //起始信号
  170.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
  171.        
  172.          for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF
  173.     {
  174.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  175.         if (i == 3)
  176.         {

  177.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
  178.         }
  179.         else
  180.         {               
  181.           BH1750_SendACK(0);                //回应ACK
  182.        }
  183.    }

  184.     BH1750_Stop();                          //停止信号
  185.     Delay5ms();
  186. }


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

  191. }
  192. //*********************************************************
  193. //主程序********
  194. //*********************************************************
  195. void main()
  196. {  
  197.            float temp;
  198.            delay_nms(100);            //延时100ms       
  199.            Init_BH1750();       //初始化BH1750
  200.         TMOD=0x01;//定时器0工作方式1         
  201.         TH0=(65536-100)/256;//(65536-1000)/256; 定时器赋初始值
  202.         TL0=(65536-100)%256;//(65536-1000)%256;
  203.         EA=1;//开总中断         
  204.         ET0=1;//开定时器0

  205.           while(1)              
  206.           {
  207.             Single_Write_BH1750(0x01);   //
  208.             Single_Write_BH1750(0x10);   //
  209.             delay_nms(180);              //延时180ms
  210.             Multiple_Read_BH1750();      //连续读出数据,存储在BUF中
  211.             dis_data=BUF[0];
  212.             dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据   
  213.             temp=(float)dis_data/1.2;   
  214.                
  215.                 if(SR501_IO==1){                         //感应到人员活动,开启定时器输出PWM控制波
  216.                           TR0=1;//启动定时器0
  217.                 }else{
  218.                         TR0=0;//启动定时器0                //没有人员活动,关闭PWM输出
  219.                         PWM=0;
  220.                 }               

  221.                 if(temp>100)                                 //光照强度大于100lux,关闭灯光
  222.                         zkb=0;
  223. else zkb=100-(int)temp;        //光照强度小于100lux,输出不同的光照亮度补充照明
  224. ……………………

  225. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

以上代码51hei提供下载:
deng.zip (2.44 KB, 下载次数: 44)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1099682 发表于 2023-11-26 08:42 来自手机 | 只看该作者
有仿真图没有呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表