目录

实验四  简易路灯智能控制器

一、项目设计

1. 了解光敏电阻电气特性。

2. 学会在面包板上搭建光敏电阻电路测量环境光强度。

3. 学会使用PCF8591数模转换模块将光敏电阻两端电压转换为数字信号。

4. 学会使用1602液晶显示器显示字符串。

5. 学会控制LED灯亮灭。

二、设计项目要求

目前大多数路灯开关均采用定时控制方法,设定统一的、固定的时间开关路灯(如:18:00开路灯,6:00关路灯),但因天气原因可能需要提前开关路灯,既能在亮度较暗时,及时开灯补充光照,也能在亮度较明亮时,提前关闭路灯,节约资源。请设计一款简易路灯智能控制器,自动采集环境光照强度,并在1602LCD上显示光强(0暗-255亮),在亮度低于指定值(100)时,自动打开路灯(用LED灯模拟),在亮度高于指定值(200)时自动关闭路灯。

1602液晶显示示例:

三、项目实现步骤

通过光敏电阻的使用来来测定外界灯光的强度,将光敏电阻测得的光强度作为判断LED灯开关的条件,根据需要设计适应的光强度条件,当测得的外界光强度满足实验要求的条件的时候,实现相应的开关灯操作。

方案实现步骤;

第一步:构思光敏电阻控制路灯的构思需要,初步设计思路;

第二步:在构思完成的前提下实现设计系统电路图,并按照需要连接各器件;

第三步:根据设计的电路编写程序来实现相应的控制功能;

第四步:将编写好的程序下载的连接灯控系统中,检验实验效果;

第五步:根据初步试验效果与实验要求作比较做出跟进一步的完善。

四、代码实现

