基于STM32单片机电压电流-DHT11温湿度-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仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bbxyliyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值