Proyecto 51 MCU (12): diseño de lámpara de escritorio inteligente basado en 51 MCU

   Las funciones de este diseño son las siguientes:

        En primer lugar, se utiliza el chip PCF8591 para realizar la conversión AD DA. AD recopila información del fotorresistor. Cuanto más fuerte es la intensidad de la luz, menor es el voltaje y menor es el valor recopilado por AD. Al mismo tiempo, la cantidad digital recopilada por AD se utiliza como cantidad de entrada para la salida DA. El terminal de salida analógica está conectado con un LED para indicar el tamaño de la cantidad analógica de salida. Cuanto mayor sea la cantidad analógica de salida, más brillante será CONDUJO. Entonces, el proceso de trabajo de esta parte es el siguiente: cuando la intensidad de la luz es demasiado débil, el valor de la salida AD es mayor, luego el valor de la salida DA es mayor y el LED es más brillante. Se realiza atenuación automática.
        Además, el sistema también cuenta con un módulo de alcance ultrasónico. Si se detecta que el cuerpo humano está muy cerca de la lámpara de escritorio, significa que la postura de aprendizaje del niño es incorrecta y puede dañar fácilmente los ojos. En este momento, suena un timbre. Sonará una alarma para indicarle al niño que ajuste su postura sentada. Cuando la postura sentada se ajusta correctamente, el timbre ya no sonará.
        Además, el sistema calcula cuánto tiempo lleva funcionando el sistema en tiempo real. Cuando el tiempo supere 1 hora, sonará un timbre para recordarle al niño que descanse adecuadamente.
         Toda la información de iluminación, distancia y tiempo de aprendizaje se imprimen a través del puerto serie y se pueden ver con el asistente de depuración del puerto serie.
         ¡Este diseño se implementa utilizando la placa de desarrollo Puzhong 51!       (El código y el proyecto se encuentran al final del artículo)

        La imagen real después de la implementación es la siguiente:

        

La información solicitada por el asistente del puerto serie es la siguiente:

Proceso de implementación:

PCF8591 es un circuito integrado multifuncional de convertidor analógico a digital (ADC) y convertidor de digital a analógico (DAC) de uso común. Dispone de 4 canales de entrada analógica de un solo extremo y un canal de salida analógico de un solo extremo, capaces de convertir señales analógicas en señales digitales y viceversa.

PCF8591 se usa ampliamente en diversos equipos electrónicos, incluida la interfaz de sensores, la adquisición de datos, la medición y control de voltaje y otros campos. Opera en un amplio rango de voltaje, presenta bajo consumo de energía y alta precisión, y puede satisfacer las necesidades de muchas aplicaciones.

El PCF8591 se comunica a través del bus I2C y se puede programar para controlar y leer datos. Utilizando bibliotecas de software y lenguajes de programación adecuados, puede interactuar e integrar fácilmente el PCF8591 en sus proyectos.

En resumen, PCF8591 es un circuito integrado convertidor analógico a digital de uso común que es adecuado para muchos escenarios de aplicación y tiene las características de alta precisión y bajo consumo de energía.

El proceso de uso de PCF8591 se puede dividir en los siguientes pasos:

1. Conecte el hardware: conecte el PCF8591 al microcontrolador u otro dispositivo de control principal. Por lo general, utilizando una conexión de bus I2C, conecte el pin SDA de PCF8591 al pin SDA del dispositivo de control principal, el pin SCL al pin SCL del dispositivo de control principal y el pin de tierra y el pin de alimentación al mismo tiempo.

2. Configuración de inicialización: inicialice PCF8591 en el programa. Por lo general, esto implica seleccionar el modo de entrada (de un solo extremo o diferencial) y configurar parámetros como la ganancia y el voltaje de referencia para los canales de entrada analógica. Las configuraciones específicas dependen de las necesidades de su aplicación.

