51单片机项目(12)——基于51单片机的智能台灯设计

news2024/11/23 10:36:06

   本次设计的功能如下:

        首先使用PCF8591芯片,实现了AD  DA转换,AD采集的是光敏电阻的信息,光照强度越强,电压越小,AD采集到的数值越小。同时将AD采集的数字量作为DA输出时的输入量,模拟输出端接了一个LED,用以指示输出模拟量的大小,输出模拟量越大,LED就越亮。所以这一部分的工作过程如下:当光照强度太弱时,AD输出的值就越大,那么DA输出的值就越大,LED就越亮。实现了自动调光。
        另外,系统还有超声波测距模块,如果检测到人体距离台灯很近,说明此时孩子的学习姿势不正确,容易损害眼睛,那么此时蜂鸣器报警,用以提示孩子调整坐姿。当坐姿调整正确后,蜂鸣器边不再报警。
        此外,系统还在实时计算系统所工作的时长。当时长超过1小时,就会蜂鸣器报警,用以提示孩子应该做适当的休息。
         所有光照信息、距离信息、学习时间信息都通过串口打印出来,可用串口调试助手查看!
         本次设计,使用普中51开发板实现!        (代码及工程放在文章后面)

        实现后的实物图如下:

        

串口助手提示的信息如下:

实现过程:

PCF8591是一款常用的多功能模拟数字转换器(ADC)和数字模拟转换器(DAC)集成电路。它具有4个单端模拟输入通道和一个单端模拟输出通道,能够将模拟信号转换为数字信号,并反之亦然。

PCF8591广泛应用于各种电子设备中,包括传感器接口、数据采集、电压测量和控制等领域。它的工作电压范围广泛,具有低功耗和高精度的特点,能够满足许多应用的需求。

PCF8591通过I2C总线进行通信,可以通过编程来控制和读取数据。使用适当的软件库和编程语言,您可以轻松地与PCF8591进行交互并集成到您的项目中。

总之,PCF8591是一款常用的模拟数字转换器集成电路,适用于许多应用场景,具有高精度和低功耗的特点。

使用PCF8591的过程可以分为以下几个步骤:

1. 连接硬件:将PCF8591与单片机或其他主控设备进行连接。通常使用I2C总线连接,将PCF8591的SDA引脚连接到主控设备的SDA引脚,SCL引脚连接到主控设备的SCL引脚,同时接地引脚和电源引脚。

2. 初始化设置:在程序中对PCF8591进行初始化设置。这通常包括选择输入模式(单端或差分模式)、设置模拟输入通道的增益和参考电压等参数。具体的设置取决于您的应用需求。

3. 读取模拟输入:使用相应的命令或函数从PCF8591读取模拟输入通道的数据。根据PCF8591的配置,您可以选择读取单个通道的数据或同时读取多个通道的数据。读取的数据是模拟信号经过ADC转换后的数字值。

4. 控制模拟输出:如果需要,您可以使用PCF8591的数字模拟转换功能,将数字信号转换为模拟信号输出。通过写入适当的数值,可以控制模拟输出通道的电压值。

5. 处理数据:根据您的应用需求,对从PCF8591读取的数据进行适当的处理和解析。例如,可以进行单位转换、数据滤波、校准等操作,以获得您所需的结果。

需要注意的是,具体的使用过程可能因不同的开发平台、编程语言或软件库而有所差异。因此,建议参考PCF8591的相关文档和示例代码,以了解如何在您的特定环境中正确使用PCF8591。

超声波模块:

HC-SR04是一种常用的超声波模块,用于测量距离。它包含一个超声波发射器和一个超声波接收器,可以通过发射超声波信号并接收其回波来计算距离。

使用HC-SR04的过程如下:

1. 连接硬件:将HC-SR04模块与您的控制器(如Arduino)进行连接。HC-SR04模块通常具有4个引脚,包括电源引脚(VCC和GND)、触发引脚(Trig)和接收引脚(Echo)。将VCC引脚连接到5V电源,GND引脚连接到地,Trig引脚连接到您控制器上的数字输出引脚,Echo引脚连接到您控制器上的数字输入引脚。

2. 发送超声波信号:将Trig引脚设置为高电平(通常是10微秒),然后将其恢复为低电平。这将触发HC-SR04模块发送一个短时脉冲的超声波信号。

3. 接收超声波回波:HC-SR04模块会自动接收超声波信号的回波,并将其转换为Echo引脚上的电平信号。您可以通过读取Echo引脚上的电平,来确定超声波信号的传播时间。

