Advertisement

利用STM32单片机电路设计实现温湿度监测模块的Proteus仿真及源程序开发

阅读量:

基于STM32单片机的电压电流检测与DHT11温湿度采集-Proteus仿真-源代码设计
一、系统方案

本系统以STM32单片机为核心控制器,通过DHT11传感器实现对环境温湿度的采集,并对电压及电流数值进行测量。所获取的数据由液晶1602显示屏展示当前时间,同时支持按键操作进行参数设定。当检测到的测量值超出预设阈值时,系统将触发蜂鸣器发出警报信号。

在这里插入图片描述

二、硬件架构设计
以下为系统原理图:

在这里插入图片描述

三、单片机软件设计
1、首先进行系统初始化操作:
u8 i;
u16 adcx;
u16 adc;

复制代码
    InitGPIO();
    LcdInit();
    Adc_Init();
    LcdWriteCom(0x80);  //设置数据指针起点
    
    
    KEY_Init();
    LED_Init();
    DHT11_Init();

2、液晶显示程序
/*******************************************************************************

  • 函 数 名 : LcdWriteCom

  • 函数功能 : 向LCD写入一个字节的命令

  • 输 入 : com

  • 输 出 : 无
    /
    void LcdWriteCom(uchar com) //写入命令
    {
    // LCD1602_E = 0; //使能
    GPIO_ResetBits(GPIOB,GPIO_Pin_3);
    // LCD1602_RS = 0; //选择发送命令
    GPIO_ResetBits(GPIOB,GPIO_Pin_1);
    // LCD1602_RW = 0; //选择写入
    GPIO_ResetBits(GPIOB,GPIO_Pin_2);
    // LCD1602_DATAPINS = com; //放入命令
    GPIO_Write(GPIOC,0X00FF&com);
    Lcd1602_Delay1ms(1); //等待数据稳定
    // LCD1602_E = 1; //写入时序
    GPIO_SetBits(GPIOB,GPIO_Pin_3);
    Lcd1602_Delay1ms(5); //保持时间
    // LCD1602_E = 0;
    GPIO_ResetBits(GPIOB,GPIO_Pin_3);
    }
    /

  • 函 数 名 : LcdWriteData

  • 函数功能 : 向LCD写入一个字节的数据

  • 输 入 : dat

  • 输 出 : 无
    *******************************************************************************/
    void LcdWriteData(uchar dat) //写入数据
    {
    // LCD1602_E = 0; //使能清零
    GPIO_ResetBits(GPIOB,GPIO_Pin_3);
    // LCD1602_RS = 1; //选择输入数据
    GPIO_SetBits(GPIOB,GPIO_Pin_1);
    // LCD1602_RW = 0; //选择写入
    GPIO_ResetBits(GPIOB,GPIO_Pin_2);
    // LCD1602_DATAPINS = dat; //写入数据
    GPIO_Write(GPIOC,0X00FF&dat);
    Lcd1602_Delay1ms(1);

// LCD1602_E = 1; //写入时序
GPIO_SetBits(GPIOB,GPIO_Pin_3);
Lcd1602_Delay1ms(5); //保持时间
// LCD1602_E = 0;
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
}

3、按键检测程序

void KEY_Scan(void)

{

复制代码
    if(KEY4==0)			//读取K1按键状态
    	{
    		 Delay(10);
    		if(KEY4==0)
    		{
    			while(KEY4==0);
      mode++;
    			if(mode>4) mode=0;
    			
    			
    		}
    	}
    	if(KEY5==0)			//读取K2按键状态
    	{
    		 Delay(10);
    		if(KEY5==0)
    		{
    			while(KEY5==0);
    			if(mode==1)
    			{
    				wendu++;
    				if(wendu>50) wendu=50;
    				
    			}
    			if(mode==2)
    			{
    				shidu++;
    				if(shidu>100) wendu=99;
    			}
    			if(mode==3)
    			{
    				dy=dy+50;
    				if(dy>2000)dy=2000;
    			}
    	  	if(mode==4)
    			{
    				dl=dl+500;
    				if(dl>1000)dy=1000;
    			}
    	}
    	}
    	  if(KEY6==0)			//读取K3按键状态
    	{
    		 Delay(10);
    		if(KEY6==0)
    		{
    			while(KEY6==0);
    		if(mode==1)
    			{
    			
    				if(wendu>0) wendu--;
    				
    			}
    			if(mode==2)
    			{
    				
    				if(shidu>0) shidu--;
    			}
    			if(mode==3)
    			{
    				
    				if(dy>50)dy=dy-50;
    			}
    	  	if(mode==4)
    			{
    				
    				if(dl>500)dl=dl-500;
    			}
    		}
    	}

}
4、核心算法程序
执行按键扫描函数KEY_Scan();

