基于STM32汽车温度空调控制系统

基于STM32温度空调控制

(程序+原理图+设计报告)

功能介绍

具体功能:

本控制系统主要以数字控制器MCU为控制中枢,采用STM32为控制芯片,外围电路有DS18B20温度采集电路,风扇控制电路,1602液晶显示电路和电源电路等组成。

1.通过DS18B20检测温度,实时显示在液晶上。

2.通过按键设置温度阈值,将阈值显示在1602液晶上,当温度超过阈值时,风扇启动降温,温度低于阈值,则风扇不转动。

添加图片注释,不超过 140 字(可选)

程序

cs 复制代码
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "adc.h"
#include <stdio.h>
#include "timer.h"
#include "lcd1602.h"
#include "ds18b20.h"  
#include <string.h>
#include "key.h"

unsigned char relayFlag=1;

unsigned char BufTab[maxBuf]; //wifi数据暂存
unsigned char Count;	   //串口数据计数
unsigned char UartBusy=0;  //盘忙
unsigned char ReadFlag=0;//读取标志

char dis0[16];
char dis1[16];
float temperature; 
unsigned char i,rekey ;
unsigned int SetNum= 35;
int main(void)
 { 
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为115200
  TIM3_Int_Init(499,7199);//50ms  	 
	LED_Init();		  		//初始化与LED连接的硬件接口
	KEY_Init(); 
// 	Adc_Init();		  		//ADC初始化	    

	Lcd_GPIO_init();  
	Lcd_Init();		 
	delay_ms(20);

//	while(DS18B20_Init());	//DS18B20初始化	
	Lcd_Puts(0,0,"My Designer!");//显示
	 
	
	while(1)
	{
		if((key1==0)||(key2==0))//按键按下
		{
			if(rekey == 0)
			{
				delay_ms(10);
				
			}		
		}
		else
		{rekey =0;}
		
		if(disFlag==1)//定时读取温度
		{
			temperature=(float)DS18B20_Get_Temp()/10;	//缩小10倍为实际值	   
		
			disFlag = 0;
		}
	}											    
}	
#include "lcd1602.h"

/************************端口初始化*******************************/
void Lcd_GPIO_init(void)
{
     GPIO_InitTypeDef GPIO_InitStructure;   //声明结构体

    /********Data端口设置*************/
	 RCC_APB2PeriphClockCmd(RCC_GPIO_DATA, ENABLE);  //打开端口B时钟 
     GPIO_InitStructure.GPIO_Pin  = GPIO_DATA_0_PIN|GPIO_DATA_1_PIN|GPIO_DATA_2_PIN|GPIO_DATA_3_PIN|GPIO_DATA_4_PIN|GPIO_DATA_5_PIN|GPIO_DATA_6_PIN|GPIO_DATA_7_PIN; //  DB8~DB15
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //标准输出模式
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
     GPIO_Init(GPIO_DATA_0, &GPIO_InitStructure);      //初始化端口

	 /********使能端口设置**********/
	 RCC_APB2PeriphClockCmd(RCC_GPIO_EN, ENABLE);    	//打开端口时钟 
     GPIO_InitStructure.GPIO_Pin =  GPIO_EN_PIN;     	// 使能端口
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //标准输出模式
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
     GPIO_Init(GPIO_EN, &GPIO_InitStructure);

	 /********读/写端口设置**********/
	 RCC_APB2PeriphClockCmd(RCC_GPIO_RW, ENABLE);    //打开端口时钟 
     GPIO_InitStructure.GPIO_Pin =  GPIO_RW_PIN;     // 使能端口
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //标准输出模式
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
     GPIO_Init(GPIO_RW, &GPIO_InitStructure);

	 /********指令/数据端口设置**********/
	 RCC_APB2PeriphClockCmd(RCC_GPIO_RS, ENABLE);    //打开端口时钟 
     GPIO_InitStructure.GPIO_Pin =  GPIO_RS_PIN;     // 使能端口
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽复用输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
     GPIO_Init(GPIO_RS, &GPIO_InitStructure);


}
/******************************************************************/



