基于51单片机的智能婴儿床摇摇椅哄睡摇篮床

该文详细介绍了ADC0832(8位ADC)、L298(双全桥电机驱动器)和DHT11(温湿度传感器)的特点和功能。ADC0832提供串行输出和内部参考电压,适合作为数字转换器;L298能驱动大电流电机并具备保护功能;DHT11则提供简便的数字温湿度测量。主程序展示了如何与1602液晶显示器、按键和其它硬件交互,用于环境监控和控制应用。
摘要由CSDN通过智能技术生成

仿真图:

在这里插入图片描述

芯片/模块的特点:

ADC0832特点:

8位分辨率:ADC0832可以将模拟输入信号转换为8位数字输出。这意味着它可以将模拟信号划分为256个不同的离散电平,提供相对较低的分辨率。

双通道输入:ADC0832具有两个模拟输入通道,使其能够同时转换两个模拟信号。这对于需要同时测量多个信号的应用非常有用。

内部参考电压源:ADC0832提供了一个内部的参考电压源,它可以用作模拟输入信号的参考电压。这样可以简化外部电路设计,并提供更稳定和准确的参考电压。

串行输出:ADC0832通过串行接口(SPI或I2C)输出转换结果。这种串行输出形式使其与微控制器或其他数字设备的通信变得更加简单和方便。

低功耗:ADC0832具有较低的功耗特性,适合在低功耗应用中使用。

可编程时钟频率:ADC0832的转换速度可以通过控制输入时钟频率进行编程。这使得可以根据应用的需求调整转换速度,并平衡转换精度和速度。

内部自校准:ADC0832具有内部自校准电路,可以降低转换误差,并提供更准确的转换结果。

L298特点:

高驱动能力:L298具有高驱动电流能力,能够提供最高4安培的峰值输出电流。这使得它可以驱动较大功率的直流电机,适用于许多高性能应用。

双全桥结构:L298具有双全桥结构,即两个独立的H桥电路,可以分别控制两个直流电机的运行方向和速度。这种结构使得同时控制多个电机变得更加方便。

输入控制灵活:L298的输入控制接口可以使用标准的逻辑电平(TTL或CMOS)来控制电机的运行。它可以接受脉冲宽度调制(PWM)信号来实现速度控制,并且支持正向、反向和制动模式的控制。

内置保护功能:L298具有内置的过流保护和过温保护功能,可以保护芯片和外部电路免受损坏。当输出电流超过设定值或芯片温度过高时,保护功能会自动触发。

低功耗待机模式:L298具有低功耗待机模式,可以通过控制输入信号将芯片置于低功耗状态。这有助于节省电能和延长电池寿命。

多种封装形式:L298可提供不同的封装形式,如多引脚直插式封装(DIP)和表面贴装技术(SMT)封装。这使得L298适应不同应用的安装需求。

DHT11特点:

温湿度测量功能:DHT11能够实时测量环境中的温度和湿度,并提供数字输出。它可以给出相对湿度(20-90% RH)和温度(0-50摄氏度)的测量结果。

数字输出信号:DHT11通过单线数字信号输出温度和湿度数据。这使得读取和解析数据变得简单方便,适用于各种微控制器和单片机系统。

低成本:DHT11是一种经济实惠的温湿度传感器,适用于低成本应用。

简单的接口和使用:DHT11只需要连接一个数据线和供电线,使用起来非常简单。它采用了专用的通信协议,可以直接与各种数字系统集成。

快速响应时间:DHT11具有快速的响应时间,可以在1-2秒内测量出温度和湿度值。这使得它适用于需要快速获得环境参数的应用。

低功耗:DHT11在工作期间能够保持较低的功耗,这使得它可以在电池供电的应用中长时间工作而不消耗太多的能量。

可靠性:DHT11具有较好的可靠性和稳定性,适用于长期稳定监测环境温湿度的应用。

主程序:

#include <reg52.h>
#include <intrins.h>
#include <ADC0832.H>
#include <DHT11.H>

#define uchar unsigned char	// 以后unsigned char就可以用uchar代替
#define uint  unsigned int	// 以后unsigned int 就可以用uint 代替
unsigned char  humi_value;//湿度
unsigned char  temp_value;//温度

sbit LcdRs_P   = P2^7;		// 1602液晶的RS管脚       
sbit LcdRw_P   = P2^6;		// 1602液晶的RW管脚 
sbit LcdEn_P   = P2^5;		// 1602液晶的EN管脚