复制代码
    		DHT11_Read_Data(&temperature,&humidity) ;//温湿度采集
    	
    if(mode==0)
    	{
    	adcx=Get_Adc_Average(ADC_Channel_2,10);
    adcx=(adcx*1100/200)-10700;//电流采集
    	LcdWriteCom(0xc0);
    	LcdWriteData('D');
    	LcdWriteData('L');
    	LcdWriteData(':');
    	
    	LcdWriteData('0'+adcx/1000);
    	LcdWriteData('.');
    	LcdWriteData('0'+adcx%1000/100);
    	LcdWriteData('0'+adcx%1000%100/10);
    	LcdWriteData('0'+adcx%10);
    	LcdWriteData('A');
    	LcdWriteData(' ');LcdWriteData(' ');
    		LcdWriteCom(0xc3+8);
    		LcdWriteData('T');
    		LcdWriteData(':');
    	LcdWriteData('0'+temperature/10);
    	LcdWriteData('0'+temperature%10);
    	
    		LcdWriteData('C');
    	adc=Get_Adc_Average(ADC_Channel_1,10);
    	
    	
    
    	adc=400*adc*(5.0/4096);//电压采集
    
    	LcdWriteCom(0x80);
    	LcdWriteData('D');
    	LcdWriteData('Y');
    	LcdWriteData(':');
    	LcdWriteData('0'+adc/1000);
    	LcdWriteData('0'+adc%1000/100);
    	LcdWriteData('.');
    	LcdWriteData('0'+adc%1000%100/10);
    	LcdWriteData('0'+adc%10);
    		LcdWriteData('V');
    		LcdWriteData(' ');LcdWriteData(' ');
    		LcdWriteCom(0x83+8);
    		LcdWriteData('H');
    		LcdWriteData(':');
    	LcdWriteData('0'+humidity/10);
    	LcdWriteData('0'+humidity%10);
    		LcdWriteData('%');
    		
    		
    		
    		
    	}
    	if(mode==1)//设置温度报警值
    	{
    	LcdWriteCom(0x80);
    	LcdWriteData('S');
    	LcdWriteData('E');
    	LcdWriteData('T');
    			LcdWriteData(' ');
    	LcdWriteData('T');
    	LcdWriteData('E');
    			LcdWriteData('M');
    	LcdWriteData('P');
    	LcdWriteData(' ');
    			LcdWriteData('H');
    	LcdWriteData('I');
    	LcdWriteData('G');
    		LcdWriteData('H');
    	LcdWriteData(' ');
    	LcdWriteData(' ');	LcdWriteData(' ');
    		
    		LcdWriteCom(0xc0);
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData('0'+wendu/10);
    	LcdWriteData('0'+wendu%10);
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    		LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    		LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');	
    	}
    		if(mode==2)//设置湿度报警值
    	{
    	LcdWriteCom(0x80);
    	LcdWriteData('S');
    	LcdWriteData('E');
    	LcdWriteData('T');
    			LcdWriteData(' ');
    	LcdWriteData('H');
    	LcdWriteData('U');
    			LcdWriteData('M');
    	LcdWriteData('I');
    	LcdWriteData(' ');
    			LcdWriteData('H');
    	LcdWriteData('I');
    	LcdWriteData('G');
    		LcdWriteData('H');
    	LcdWriteData(' ');
    	LcdWriteData(' ');	LcdWriteData(' ');
    			LcdWriteCom(0xc0);
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData('0'+shidu/10);
    	LcdWriteData('0'+shidu%10);
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    		LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    		LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');
    	LcdWriteData(' ');	
    		
    		
    	}

四、Proteus仿真设计
Proteus软件是一款在工程实践中广泛应用的工具,其优势在于无需依赖实际的硬件平台,即可通过虚拟仿真手段模拟硬件系统的运行状态。借助该软件,可以在设计初期对所构思的方案进行验证,若发现存在缺陷,可及时调整元器件的选择与连接方式,直至满足预期目标。这种方式有效规避了传统实物搭建过程中可能出现的问题:若初始设计方案存在错误,而元器件已焊接完成,则需重新拆卸并更换新器件,不仅耗费大量人力与物力,还会给开发人员带来诸多不便。Proteus仿真软件恰好能够解决这一难题,在设计阶段即引入该工具进行模拟测试与优化选择,从而确定最符合需求的实施方案。最终依据经过验证的仿真图纸进行实物焊接与调试工作,进而顺利完成本设计任务。

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~