//传感器数模转换Pcf859代码实现:#include <pcf8591.h>sbit scl=P2^0;       //I2C  时钟
sbit sda=P2^1;       //I2C  数据
bit ack;             //应答标志位/*******************************************************************起动总线函数
函数原型: void  Start_I2c();
功能:     启动I2C总线,即发送I2C起始条件.
********************************************************************/
void Start_I2c()
{sda=1;         /*发送起始条件的数据信号*/_nop_();scl=1;_nop_();        /*起始条件建立时间大于4.7us,延时*/_nop_();_nop_();_nop_();_nop_();    sda=0;         /*发送起始信号*/_nop_();        /* 起始条件锁定时间大于4μs*/_nop_();_nop_();_nop_();_nop_();       scl=0;       /*钳住I2C总线,准备发送或接收数据 */_nop_();_nop_();
}/*******************************************************************结束总线函数
函数原型: void  Stop_I2c();
功能:     结束I2C总线,即发送I2C结束条件.
********************************************************************/
void Stop_I2c()
{sda=0;      /*发送结束条件的数据信号*/_nop_();       /*发送结束条件的时钟信号*/scl=1;      /*结束条件建立时间大于4μs*/_nop_();_nop_();_nop_();_nop_();_nop_();sda=1;      /*发送I2C总线结束信号*/_nop_();_nop_();_nop_();_nop_();
}/*******************************************************************字节数据发送函数
函数原型: void  I2C_SendByte(u8 c);
功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使ack=0)     发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
********************************************************************/
void  I2C_SendByte(u8  c)
{u8  i;for(i=0;i<8;i++)  /*要传送的数据长度为8位*/{if((c<<i)&0x80)sda=1;   /*判断发送位*/else  sda=0;                _nop_();scl=1;               /*置时钟线为高,通知被控器开始接收数据位*/_nop_(); _nop_();             /*保证时钟高电平周期大于4μs*/_nop_();_nop_();_nop_();         scl=0; }_nop_();_nop_();sda=1;                /*8位发送完后释放数据线,准备接收应答位*/_nop_();_nop_();   scl=1;_nop_();_nop_();_nop_();if(sda==1)ack=0;     else ack=1;        /*判断是否接收到应答信号*/scl=0;_nop_();_nop_();
}/*******************************************************************字节数据接收函数
函数原型: u8  I2C_RcvByte();
功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机。
********************************************************************/
u8   I2C_RcvByte()
{u8  retc=0,i; sda=1;                     /*置数据线为输入方式*/for(i=0;i<8;i++){_nop_();           scl=0;                  /*置时钟线为低,准备接收数据位*/_nop_();_nop_();                 /*时钟低电平周期大于4.7μs*/_nop_();_nop_();_nop_();scl=1;                  /*置时钟线为高使数据线上数据有效*/_nop_();_nop_();retc=retc<<1;if(sda==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */_nop_();_nop_(); }scl=0;    _nop_();_nop_();return(retc);
}/********************************************************************应答子函数
函数原型:  void Ack_I2c(bit a);
功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
********************************************************************/
void Ack_I2c(bit a)
{  if(a==0)sda=0;              /*在此发出应答或非应答信号 */else sda=1;               /*0为发出应答,1为非应答信号 */_nop_();_nop_();_nop_();      scl=1;_nop_();_nop_();                    /*时钟低电平周期大于4μs*/_nop_();_nop_();_nop_();  scl=0;                     /*清时钟线,住I2C总线以便继续接收*/_nop_();_nop_();
}/************************************************************
* 函数名        : Pcf8591_DaConversion
* 函数功能      : PCF8591的输出端输出模拟量
* 输入          : addr(器件地址),channel(转换通道),value(转换的数值)
* 输出            : 无
******************* *****************************************/
bit Pcf8591_DaConversion(u8 addr,u8 channel,u8 Val)
{Start_I2c();              //启动总线I2C_SendByte(addr);            //发送器件地址if(ack==0)return(0);I2C_SendByte(0x40|channel);              //发送控制字节if(ack==0)return(0);I2C_SendByte(Val);            //发送DAC的数值  if(ack==0)return(0);Stop_I2c();               //结束总线return(1);
}/************************************************************
* 函数名        : Pcf8591_SendByte
* 函数功能      : 写入一个控制命令
* 输入          : addr(器件地址),channel(转换通道)
* 输出            : 无
************************************************************/
bit PCF8591_SendByte(u8 addr,u8 channel)
{Start_I2c();              //启动总线I2C_SendByte(addr);            //发送器件地址if(ack==0)return(0);I2C_SendByte(0x40|channel);              //发送控制字节if(ack==0)return(0);Stop_I2c();               //结束总线return(1);
}/************************************************************
* 函数名           : PCF8591_RcvByte
* 函数功能      : 读取一个转换值
* 输入          :
* 输出          : dat
************************************************************/
u8 PCF8591_RcvByte(u8 addr)
{  u8 dat;Start_I2c();          //启动总线I2C_SendByte(addr+1);      //发送器件地址if(ack==0)return(0);dat=I2C_RcvByte();          //读取数据0Ack_I2c(1);           //发送非应答信号Stop_I2c();           //结束总线return(dat);
}
1602液晶显示 代码实现:#include <1602.h>sbit LCDEN=P3^4;
sbit RS=P3^5;
//RW直接接地,只允许写不允许读
sbit BF=P0^7;//u8 DectectBusyBit(void)//状态判断函数(忙/闲?)
//{
//  bit result;
//  P0 = 0xff; //读状态前先置高电平,防止误判
//  RS = 0;
//  delay_ms(5);
//    RW = 1;
//  LCDEN = 1;
//  delay_ms(5);
//  result=BF; //若LCM忙,则反复测试,在此处原地踏步;当LCM闲时,才往下继续
//  LCDEN = 0;
//  return result;
//}//u8 RdACAdr(void)//读当前光标地址
//{
//  u8 result;
//  P0 = 0xff; //读地址前先置高电平,防止误判
//  RS = 0;
//  delay_ms(5);
//    RW = 1;
//  LCDEN = 1;
//  delay_ms(5);
//  result=P0&0x7f; //去掉最高位忙闲标记,只保留低7位地址值
//  LCDEN = 0;
//  return result;
//} void WrComLCD(u8 ComVal)//写命令函数
{
//  while(DectectBusyBit()==1);         //先检测LCM是否空闲RS = 0;delay_ms(1);
//  RW = 0;LCDEN = 1;P0 = ComVal;delay_ms(1);LCDEN = 0;
}void WrDatLCD(u8 DatVal)//写数据函数
{
//  while(DectectBusyBit()==1); RS = 1;delay_ms(1);
//  RW = 0;LCDEN = 1;P0 = DatVal;delay_ms(1);LCDEN = 0;
}void LCD1602_Init(void)//1602初始化函数
{ WrComLCD(0x38);     // 功能设定:16*2行、5*7点阵、8位数据接口WrComLCD(0x38);WrComLCD(0x38);
//多次重复设定功能指令,因为LCD启动后并不知道使用的是4位数据接口还是8位的,所以开始时总是默认为4位,这样刚开始写入功能设定指令时,低4位被忽略,为了可靠,最好多写几遍该指令 WrComLCD(0x01);    // 清屏 WrComLCD(0x06);    // 光标自增、屏幕不动  delay_ms(1);         // 延时,等待上面的指令生效,下面再显示,防止出现乱码WrComLCD(0x0C);    // 开显示、关光标delay_ms(5);
}void LCD1602pos(u8 x,u8 y)//1602显示坐标定位函数:x为行标,0:第一行,1:第二行;y为列标,0-15
{u8 t;t=x?0x40:0x00;WrComLCD(0x80+t+y);
}void LCD1602_disstr(u8 *p,u8 x,u8 y)//从指定坐标开始显示英文字符串(长度不超过32)
{   u8 i=0,t;LCD1602pos(x,y);while(p[i]!='\0'){  WrDatLCD(p[i]);i++;delay_ms(5);//    t=RdACAdr();//  if(t==0x10) LCD1602pos(1,0);//读当前坐标,如果第1行写完换行到第2行 //  if(t==0x50) LCD1602pos(0,0);//读当前坐标,如果第2行写完换行到第1行if(y+i==16) {x=x^0x01;LCD1602pos(x,0);}//x=x^0x01;//如果第1行写完换行到第2行,如果第2行写完换行到第1行  }
}
void LCD1602_disch(u8 ch,u8 x,u8 y)//显示一个英文字符
{   LCD1602pos(x,y);WrDatLCD(ch);delay_ms(5);
}void LCD1602_clear(void)//1602清屏函数
{WrComLCD(0x01);    // 清屏
} void LCD1602_backspace(void)//向左删除一个字符
{WrComLCD(0x10);//光标左移WrDatLCD(' ');//输出空格WrComLCD(0x10);//光标左移
}
//其中涉及到传感器采集数据显示到串口代码部分没写出来有需要的请联系我呀
Main函数代码实现:#include<config.h>
//#include<uart.h>
#include <pcf8591.h>
#include <1602.h>sbit beep=P2^3; //蜂鸣器引脚
u8 print[20];
u8 *l={"light:"};
u8 *on={"switch on:"};
u8 *off={"switch off:"};
u8 m[]={'0','1','2','3','4','5','6','7','8','9'};
void delay_ms(u16 x)//毫秒延时函数
{u16 i;u8 j;for(i=0;i<x;i++)for(j=0;j<115;j++);
}void delay_us(u8 t) //10倍微秒延时函数,延时10*t微秒
{u8 i;for(i=0;i<=t;i++);
}void Alarm(u8 t) //蜂鸣器报警,持续t秒
{u8 i,j,k;  for(j=0;j<t;j++){ for(i=0;i<200;i++){beep=0;delay_us(50);beep=1;delay_us(50);}for(k=0;k<100;k++){beep=0;delay_us(110);beep=1;delay_us(110);}}
}void main()
{u8 vibrate;u8 i;int temp1,temp2,temp3;//  Init_COM();   //初始化LCD1602_Init();//1602初始化函数while(1){PCF8591_SendByte(AddWr,0);//启动AIN0通道模数转换vibrate=255-PCF8591_RcvByte(AddWr);//读出转换数字值/光照越暗vibrate越小,当vibrate<100时灯亮temp1= vibrate/100;temp2= (vibrate%100)/10;temp3= vibrate%10;delay_ms(500);//  delay_ms(500);if(vibrate>200)//光照>200,1602第一行显示switch off{LCD1602_disstr(l,0,0);//从指定坐标开始显示英文lightLCD1602_disch(m[temp1],0,10);//在指定坐标出显示光照值第一位LCD1602_disch(m[temp2],0,11);//在指定坐标出显示光照值第二位LCD1602_disch(m[temp3],0,12);//在指定坐标出显示光照值第三位LCD1602_disstr(off,1,0);P1=0Xff;//灯灭}if(vibrate<100)      //震动传感器输出电压高于1v时报警{LCD1602_disstr(l,0,0);//从指定坐标开始显示英文light LCD1602_disch(m[temp1],0,10);//在指定坐标出显示光照值第一位LCD1602_disch(m[temp2],0,11);//在指定坐标出显示光照值第二位LCD1602_disch(m[temp3],0,12);//在指定坐标出显示光照值第三位LCD1602_disstr(on,1,0);//光照<100,1602第一行显示switch onP1=0x00;//灯亮// Alarm(5);//启动报警响5秒                                     }                 }
}

、效果实现及总结

实验现象:完成实验的前期工作,下载程序到已经连接好的电路板后,进行实验现象观察,在光敏电阻正常工作的光照强度范围内,根据外界光强度的改变基本实现了智能灯控系统的要求:

通过控制光敏电阻周围的光照强度来观察1602显示屏上的光照对应值,在不满足条件的光照情况下不会点亮LED灯,当光照强度满足对应的光照条件的时候后自动打开LED路灯。本文章在于与广大码友交流学习,还请大家多多关注,日后多多交流,公共走向程序员的顶峰。

附上本人在大学学习期间所有学习实现的demo,这些项目的实现都通过本人亲自测试运行,也是自己学习中知识的一点一点积累,整理不易,希望能帮到大家,不足之处大家多多交流。

世界不同角落共同努力,变成更优秀的我们。

1.51单片机学习整理

基于51单片机的智能光控路灯 :https://download.csdn.net/download/qq_37037348/11071869

基于51单片机超声波测距(内含源程序,原理图及PCB源文件):https://download.csdn.net/download/qq_37037348/11071866

基于51单片机的智能安防报警系统:https://download.csdn.net/download/qq_37037348/11071865

基于51单片机模块化编程模块 (红外、液晶显示屏、温湿度等传感器模块化)

:https://download.csdn.net/download/qq_37037348/11053222

基于51单片机pwm控制的呼吸灯程序

https://download.csdn.net/download/qq_37037348/11053195

51单片机与上位机串口通信实例包含详细讲解的完整代码

https://download.csdn.net/download/qq_37037348/11053164

基于51单片机的直交流电压表仿真 (详细代码实现,设计讲解)

https://download.csdn.net/download/qq_37037348/11053145

基于51单片机胸牌 详细代码实现,设计讲解)

https://download.csdn.net/download/qq_37037348/11053125

基于51单片机3x4按键拨号 (详细代码实现,设计讲解)

https://download.csdn.net/download/qq_37037348/11053093

基于51单片机拨号 (详细代码实现,设计讲解)

https://download.csdn.net/download/qq_37037348/11053090

基于51单片机警灯系统设计(详细代码实现,设计讲解)

https://download.csdn.net/download/qq_37037348/11053086

基于51单片机点亮一个小灯(详细代码实现,设计讲解,学习51基础实验)

https://download.csdn.net/download/qq_37037348/11053084

基于51单片机开发的排球计时器,附有详细注释讲解,为大家提供最真心的帮助

https://download.csdn.net/download/qq_37037348/11053024

基于51单片机的音乐播放器,源码详细注释

https://download.csdn.net/download/qq_37037348/11053022

2.Android 开发学习整理:

Android-serialport 手机App串口通信代码实现:

https://download.csdn.net/download/qq_37037348/11050521

Android-serialport 手机App网络通信实例代码实现:

https://download.csdn.net/download/qq_37037348/11050516

Android 第一个App详细教程、基础实验 :

https://download.csdn.net/download/qq_37037348/11050515

3.计算机视觉(深度学习、神经网络的学习)

feature extraction(深度学习,特征提取,神经网络:https://download.csdn.net/download/qq_37037348/11065968

feature extraction(深度学习,特征提取,神经网络多种训练模型详细实现):

https://download.csdn.net/download/qq_37037348/11065974

欢迎大家加入学习项目交流,为大家分享各类个人学习项目及学习资料,互相交流互相学习。

基于单片机的智能灯控系统相关推荐

  1. 【毕业设计】基于ZigBee的智能灯控系统 -物联网 单片机 stm32

    文章目录 1 简介 2 系统结构 系统功能 相关器件 Zigbee芯片 CC2530 LED发光二极管 人体红外感应模块 光敏电阻传感器 3 实现效果 5 相关部分代码 6 最后 1 简介 Hi,大家 ...

  2. 基于单片机自动智能浇花系统电路设计(毕业设计资料)

    摘要: 1.基于51单片机自动智能浇花系统设计 本设计由STC89C52单片机电路+4位共阳数码管显示电路+ADC0832采样电路+水泵控制电路+土壤湿度传感器电路+按键电路+电源电路组成. 1.数码 ...

  3. (毕业设计资料)基于单片机的自动变速箱电控系统

    基于单片机的自动变速箱电控系统,实现的功能是四个模拟量,通过四个模拟量的大小来控制几档,档位由继电器+led作为显示. [资源下载]下载地址如下: https://docs.qq.com/doc/DT ...

  4. 基于单片机的智能安防系统

    设计简介: 本设计是基于单片机的智能安防系统,主要实现以下功能: 可通过LCD1602安防状态和是否有人: 可通过按键控制安防状态: 通过人体红外监测是否有人: 通过GSM模块实现发送短信. 标签:5 ...

  5. 【毕业设计】基于单片机的智能饮水机系统 - stm32 物联网 嵌入式

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 系统设计 3.1 智能饮水机功能设计 3.1.1 智能饮水机的按键功能: 3.1.2 智能饮水机的显示功能: 3.2 系统架构 3.3 软件部 ...

  6. 智能灯控系统的介绍,它有什么优势

    随着智能家居行业的发展和产品的扩散,相信很多长期关注智能产业,在互联网环境下的积极消费者来说,一定都考虑过如何在现代家居中获得"解放感".而智能照明具有方便.美观.安全.节能的优点 ...

  7. 计算机温度测控技术程序,基于单片机的温度测控系统

    摘要:本次设计的温度测控系统采用MCS-51系列单片机中的STC89C58作为微处理器,使用集成温度传感器AD-590采集温度信息,光电耦合双向晶闸管为驱动电路,可精确地采集环境温度信息,稳定性高,抗 ...

  8. 毕业设计 单片机stm32智能路灯智能灯控系统 - LoRa远程通信

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 4.1 Lora模块 4.2 DHT11温湿度传感器 4.3 光照传感器 5 部分核心代码 6 最后 0 前言

  9. 毕业设计 stm32智能路灯智能灯控系统 - LoRa远程通信 单片机

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 4.1 Lora模块 4.2 DHT11温湿度传感器 4.3 光照传感器 5 部分核心代码 6 最后 0 前言

最新文章

  1. SLAM综述(4)激光与视觉融合SLAM
  2. Respo 快速入门
  3. Day 6:在 Java 虚拟机上使用 Grails 进行快速 Web 开发
  4. SAP创建Web Service以及用ABAP调用
  5. eos操作系统_EOS相机统一的用户界面
  6. Python 标准库 —— urllib(下载进度)
  7. Android学习笔记--项目框架介绍
  8. mysql迁移到数据盘
  9. 天龙八部linux 换win,Linux从菜鸟到大师之天龙八部 第三部文本编辑处理.doc
  10. Linux快速入门之一(基础)
  11. 如何实现一个基于HTML5的实时视频直播
  12. 制定目标的SMART原则(思维导图)
  13. html 中的版权符号 : 圆圈C
  14. Wechaty|微信小助手(非web|机器人)
  15. 关闭Vue Eslint语法检查
  16. ijkplayer源码---音频播放
  17. adb 卸载android系统程序
  18. web前端开发笔记21~45 2022/10/27
  19. mysql基础约束详解
  20. 消息队列探秘-RabbitMQ消息队列介绍 侵立删

热门文章

  1. Airbin_0720
  2. 【赛事推荐】ICDAR2023国际学术竞赛,六大OCR未解难题等你来挑战!
  3. CO11N-完工确认的BAPI使用
  4. 《数字图像处理第二版》第一、二章部分习题
  5. 小白提问:C++ 不存在从 “std::string“ 到 “char *“ 的适当转换函数
  6. JDO(Java Data Object )
  7. FPGA串口多字节发送、仿真
  8. 黑盒测试和白盒测试,覆盖率的测试
  9. python汇率转换_21天入门Python基础——练习1汇率转换
  10. 怎么查看显卡算力(附nvidia显卡算力表)