4. 计算距离:通过测量超声波信号从发射到接收的时间差(通常以微秒为单位),可以计算出距离。公式如下:距离 = (时间差 * 声速)/ 2,其中声速通常为340米/秒。

需要注意的是,HC-SR04模块的使用可能会受到一些因素的影响,例如噪声、超声波传播速度的变化等。在编程时,您还需要根据具体的控制器和开发平台,选择适当的代码和库函数来进行触发和读取操作。

综上所述,使用HC-SR04模块可以通过发送超声波信号,并测量其回波的时间来计算距离。这在许多项目中用于避障、测量距离等应用。

模块与单片机连接方式:

/*

接线方式:
超声波 Trig-->P2.4  Echo--->P2.3
PCF8591   SCL-->P2.0  SDA-->P2.1
注明:所有模块的VCC  和  GND都需要连接

*/
 

主函数代码如下:

#include "reg52.h"
#include "LCD1602.h"
#include "delay.h"
#include <string.h>
#include <stdio.h>
#include <I2C.H>
#include "usart.h"
#include <intrins.h>

/*

接线方式:
超声波 Trig-->P2.4  Echo--->P2.3
PCF8591   SCL-->P2.0  SDA-->P2.1
注明:所有模块的VCC  和  GND都需要连接

*/

#define  PCF8591 0x90    //PCF8591 地址

int light=0;   //定义光照强度
int t=0;

sbit beep=P2^5;
sbit RX=P2^3;
sbit TX=P2^4;     //超声波模块端口定义
bit      flag =0;

char i=0;
char inf[]="light:000  distance:0000  t:000\r\n";

unsigned int  time=0;
unsigned long S=0;
unsigned int  distance=0;
unsigned int  timer=0;


//蜂鸣器报警的函数
void beep_my()
{
  int i=1000;
   while(i)
   {
     beep=~beep;
      i--;
      delay(100);
   }
}

 void  StartModule() 		         //启动模块
 {
	  TX=0;			                     //启动一次模块
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  TX=1;
     _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
	  _nop_(); 
	  _nop_(); 
	  _nop_(); 
	  _nop_();
     TX=0;
 }

void Int0Init()             //定时器初始化 
{  
   TMOD|=0x01;		   //设T0为方式1,GATE=1;
	TH0=0;
	TL0=0;          	
	ET0=1;             //允许T0中断	
	EA=1;			   //开启总中断
   
}

int Conut(void)         //计算距离
{  
	 time=TH0*256+TL0;
	 TH0=0;
	 TL0=0;
	
	 S=(time*1.7)/10;     //算出来是mm
    return S;
	
}


/*******************************************************************
DAC 变换, 转化函数               
*******************************************************************/
bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
{
   Start_I2c();              //启动总线
   SendByte(sla);            //发送器件地址
   if(ack==0)return(0);
   SendByte(c);              //发送控制字节
   if(ack==0)return(0);
   SendByte(Val);            //发送DAC的数值  
   if(ack==0)return(0);
   Stop_I2c();               //结束总线
   return(1);
}

/*******************************************************************
ADC发送字节[命令]数据函数               
*******************************************************************/
bit ISendByte(unsigned char sla,unsigned char c)
{
   Start_I2c();              //启动总线
   SendByte(sla);            //发送器件地址
   if(ack==0)return(0);
   SendByte(c);              //发送数据
   if(ack==0)return(0);
   Stop_I2c();               //结束总线
   return(1);
}

/*******************************************************************
ADC读字节数据函数               
*******************************************************************/
unsigned char IRcvByte(unsigned char sla)
{  unsigned char c;

   Start_I2c();          //启动总线
   SendByte(sla+1);      //发送器件地址
   if(ack==0)return(0);
   c=RcvByte();          //读取数据0

   Ack_I2c(1);           //发送非就答位
   Stop_I2c();           //结束总线
   return(c);
}