void Lcd_Init( void )  //初始化
{  
 	Lcd_GPIO_init();
	delay_us(1500);                     //延时15ms
	Lcd_Write_Command( 0x38,0);       // 写指令38H 不检测忙信号
	delay_us(500);				      //延时5ms
    Lcd_Write_Command( 0x38,0);       // 写指令38H 不检测忙信号
	delay_us(500);					  //延时5ms
    Lcd_Write_Command( 0x38,0);       // 写指令38H 不检测忙信号
   									  //以后每次写指令、读/写数据操作之前需检测忙信号
	Lcd_Write_Command( 0x38,1);       //显示模式设置 
    Lcd_Write_Command( 0x08,1);		  //显示关闭
	Lcd_Write_Command( 0x01,1);       //显示清屏
    Lcd_Write_Command( 0x06,1);       //显示光标移动设置 
    Lcd_Write_Command( 0x0C,1); 	  //显示开、光标不显示
} 
/******************************************************/

void Lcd_En_Toggle(void) //发使能脉冲
{
	SET_EN;        //使能1
	delay_us(5);   //延时160us
	CLE_EN;
}
#include "key.h"
//	 
*****//完整资料
****//***微信公众号:木子单片机****/
//All rights reserved									   
//	 
 	    
//按键初始化函数 
//PA15和PC5 设置成输入
void KEY_Init(void)
{
	
	GPIO_InitTypeDef GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//PA5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
	
} 




void Lcd_Busy(void)//判断忙
{
	 unsigned int later0=0;
     GPIO_InitTypeDef GPIO_InitStructure;
	 RCC_APB2PeriphClockCmd(RCC_GPIO_DATA, ENABLE);    //打开DATA端口时钟 

     GPIO_InitStructure.GPIO_Pin  = GPIO_DATA_0_PIN|GPIO_DATA_1_PIN|GPIO_DATA_2_PIN|GPIO_DATA_3_PIN|GPIO_DATA_4_PIN|GPIO_DATA_5_PIN|GPIO_DATA_6_PIN|GPIO_DATA_7_PIN; //  DB8~DB15
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入模式 = 上拉输入
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
     GPIO_Init(GPIO_DATA_7, &GPIO_InitStructure);      //打开忙检测端口

 	 CLE_RS; //RS = 0
	 //delay_us(1);   //延时10us
	 SET_RW; //RW = 1
	 //delay_us(1);   //延时10us
	 SET_EN; //EN = 1
	 //delay_us(2);   //延时20us
     while ((GPIO_ReadInputDataBit(GPIO_DATA_7,GPIO_DATA_7_PIN))&&(later0<20000)) //循环等待忙检测端口 = 0
	 {
	 	delay_us(5);
		later0++;	
	 }
	 CLE_EN; //EN = 0

     //恢复端口为输出状态 
   	 RCC_APB2PeriphClockCmd(RCC_GPIO_DATA, ENABLE);    //打开DATA端口时钟 
	 GPIO_InitStructure.GPIO_Pin  = GPIO_DATA_0_PIN|GPIO_DATA_1_PIN|GPIO_DATA_2_PIN|GPIO_DATA_3_PIN|GPIO_DATA_4_PIN|GPIO_DATA_5_PIN|GPIO_DATA_6_PIN|GPIO_DATA_7_PIN; //  DB8~DB15
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度
     GPIO_Init(GPIO_DATA_7, &GPIO_InitStructure);

} 

void Gpio_data(unsigned char x)  //端口置入数据
{  
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_0_PIN);  //DB0
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_1_PIN);  //DB1
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_2_PIN);  //DB2
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_3_PIN);  //DB3
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_4_PIN);  //DB4
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_5_PIN);  //DB5
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_6_PIN);  //DB6
GPIO_ResetBits(GPIO_DATA_0, GPIO_DATA_7_PIN);  //DB7
if(x&0X01)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_0_PIN);//DB0
if(x&0X02)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_1_PIN);//DB1
if(x&0X04)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_2_PIN);//DB2
if(x&0X08)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_3_PIN);//DB3
if(x&0X10)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_4_PIN);//DB4
if(x&0X20)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_5_PIN);//DB5
if(x&0X40)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_6_PIN);//DB6
if(x&0X80)GPIO_SetBits(GPIO_DATA_0, GPIO_DATA_7_PIN);//DB7
}