3. Leer entrada analógica: utilice el comando o función correspondiente para leer los datos del canal de entrada analógica desde PCF8591. Dependiendo de la configuración del PCF8591, puede optar por leer datos de un solo canal o leer datos de varios canales simultáneamente. Los datos leídos son el valor digital de la señal analógica convertida por ADC.

4. Controle la salida analógica: si es necesario, puede utilizar la función de conversión de digital a analógico del PCF8591 para convertir señales digitales en salida de señal analógica. Al escribir el valor apropiado, se puede controlar el valor de voltaje del canal de salida analógica.

5. Procesar datos: procese y analice adecuadamente los datos leídos desde PCF8591 de acuerdo con los requisitos de su aplicación. Por ejemplo, puede realizar conversiones de unidades, filtrado de datos, calibración y más para obtener los resultados que necesita.

Cabe señalar que el proceso de uso específico puede variar según las diferentes plataformas de desarrollo, lenguajes de programación o bibliotecas de software. Por lo tanto, se recomienda consultar la documentación relevante y el código de muestra de PCF8591 para comprender cómo utilizar PCF8591 correctamente en su entorno específico.

Módulo ultrasónico:

HC-SR04 es un módulo ultrasónico de uso común que se utiliza para medir distancias. Contiene un transmisor ultrasónico y un receptor ultrasónico, que pueden calcular la distancia transmitiendo señales ultrasónicas y recibiendo sus ecos.

El proceso de uso de HC-SR04 es el siguiente:

1. Conecte el hardware: conecte el módulo HC-SR04 a su controlador (como Arduino). El módulo HC-SR04 suele tener 4 pines, incluidos pines de alimentación (VCC y GND), pines de disparo (Trig) y pines de recepción (Echo). Conecte el pin VCC al suministro de 5 V, el pin GND a tierra, el pin Trig al pin de salida digital de su controlador y el pin Echo al pin de entrada digital de su controlador.

2. Envíe una señal ultrasónica: establezca el pin Trig en un nivel alto (generalmente 10 microsegundos) y luego regréselo al nivel bajo. Esto activará el módulo HC-SR04 para enviar un pulso corto de señal ultrasónica.

3. Recibir eco ultrasónico: El módulo HC-SR04 recibirá automáticamente el eco de la señal ultrasónica y lo convertirá en una señal de nivel en el pin Echo. Puede determinar el tiempo de viaje de la señal ultrasónica leyendo el nivel en el pin Echo.

4. Calcule la distancia: midiendo la diferencia de tiempo (generalmente en microsegundos) entre la transmisión y la recepción de la señal ultrasónica, se puede calcular la distancia. La fórmula es la siguiente: distancia = (diferencia de tiempo * velocidad del sonido) / 2, donde la velocidad del sonido suele ser de 340 metros/segundo.

Cabe señalar que el uso del módulo HC-SR04 puede verse afectado por algunos factores, como ruido, cambios en la velocidad de propagación ultrasónica, etc. Al programar, también debe seleccionar códigos y funciones de biblioteca apropiados para activar y leer operaciones según el controlador y la plataforma de desarrollo específicos.

En resumen, el módulo HC-SR04 se puede utilizar para calcular distancias enviando señales ultrasónicas y midiendo el tiempo de sus ecos. Esto se utiliza en muchos proyectos para aplicaciones como evitación de obstáculos, medición de distancias, etc.

Método de conexión entre módulo y microcontrolador:

/*

Método de cableado:
Disparo ultrasónico-->P2.4 Echo--->P2.3
PCF8591 SCL-->P2.0 SDA-->P2.1
Nota: VCC y GND de todos los módulos deben estar conectados

*/
 

El código de función principal es el siguiente:

#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;							 //中断溢出标志
  	
}

Los archivos del proyecto son los siguientes:

Recursos de lámpara de escritorio inteligente basados ​​​​en la biblioteca CSDN de 51 microcontroladores icono-default.png?t=N7T8https://download.csdn.net/download/guangali/88354310?spm=1001.2014.3001.5501

Supongo que te gusta

Origin blog.csdn.net/guangali/article/details/133072420
Recomendado
Clasificación