void main(void)
{  
 
   Int0Init() ;        //定时器初始化
   UsartInit();  //串口初始化
   while(1)
   {  
     
      
      ISendByte(PCF8591,0x41);
      light=IRcvByte(PCF8591);  //ADC0 模数转换1      光敏电阻
      DACconversion(PCF8591,0x40, light); //DAC	  数模转换
     
      inf[6]=light/100+0x30;
      inf[7]=(light/10)%10+0x30;
      inf[8]=light%10+0x30;
      StartModule();
      while(!RX);		//当RX为零时等待
	   TR0=1;			    //开启计数
	   while(RX);			//当RX为1计数并等待
	   TR0=0;				//关闭计数           
      distance= Conut();			//计算
      
      inf[20]=distance/1000+0x30;
      inf[21]=(distance/100)%10+0x30;
      inf[22]=(distance/10)%10+0x30;
      inf[23]=distance%10+0x30;
      
      if(distance<100)              //超声波测距用于检测人离台灯的距离  如果低于10CM 不利于眼睛  那么蜂鸣器报警  (这里的100可以调节)
         beep_my();

      
      t++;              //这里的t计算的是学习时间    单位为分钟
      inf[28]=t/100+0x30;
      inf[29]=(t/10)%10+0x30;
      inf[30]=t%10+0x30;
    
      if(t>60)              //t>60 说明学习时间已经超过1小时  那么蜂鸣器报警  (这里的100可以调节)
         beep_my();
      
        Uart1Sends(inf);  
        delay_nms(500);        //延迟500ms
      
   }
   
}

void time0() interrupt 1		//定时器0的中断服务函数
{   
   flag=1;							 //中断溢出标志
  	
}

工程文件如下:

基于51单片机的智能台灯资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/guangali/88354310?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1024754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术对比:Flutter vs. 传统桌面应用开发框架

在移动应用开发领域&#xff0c;Flutter已经赢得了广泛的认可和采用&#xff0c;成为了跨平台移动应用开发的瑞士军刀。然而&#xff0c;Flutter的魅力并不仅限于移动平台&#xff0c;它还可以用于开发桌面应用程序&#xff0c;为开发人员提供了一种全新的选择。本文将深入探讨…

react 路由的使用

react-router-dom 专注于web网页开发 下载依赖&#xff0c;这里使用的版本是5 npm install react-router-dom5 1.路由的基本使用,点击左侧菜单进行高亮&#xff08;进行高亮要使用NavLink&#xff0c;使用了NavLink,会根据 activeClassName"active"找到active的cl…

Vue基础语法的进阶,事件处理器,自定义组件及组件通信

目录 一、事件处理器 1. 概述 2. 实例 二、语法整合 1. 作用 2. 实例 三、自定义组件 1. 概述 2. 实例 四、组件通信 ( 1 ) 讲述 ( 2 ) 父传子 ( 3 ) 子传父 学习后的收获 一、事件处理器 1. 概述 在Vue中&#xff0c;事件处理器是用来处理DOM事件的方法。它…

ubuntu20.04 安装 pyconcorde

这个包似乎对网络环境要求挺高的&#xff0c;我们直接弄个 射线A型号 的飞机 直接使用 pip install pyconcorde 安装&#xff0c;发现在使用里面的包时会报奇怪的错误&#xff0c;于是决定寻找 github 上的 pyconcorde 源码&#xff0c;看文档进行安装 github 地址&#xff1…

msvcp140.dll重新安装的解决方法是什么?(最新方法)

msvcp140.dll 是 Microsoft Visual C Redistributable 的一个动态链接库文件&#xff0c;它包含了 C 运行时库的一些函数和类&#xff0c;对于许多应用程序和游戏来说都是必需的。如果您的系统中缺失了这个文件&#xff0c;可能会导致程序无法正常运行。下面我们将分享修复 msv…

【C++笔记】C++ list类模拟实现

【C笔记】C list类模拟实现 一、初始化和各种构造1.1、准备工作1.2、各种构造和析构 二、插入和删除2.1、插入2.2、删除 三、迭代器3.1、正向迭代器3.2、反向迭代器3.3、提供迭代器位置 四、其他一些接口4.1、链表的长度和判空4.2、返回链表的头尾结点 一、初始化和各种构造 C…

面试题 17.08. 马戏团人塔

题目链接 面试题 17.08. 马戏团人塔 mid 题目描述 有个马戏团正在设计叠罗汉的表演节目&#xff0c;一个人要站在另一人的肩膀上。出于实际和美观的考虑&#xff0c;在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重&#xff0c;请编写代码计算叠罗汉最多…

Microsoft 网络监控

随着网络的发展和变得越来越复杂&#xff0c;公司比以往任何时候都更需要监控其网络基础设施&#xff0c;因为即使是轻微的系统中断也可能导致重大损失。网络监控工具提供实时数据和网络状态的图形概述。这使您能够准确地了解正在发生的事情&#xff0c;以便您知道需要更改的位…

进程间的通信方式

