Bootstrap

通过stm32读取max6675的温度值并在显示屏上显示

 目录

一 芯片概述

二 MAX6675传感器介绍

2.1 原理简介

2.2 芯片时许图

2.3 MAX6675的主要特性

三 接线说明

3.1 接口电路原理图

3.2 引脚说明

3.3 单片机引脚连接

四、代码编写

4.1 变量及引脚定义

4.2 SPI1初始化(MAX6675接口初始化)

4.3 MAX6675读取SPI数据

4.4 main函数代码

五 实验结果

六 结语


一 芯片概述

芯片:STM32F103c8

通信方式:spi

二 MAX6675传感器介绍

2.1 原理简介

MAX6675是一复杂的单片热电偶数字转换器,内部具有信号调节放大器、12位的模拟/数字化热电偶转换器、冷端补偿传感和校正、数字控制器、1个SPI兼容接口和1个相关的逻辑控制。

2.2 芯片时许图

                                                           MAX6675时序图

2.3 MAX6675的主要特性

①简单的SPI串行口温度值输出;

②0℃~+1024℃的测温范围;

③12位0.25℃的分辨率;

④片内冷端补偿;

⑤高阻抗差动输入;

⑥热电偶断线检测;

⑦单一+5V的电源电压;

⑧低功耗特性;

⑨工作温度范围-20℃~+85℃;

⑩2000V的ESD信号。

三 接线说明

3.1 接口电路原理图

                                                         传感器接口电路原理图 

3.2 引脚说明

MAX6675模块引脚说明
VCC正极 3.3/5V供电
GND负极 接GND
SCK时钟输入引脚
CS片选信号引脚
SO数据输出引脚

3.3 单片机引脚连接

本文使用的是stm32f103c8t6的芯片 ,引脚连接关系如下:

PA6-MISO:MAX6675-SO        
PA7-MOSI:MAX6675-SI      
PA5-SCK :MAX6675-SCK    
PA4-NSS :MAX6675-CS

OLED的配置及引脚连接参考之前的文章。

四、代码编写

4.1 变量及引脚定义

uint8_t ucbuf[17];

#define 	MAX6675_CS	 		GPIO_Pin_4
#define 	MAX6675_CSL()		GPIOA->BRR = MAX6675_CS;
#define 	MAX6675_CSH()		GPIOA->BSRR = MAX6675_CS;

4.2 SPI1初始化(MAX6675接口初始化)

void SPI_MAX6675_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	SPI_InitTypeDef  SPI_InitStructure;	
	
	/* 使能 SPI1 时钟 */                         
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);

	/* ---------通信I/O初始化----------------
	 * PA5-SPI1-SCK :MAX6675_SCK
	 * PA6-SPI1-MISO:MAX6675_SO
	 * PA7-SPI1-MOSI:MAX6675_SI	 
	 */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			// 复用输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* ---------控制I/O初始化----------------*/
	/* PA4-SPI1-NSS:MAX6675_CS */							// 片选
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		// 推免输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);						  
	GPIO_SetBits(GPIOA, GPIO_Pin_4);						// 先把片选拉高,真正用的时候再拉低
 

	/* SPI1 配置 */ 
	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI1, &SPI_InitStructure);
	
	
	/* 使能 SPI1  */
	SPI_Cmd(SPI1, ENABLE); 
}

4.3 MAX6675读取SPI数据

unsigned char MAX6675_ReadByte(void)
{
	
	/* Loop while DR register in not emplty */
	while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
	
	/* Send byte through the SPI1 peripheral */
	SPI_I2S_SendData(SPI1, 0xff);
	
	/* Wait to receive a byte */
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
	
	/* Return the byte read from the SPI bus */
	return SPI_I2S_ReceiveData(SPI1);
}

4.4 main函数代码

main (void)
{
	unsigned int t,i;
	unsigned char c;
	unsigned char flag;
	float temprature;
	/* 配置系统时钟为72M */
	SystemInit();
  
	/* MAX6675 SPI 接口初始化 */
	SPI_MAX6675_Init();
	OLED_Init();
	OLED_ColorTurn(0);//0正常显示,1 反色显示
  OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
	while(1)
	{
		OLED_Refresh();
	
		MAX6675_CSL();
		c = MAX6675_ReadByte();
		i = c;
		i = i<<8;
		c = MAX6675_ReadByte();
		MAX6675_CSH();
		
		i = i|((unsigned int)c);			//i是读出来的原始数据
		flag = i&0x04;						//flag保存了热电偶的连接状态
		t = i<<1;
		t = t>>4;
		temprature = t*0.25;
		if(i!=0)							//max6675有数据返回
		{
			if(flag==0)						//热电偶已连接
			{
				sprintf((char*)ucbuf,"%4.1f",temprature);
				OLED_ShowString(72,16,(uint8_t*)ucbuf,16,1);
				OLED_ShowChinese(0,16,0,16,1);  //当
				OLED_ShowChinese(16,16,1,16,1);  //前
				OLED_ShowChinese(32,16,2,16,1);  //温
				OLED_ShowChinese(48,16,3,16,1);//度
				OLED_ShowChar(64,16,':',16,1);
				OLED_ShowChinese(112,16,4,16,1);
			}	
		
		}
		else								//max6675没有数据返回
		{
			OLED_Clear();
			OLED_ShowChinese(0,16,5,16,1);  //无
			OLED_ShowChinese(16,16,6,16,1);  //数
			OLED_ShowChinese(32,16,7,16,1);  //据
		
		}
		for(i=0;i<0x2fffff;i++);			//max6675的转换时间是0.2秒左右,所以两次转换间隔不要太近
	}
}

OLED的初始化代码以及内容显示参考之前的文章,本文不再说明。

0.96寸OLED显示屏显示字符串、汉字(stm32标准库)_stm32oled文字库-CSDN博客

五 实验结果

此代码保留小数点后一位小数(四舍五入进位)。

六 结语

MAX6675将热电偶测温应用时复杂的线性化、冷端补偿及数字化输出等问题集中在一个芯片上解决,简化了将热电偶测温方案应用于嵌入式系统领域时复杂的软硬件设计,因而该器件是将热电偶测温方案应用于嵌入式系统领域的理想选择。

完整例程参考主页下载程序,有不妥之处欢迎指正,邮箱[email protected]

;