sbit KeySet_P  = P2^3;		// “设置”按键的管脚
sbit KeyDown_P = P2^4;		// “减”按键的管脚
sbit KeyUp_P   = P2^2;		// “加”按键的管脚
sbit Buzzer_P  = P2^1;		// 蜂鸣器的管脚
sbit Led_1     = P1^5;		// LED照明

sbit Motor_EN  = P1^6;		// 电机启动

uchar menu_1;           //菜单设计的变量

unsigned char Set_Value[4][2]={15,25,40,70,20,50,50,20};

/*********************************************************/
// 毫秒级的延时函数,time是要延时的毫秒数
/*********************************************************/
void DelayMs(uint time)
{
	uint i,j;
	for(i=0;i<time;i++)
		for(j=0;j<112;j++);
}


/*********************************************************/
// 延时15微秒
/*********************************************************/
void Delay15us(void)
{
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
}


/*********************************************************/
// 1602液晶写命令函数,cmd就是要写入的命令
/*********************************************************/
void LcdWriteCmd(uchar cmd)
{ 
	LcdRs_P = 0;
	LcdRw_P = 0;
	LcdEn_P = 0;
	P0=cmd;
	DelayMs(2);
	LcdEn_P = 1;    
	DelayMs(2);
	LcdEn_P = 0;	
}


/*********************************************************/
// 1602液晶写数据函数,dat就是要写入的数据
/*********************************************************/
void LcdWriteData(uchar dat)
{
	LcdRs_P = 1; 
	LcdRw_P = 0;
	LcdEn_P = 0;
	P0=dat;
	DelayMs(2);
	LcdEn_P = 1;    
	DelayMs(2);
	LcdEn_P = 0;
}


/*********************************************************/
// 1602液晶初始化函数
/*********************************************************/
void LcdInit()
{
	LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
	LcdWriteCmd(0x0C);        // 开显示,不显示光标
	LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
	LcdWriteCmd(0x01);        // 清屏
}


/*********************************************************/
// 液晶光标定位函数
/*********************************************************/
void LcdGotoXY(uchar line,uchar column)
{
	// 第一行
	if(line==0)        
		LcdWriteCmd(0x80+column); 
	// 第二行
	if(line==1)        
		LcdWriteCmd(0x80+0x40+column); 
}



/*********************************************************/
// 液晶输出字符串函数
/*********************************************************/
void LcdPrintStr(uchar *str)
{
	while(*str!='\0')
			LcdWriteData(*str++);
}


/*********************************************************/
// 液晶输出数字
/*********************************************************/
void LcdPrintNum(uint num)
{
	LcdWriteData(num/100+0x30);				// 百位
	LcdWriteData(num%100/10+0x30);		// 十位
	LcdWriteData(num%10+0x30);				// 个位
}
void LcdPrintNum_Ponit(uint num)
{
	LcdWriteData(num/100+0x30);				// 百位
	LcdWriteData(num%100/10+0x30);		// 十位
	LcdWriteData('.');
	LcdWriteData(num%10+0x30);				// 个位
}
/*********************************************************/
// 在液晶上显示阈值
/*********************************************************/
void LcdPrintTHD(unsigned char num)
{
	LcdWriteData(num/100+0x30);	// 十位
	LcdWriteData(num%100/10+0x30);		// 个位
	LcdWriteData(num%10+0x30);				// 小数后一位
}

