int main(void) { char key_code = 8; float t; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); delay_init(); LED_Init(); Key_User_Init(); Exti_User_Init(); TIM3_User_Init(9999, 7199);//频率10KHz,重装载值9999+1 ms max6675_init(); while(1) { delay_ms(500); t = max6675_readTemperature(); printf("the temperature is:%.2f\n",t); printf("\n"); } }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时钟使能 //CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB7推挽输出 GPIO_Mode_AF_PP GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB8 //SO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//PB9上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB7 //SCK 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);//初始化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; }
#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时钟使能 //CS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //PB7推挽输出 GPIO_Mode_AF_PP GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB8 //SO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU;//PB9上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB7 //SCK 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);//初始化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; }
收藏1 举报
wangjiahao88 发表于 2019-5-1 16:13 请问一下 这个准吗? 读数准吗?
dsyq 发表于 2019-5-4 09:36 用SPI读取吧! 我用F1的SPI读“没问题”,但用F072的SPI读出的数始终有问题。
aa911 发表于 2019-5-4 12:15 我也想用SPI,但是这个电路就这样了,而且实际项目用的MCU就是F072
aa911 发表于 2019-5-4 12:24 可以看看你的代码吗?
dsyq 发表于 2019-5-4 13:25 换个评估板试试吧! 我调试CAN收发和MAX6675,用103R8T6都可以,用072R8T6与103C8T6都不行. ...
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
13
69
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号