文章目录 1.简单介绍2.管道2.1管道的基础概念**管道读写规则**:**管道特点** 2.2匿名管道匿名管道父子进程间通信的经典案例&#xff1a; 2.3命名管道基本概念:命名管道的创建&#xff1a;命名管道的打开规则&#xff1a;匿名管道与普通管道的区别**例子&#xff1a;用命名管道…

基于SpringBoot+Vue的宠物领养饲养交流管理平台设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

HTML实现移动端布局与页面自适应

我们所说的布局方式&#xff0c;这里我们通常指的是width和height在不同页面情况下面的改变。 常见页面的布局方式有 静态布局 &#xff08;px布局&#xff0c;就是固定其高宽&#xff0c;不论页面怎样放大缩小&#xff0c;其占领的依旧是&#xff0c;使用px固定了的高宽&…

这种方法可以解决开发中的重复“造轮子”

一、前言 开发中&#xff0c;一直听到有人讨论是否需要重复造轮子&#xff0c;我觉得有能力的人&#xff0c;轮子得造。但是往往开发周期短&#xff0c;用轮子所节省的时间去更好的理解业务&#xff0c;应用到业务中&#xff0c;也能清晰发现轮子的利弊&#xff0c;一定意义上解…

PyTorch深度学习(三)【Logistic Regression、处理多维特征的输入】

Logistic Regression 这个名字叫做回归&#xff0c;做的是分类。 线性和logistic的模型&#xff1a; 使用的损失函数&#xff1a;二分类交叉熵 &#xff08;这个也叫做BCELoss&#xff09; logistic要做的事&#xff1a; 代码&#xff1a; import torch# import torch.nn.fun…

Java基于SpringBoot的校园疫情防控系统

文章目录 第一章2.主要技术第三章第四章 系统设计4.1功能结构4.2 数据库设计4.2.1 数据库E/R图4.2.2 数据库表 第五章 系统功能实现5.1系统功能模块5.2后台功能模块5.2.1管理员功能 源码咨询 第一章 springboot校园疫情防控系统演示录像2022 一个好的系统能将校园疫情防控的管理…

VB求平均值

VB求平均值 Private Function pj(x() As Integer) As SingleDim m%, n%, i%, s%m LBound(x): n UBound(x)For i m To ns s x(i)Next ipj s / (n - m 1) End Function Private Sub Command1_Click()Dim a%(1 To 10), i%, aver!For i 1 To 10a(i) Int(Rnd() * 10) 随机…

IMX6ULL移植篇-Linux内核编译

一. Linux内核 Linux 官网为 https://www.kernel.org &#xff0c;所以你想获取最新的 Linux 版本就可以在这个网站上下载。 Linux-4.x 版本 的 Linux 和 5.x 版本没有本质上的区别&#xff0c; 5.x 更多的是加入了一些新的平台、新的外设驱动而已。 NXP 会从网址 …

提升科研可复现性:和鲸聚焦 AI for Science 全生命周期管理

今年三月&#xff0c;国家科技部会同自然科学基金委正式启动“人工智能驱动的科学研究&#xff08;AI for Science&#xff09;”专项部署工作。数据驱动的科学研究长期以来面临诸多困境&#xff0c;针对传统科研工作流中过度依赖人类专家经验与体力的局限性&#xff0c;AI4S 旨…

优化软件系统,解决死锁问题,提升稳定性与性能 redis排队下单

项目背景&#xff1a; 随着用户数量的不断增加&#xff0c;我们的速卖通小管家软件系统面临了一个日益严重的问题&#xff1a;在从存储区提供程序的数据读取器中进行读取时&#xff0c;频繁出现错误。系统报告了一个内部异常: 异常信息如下&#xff1a; 从存储区提供程序的数…

nvme各模块间的关系总结

目录&#xff1a;driver/host/nvme/makefile # SPDX-License-Identifier: GPL-2.0 ccflags-y -I$(src)obj-$(CONFIG_NVME_CORE) nvme-core.o obj-$(CONFIG_BLK_DEV_NVME) nvme.o obj-$(CONFIG_NVME_FABRICS) nvme-fabrics.o obj-$(CONFIG_NVME_RDMA) nvme-rdma.…

02、Servlet核心技术(下)

目录 1 ServletJDBC应用&#xff08;重点&#xff09; 2 重定向和转发&#xff08;重点&#xff09; 2.1 重定向的概述 2.2 转发的概述 3 Servlet线程安全&#xff08;重点&#xff09; 4 状态管理&#xff08;重点 &#xff09; 5 Cookie技术&#xff08;重点&#xf…