STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码
发布日期:2022-01-20 01:07:32
浏览次数:2
分类:技术文章
本文共 3046 字,大约阅读时间需要 10 分钟。
STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码
本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128/64等等,所剩余的端口大部分重定义和默认的spi功能相对较少,所以采用了模拟spi的方法。 具体STM32数据手册、参考手册和max6675手册可以官网下载原理图
代码
max6675.h
#ifndef __MAX6675_H#define __MAX6675_H #include "stm32f10x.h"#include "sys.h" #define MAX6675_CS_H GPIO_SetBits(GPIOB,GPIO_Pin_8)#define MAX6675_CS_L GPIO_ResetBits(GPIOB,GPIO_Pin_8)#define MAX6675_CK_H GPIO_SetBits(GPIOB,GPIO_Pin_11)#define MAX6675_CK_L GPIO_ResetBits(GPIOB,GPIO_Pin_11)#define MAX6675_SO GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7) void max6675_init(void); //初始化max6675模块 u16 max6675_readRawValue(void);/*按位读取电平的原始数据函数*/float max6675_readTemperature(void);/*读取温度函数*/ #endif
max6675.c文件参考
STM32参考手册,第8章GPIO+max6675中文手册
MAX6675的原理及应用 文献里面的 时序图标红的部分为有效位部分代码
max6675.c
#include "max6675.h"#include "sys.h" #include "delay.h"#include "usart.h" /*max6675初始化程序*/void max6675_init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB8推挽输出 GPIO_Mode_AF_PP GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB8 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//PB7上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB11复用推挽输出 GPIO_Mode_AF_PP GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB11 }u16 max6675_readRawValue(void){ u16 tmp=0; u16 i; MAX6675_CS_L;//cs低 /*按位读取电平*/ for(i=0;i<16;i++) { /*创建一个沿,按沿读取PB7的端口电平*/ MAX6675_CK_H; delay_us(10); if(MAX6675_SO)tmp|=0x0001; //printf("tmp%d---:%d\n",i,tmp);/*这是为了检查错误时按位打印每个数*/ tmp<<=1;//按位左移 MAX6675_CK_L; delay_us(10); } MAX6675_CS_H;//cs高 if (tmp&0X04) { tmp = 0; //未检测到热电偶 // printf("未检测到热电偶\n");//测试用 } else { tmp<<=1;//去掉D15位 tmp>>=4;//去掉D0、1、2位 } return tmp;} float max6675_readTemperature(void){ u16 d; float i,S; S=2.142857;//实验数,用温水和热水 环境测得的一个实际差量 delay_ms(300); d=max6675_readRawValue(); i=d*1023.75/4095/S; return i;}
代码
main.c
LED灯原理图
#include "stm32f10x.h"#include "usart.h" #include "delay.h"#include "sys.h"#include "max6675.h"#include "led.h"/*里面我写了一个led灯闪烁程序,测试温度是否为0*/int main(void){ float t; LED_init(); delay_init(); uart_init(9600); max6675_init(); while(1){ GPIO_SetBits(GPIOA,GPIO_Pin_8); GPIO_SetBits(GPIOC,GPIO_Pin_12); GPIO_SetBits(GPIOD,GPIO_Pin_2); delay_ms(500); t = max6675_readTemperature(); printf("the temperature is:%.2f\n",t); printf("\n"); if(t!=0){ GPIO_ResetBits(GPIOA,GPIO_Pin_8); GPIO_ResetBits(GPIOC,GPIO_Pin_12); GPIO_ResetBits(GPIOD,GPIO_Pin_2); delay_ms(500); } }}
我买了模块的热电偶和其他热电偶线:
温度显示
自带的热电偶线
自己买的热电偶线:
自带的热电偶降温慢,另买的快一些。
stm32刚开始,求各位大佬带!!!!哈哈哈
转载地址:https://blog.csdn.net/answerMack/article/details/83270562 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月03日 17时40分57秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unity自带Json解析库——JsonUtility
2019-04-27
Unity中使用ViedoPlayer操作视频文件
2019-04-27
C#中的的输入与输出
2019-04-27
C#中@符号的作用
2019-04-27
C#中$符号的作用
2019-04-27
Mac装windows系统后如何更换触控板设置
2019-04-27
Windows系统下如何设置软件的快捷键
2019-04-27
语言中的溢出
2019-04-27
Unity中实现获取一段时间内移动设备声音的最大音量
2019-04-27
springboot的初始化启动过程
2019-04-27
关于spring bean 生命周期代码详解-产生到消亡
2019-04-27
spring 启动之全过程 源码解析
2019-04-27
Spring AOP 原理
2019-04-27
mysql 分库分表分区 动态扩容 总结
2019-04-27
分布式事务 四种方案
2019-04-27
redis和spring整合
2019-04-27
iis6 和iis7s上整个网站重定向
2019-04-27
iis7 url重写和重定向
2019-04-27
navicat工具来将SQL Server数据迁移到MySQL
2019-04-27