//向液晶里面写入指令  时序:RS=L,RW=L,Data0-Data7=指令码,E=高脉冲
void Lcd_Write_Command(unsigned char x,char Busy) 
{ 
    if(Busy) Lcd_Busy();
    //delay_us(1);   //延时10us
	CLE_RS;  //RS = 0 
    //delay_us(1);   //延时10us
	CLE_RW;  //RW = 0 
    //delay_us(4);   //延时40us
    Gpio_data(x);  //端口置入数据
    //delay_us(4);   //延时40us
	Lcd_En_Toggle();  //发使能脉冲
    //delay_us(1);   //延时100us
	Lcd_Busy(); //测忙

}
//向液晶里面写入数据  时序:RS=H,RW=L,Data0-Data7=指令码,E=高脉冲
void Lcd_Write_Data( unsigned char x) //向液晶里面写入数据 
{ 
	Lcd_Busy(); //测忙
    //delay_us(1);   //延时10us
	SET_RS;   //RS = 1 
    //delay_us(1);   //延时10us
    CLE_RW;   //RW = 0
    //delay_us(4);   //延时40us
    Gpio_data(x);
    //delay_us(4);   //延时40us
	Lcd_En_Toggle();  //发使能脉冲
    //delay_us(1);   //延时100us
	Lcd_Busy(); //测忙

} 

void Lcd_SetXY(unsigned char x,unsigned char y)   //字符初始位置设定,x表示列,y表示行 
{ 
     unsigned char addr; 
     if(y==0) 
          addr=0x80+x; 
     else if(y==1)
          addr=0xC0+x; 
     Lcd_Write_Command(addr,1) ; 
} 
/******************************************************/

void Lcd_Puts(unsigned char x,unsigned char y, unsigned char *string) //向1602写一个字符串 
{ 
   //unsigned char i=0;
   Lcd_SetXY(x,y); 
	while(*string) 
	  { 
	   Lcd_Write_Data(*string); 
       string++; 
      } 
}

void Lcd_1Put(unsigned char x,unsigned char y, unsigned char Data0)
{
   	Lcd_SetXY(x,y); 
	Lcd_Write_Data(Data0); 
}

硬件设计

使用元器件:

单片机:STM32F103;

添加图片注释,不超过 140 字(可选)

流程图:

添加图片注释,不超过 140 字(可选)

设计资料

01原理图

本系统原理图采用Altium Designer19设计,具体如图!

添加图片注释,不超过 140 字(可选)

02程序

本设计使用软件Keil5 MDK版本编程设计!具体如图!

添加图片注释,不超过 140 字(可选)

03设计报告

一万四千字设计报告,具体如下!

添加图片注释,不超过 140 字(可选)

04设计资料

全部资料包括程序(含注释)、AD原理图、结构框图、设计报告、流程图、实物图等。具体内容如下,全网最全! !

添加图片注释,不超过 140 字(可选)

点赞分享一起学习成长。

相关推荐
aerror2 小时前
使用mpu6500/6050, PID,互补滤波实现一个简单的飞行自稳控制系统
单片机·飞控
轩宇^_^2 小时前
C语言结构体与联合体详解
c语言·开发语言
WIZnet 中国社区官方博客3 小时前
【第二十三章 IAP】
嵌入式硬件·wiznet·高性能以太网单片机·w55mh32·单片机外设·iap简介·iap程序设计
梦境虽美,却不长4 小时前
C语言 学习 文件操作(开关,读写,定位,大小)操作 2025年6月8日12:19:24
c语言·开发语言·学习
yifa201604044 小时前
STM32、Arduino和51单片机
stm32·学习·51单片机
tyl21106 小时前
凌科芯安国产安全MCU简介
单片机·嵌入式硬件·安全
郦7777 小时前
国产入门级32位单片机PY32F002A开发板
单片机·嵌入式硬件
电院工程师7 小时前
轻量级密码算法CHAM的python实现
python·嵌入式硬件·算法·安全·密码学
飞凌嵌入式7 小时前
基于RK3588,飞凌教育品牌推出嵌入式人工智能实验箱EDU-AIoT ELF 2
linux·人工智能·嵌入式硬件·arm·nxp
@老蝴13 小时前
C语言 — 通讯录模拟实现
c语言·开发语言·算法