/*********************************************************/
// 按键扫描
/*********************************************************/
void KeyScanf()
{
	if(KeySet_P==0)								// 判断是否有按键按下
	{
		DelayMs(10);								// 消除按键按下的抖动
		if(KeySet_P==0)
		{
			while(!KeySet_P);						// 等待按键释放
		  menu_1++;
			if(menu_1==7)
			  menu_1=0;
		}
	}		
		while(menu_1!=0)
		{
				if(KeySet_P==0)								// 判断是否有按键按下
				{
					DelayMs(10);								// 消除按键按下的抖动
					if(KeySet_P==0)
					{
						while(!KeySet_P);						// 等待按键释放
						menu_1++;
						if(menu_1==7)
							menu_1=0;
					}
				}			
      if(menu_1==1)	
			{
				LcdGotoXY(0,0);						// 液晶恢复测量时的内容显示
				LcdPrintStr("Temp_Min set       ");
				LcdGotoXY(1,0);									// 定位到第0行第7列
		    LcdPrintTHD(Set_Value[0][0]);		// 显示当前下限
       	LcdGotoXY(1,3);
        LcdPrintStr("C              ");				
				if(KeyDown_P==0)		// 报警值减的处理
        {
				  DelayMs(10);	    // 消除按键按下的抖动
					if(KeyDown_P==0)
					{
					  while(!KeyDown_P); // 等待按键释放
						Set_Value[0][0]--;
					}
				}	
       	if(KeyUp_P==0)		// 报警值加处理
        {
				  DelayMs(10);	// 消除按键按下的抖动
					if(KeyUp_P==0)
					{
					  while(!KeyUp_P); // 等待按键释放
						Set_Value[0][0]++;
					}
				}				
			}	
			 if(menu_1==2)	
			{	
				LcdGotoXY(0,0);						// 液晶恢复测量时的内容显示
				LcdPrintStr("Temp_MAX set       ");
				LcdGotoXY(1,0);									// 定位到第0行第7列
		    LcdPrintTHD(Set_Value[0][1]);							// 显示当前下限
				LcdGotoXY(1,3);
        LcdPrintStr("C              ");	
       	if(KeyDown_P==0)		// 报警值减的处理
        {
				  DelayMs(10);	    // 消除按键按下的抖动
					if(KeyDown_P==0)
					{
					  while(!KeyDown_P);// 等待按键释放
						Set_Value[0][1]--;
					}
				}	
       	if(KeyUp_P==0)		// 报警值加处理
        {
				  DelayMs(10);	
					if(KeyUp_P==0)
					{
					  while(!KeyUp_P);
						Set_Value[0][1]++;
					}
				}				
			}	
			 if(menu_1==3)	
			{	
				LcdGotoXY(0,0);						// 液晶恢复测量时的内容显示
				LcdPrintStr("Humi_Min set       ");
				LcdGotoXY(1,0);									// 定位到第0行第7列
		    LcdPrintTHD(Set_Value[1][0]);							// 显示当前下限
				LcdGotoXY(1,3);
        LcdPrintStr("%RH            ");	
       	if(KeyDown_P==0)		// 报警值减的处理
        {
				  DelayMs(10);	    // 消除按键按下的抖动
					if(KeyDown_P==0)
					{
					  while(!KeyDown_P);// 等待按键释放
						Set_Value[1][0]--;
					}
				}	
       	if(KeyUp_P==0)		// 报警值加处理
        {
				  DelayMs(10);	
					if(KeyUp_P==0)
					{
					  while(!KeyUp_P);
						Set_Value[1][0]++;
					}
				}				
			}	
			 if(menu_1==4)	
			{	
				LcdGotoXY(0,0);						// 液晶恢复测量时的内容显示
				LcdPrintStr("Humi_MAX set       ");
				LcdGotoXY(1,0);									// 定位到第0行第7列
		    LcdPrintTHD(Set_Value[1][1]);							// 显示当前上限
				LcdGotoXY(1,3);
        LcdPrintStr("%RH            ");
       	if(KeyDown_P==0)		// 报警值减的处理
        {
				  DelayMs(10);	    // 消除按键按下的抖动
					if(KeyDown_P==0)
					{
					  while(!KeyDown_P);// 等待按键释放
						Set_Value[1][1]--;
					}
				}	
       	if(KeyUp_P==0)		// 报警值加处理
        {
				  DelayMs(10);	
					if(KeyUp_P==0)
					{
					  while(!KeyUp_P);
						Set_Value[1][1]++;
					}
				}
			}	
				 if(menu_1==5)	
			{	
				LcdGotoXY(0,0);						// 液晶恢复测量时的内容显示
				LcdPrintStr("SY0_MAX set       ");
				LcdGotoXY(1,0);									// 定位到第0行第7列
		    LcdPrintTHD(Set_Value[3][1]);							// 显示当前上限
				LcdGotoXY(1,3);
        LcdPrintStr("dB            ");
       	if(KeyDown_P==0)		// 报警值减的处理
        {
				  DelayMs(10);	    // 消除按键按下的抖动
					if(KeyDown_P==0)
					{
					  while(!KeyDown_P);// 等待按键释放
						Set_Value[3][1]--;
					}
				}	
       	if(KeyUp_P==0)		// 报警值加处理
        {
				  DelayMs(10);	
					if(KeyUp_P==0)
					{
					  while(!KeyUp_P);
						Set_Value[3][1]++;
					}
				}
			}
			
				if(menu_1==6)	
			{	
				LcdGotoXY(0,0);						// 液晶恢复测量时的内容显示
				LcdPrintStr("GX0_Min set       ");
				LcdGotoXY(1,0);									// 定位到第0行第7列
		    LcdPrintTHD(Set_Value[3][0]);							// 显示当前上限
				LcdGotoXY(1,3);
        LcdPrintStr("%             ");
       	if(KeyDown_P==0)		// 报警值减的处理
        {
				  DelayMs(10);	    // 消除按键按下的抖动
					if(KeyDown_P==0)
					{
					  while(!KeyDown_P);// 等待按键释放
						Set_Value[3][0]--;
					}
				}	
       	if(KeyUp_P==0)		// 报警值加处理
        {
				  DelayMs(10);	
					if(KeyUp_P==0)
					{
					  while(!KeyUp_P);
						Set_Value[3][0]++;
					}
				}
			}
		}
}

