本次设计的功能如下:
首先使用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
#include
#include
#include "usart.h"
#include
/*
接线方式:
超声波 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文库https://download.csdn.net/download/guangali/88354310?spm=1001.2014.3001.5501