void LcdPrint_A0(uchar hang,uchar add,uchar date)
{
	if(hang==0)   
		LcdWriteCmd(0x80+add);
	else
		LcdWriteCmd(0x80+0x40+add);
	LcdWriteData('l');
	LcdWriteData('d');
	LcdWriteData(':');
	LcdWriteData(date/100+0x30);				// 百位
	LcdWriteData(date%100/10+0x30);		// 十位
	LcdWriteData(date%10+0x30);				// 个位
	LcdWriteData('%');
}
void LcdPrint_A1(uchar hang,uchar add,uchar date)
{
	if(hang==0)   
		LcdWriteCmd(0x80+add);
	else
		LcdWriteCmd(0x80+0x40+add);
	LcdWriteData('s');
	LcdWriteData('y');
	LcdWriteData(':');
	LcdWriteData(date/100+0x30);				// 百位
	LcdWriteData(date%100/10+0x30);		// 十位
	LcdWriteData(date%10+0x30);				// 个位
//	LcdWriteData('d');
//	LcdWriteData('B');
}
void LcdPrint_TH(uchar hang,uchar add,uchar date)
{
	if(hang==0)   
		LcdWriteCmd(0x80+add);
	else
		LcdWriteCmd(0x80+0x40+add);
	LcdWriteData('w');
	LcdWriteData('d');
  LcdWriteData(':');
	LcdWriteData(date/100+0x30);				// 百位
	LcdWriteData(date%100/10+0x30);		// 十位
	LcdWriteData(date%10+0x30);				// 个位
	LcdWriteData('C');
}
void LcdPrint_RH(uchar hang,uchar add,uchar date)
{
	if(hang==0)   
		LcdWriteCmd(0x80+add);
	else
		LcdWriteCmd(0x80+0x40+add);
	LcdWriteData('s');
	LcdWriteData('d');
	LcdWriteData(':');
	LcdWriteData(date/100+0x30);				// 百位
	LcdWriteData(date%100/10+0x30);		// 十位
	LcdWriteData(date%10+0x30);				// 个位
	LcdWriteData('%');
}
/*********************************************************/
// 报警判断
/*********************************************************/
void AlarmJudge(void)
{			
if((temp_value<Set_Value[0][0])||(temp_value>Set_Value[0][1])||
	 (humi_value<Set_Value[1][0])||(humi_value>Set_Value[1][1])||
   (ADC_Value[1]>Set_Value[3][1]))
		{
//			Led_P=0;
			Buzzer_P=0;
			DelayMs(50);
//			Led_P=1;
			Buzzer_P=1;
			DelayMs(50);
		}
		if(ADC_Value[1]>Set_Value[3][1])
		{
		  Motor_EN=1;
		}
		else Motor_EN=0;
		
		if(ADC_Value[0]<Set_Value[3][0])
		{
		  Led_1=0;
		}
		else Led_1=1;
}

/*********************************************************/
// 主函数
/*********************************************************/
void main()
{
	LcdInit();												// 执行液晶初始化     ”
  DelayMs(500);
	DelayMs(500);
	Motor_EN=0;
	while(1)
	{
		KeyScanf();
		ADC_Processing();	
		LcdPrint_A1(1,0,ADC_Value[1]);   // 
		LcdPrint_A0(1,8,ADC_Value[0]);   // 
		
		DHT11_receive();                 // 读取温湿度
		LcdPrint_RH(0,8,humi_value);     // 显示当前湿度
		LcdPrint_TH(0,0,temp_value);    // 显示当前温度
		
		AlarmJudge();								// 判断一下是否需要报警,是的话则报警
	}
}

设计文件:
链接:https://pan.baidu.com/s/1PjExh2SKzbWO1L3-vNvLvg?pwd=8ihj

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值