ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU

[STM32F1] 制作一台四路热电偶采集器 stm32+max6675

[复制链接]
449|32
 楼主 | 2019-8-22 16:17 | 显示全部楼层 |阅读模式

主要材料:

MCU:STM32F103C8T6核心板

热电偶:4个K型热电偶

采集芯片:4个MAX6675

显示:LCD1602液晶

指示:LED指示灯

接线柱:四路热电偶接线柱

箱子:180*120**80


使用特权

评论回复
 楼主 | 2019-8-22 16:18 | 显示全部楼层
功能:

1.支持四路热电偶数据同步串口输出到PC端。

2.支持4路温度同时采集,LCD显示。

3.支持热插拔方式,方便操作。

4.LED提示工作状态。

5.带有开机logo。

使用特权

评论回复
 楼主 | 2019-8-22 16:18 | 显示全部楼层
需要改进处:

可以使用LCD TFT彩屏显示
识别热电偶的状态。
打印将10275改为0度。
预留swd调试端口。

使用特权

评论回复
 楼主 | 2019-8-22 16:21 | 显示全部楼层
正面
949185d5e507e7ab2c.png

使用特权

评论回复
 楼主 | 2019-8-22 16:22 | 显示全部楼层
开关细节图
316445d5e50bb060d3.png

使用特权

评论回复
 楼主 | 2019-8-22 16:22 | 显示全部楼层
串口细节图:
53405d5e50d2bf0c8.png

使用特权

评论回复
 楼主 | 2019-8-22 16:23 | 显示全部楼层
电源插座细节图
921735d5e50f240d3f.png

使用特权

评论回复
 楼主 | 2019-8-22 16:23 | 显示全部楼层
准备仪器,连接电源(5V 1A)
792525d5e5114de752.png

使用特权

评论回复
 楼主 | 2019-8-22 16:26 | 显示全部楼层
电源线另一端连接仪器5V电源插座
842555d5e51b8d1591.png

使用特权

评论回复
 楼主 | 2019-8-22 16:27 | 显示全部楼层
连接串口线到电脑PC端,串口线连接到仪器。
888105d5e51cb54eca.png

使用特权

评论回复
 楼主 | 2019-8-22 16:27 | 显示全部楼层
串口线连接到电脑USB
676635d5e51e83246d.png

使用特权

评论回复
 楼主 | 2019-8-22 16:27 | 显示全部楼层
打开仪器电源开关, —符号端为接通端,O符号端为断开端,此时开关处于接通状态。
817655d5e520dcf991.png

使用特权

评论回复
 楼主 | 2019-8-22 16:29 | 显示全部楼层
LCD上电会显示 GIMM Init………字样
471585d5e52532d7a4.png

使用特权

评论回复
 楼主 | 2019-8-22 16:29 | 显示全部楼层
连接热电偶,将热电偶的正极(红色)连接接线柱的红色,热电偶的负极(蓝色)连接接线柱的黑色。
664245d5e5262b2d20.png

使用特权

评论回复
 楼主 | 2019-8-22 16:29 | 显示全部楼层
LCD会显示该通道的温度值,对应的LED会以一定时间周期翻转状态。
562365d5e528193e4e.png

使用特权

评论回复
 楼主 | 2019-8-22 16:30 | 显示全部楼层
打开串口助手,波特率选择9600。
948475d5e5295a6793.png

使用特权

评论回复
 楼主 | 2019-8-22 16:30 | 显示全部楼层
需要实时记录温度数据的话,点击串口助手的保存数据按钮,注意:点击保存后,只是记录从开始采集那一刻开始到点击按钮时刻的数据。
466035d5e52aa2a684.png
779305d5e52b049c0b.png

使用特权

评论回复
 楼主 | 2019-8-22 16:31 | 显示全部楼层
主函数
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "USART.h"
  5. #include "timer.h"
  6. #include "lcd1602.h"
  7. #include "max6675.h"

  8. uint16_t times1,flag1,flag2,flag3,flag4;
  9. extern  float temprature1,temprature2,temprature3,temprature4;
  10. unsigned int temp1,temp2,temp3,temp4;


  11. unsigned char td1,td2;
  12. void LcdShow()
  13. {
  14.   LCD1602_Show_Str(0, 0, "GIMM Init .");
  15.         SysTick_delay_ms(500);
  16.         LCD1602_Show_Str(11, 0,".");
  17.   SysTick_delay_ms(500);
  18.         LCD1602_Show_Str(12, 0,".");
  19.   SysTick_delay_ms(500);
  20.         LCD1602_Show_Str(13, 0,".");
  21.   SysTick_delay_ms(500);
  22.         LCD1602_Show_Str(14, 0,".");
  23.   SysTick_delay_ms(500);
  24.         LCD1602_Show_Str(15,0,".");
  25.   SysTick_delay_ms(500);
  26. }
  27. void LcdShowInit()
  28. {
  29.   LCD1602_Show_Str(0, 0,"CH1: ");
  30.         SysTick_delay_ms(5);
  31.         LCD1602_Show_Str(8, 0,"CH2:");
  32.   SysTick_delay_ms(5);
  33.         LCD1602_Show_Str(0, 1,"CH3:");
  34.   SysTick_delay_ms(5);
  35.         LCD1602_Show_Str(8, 1,"CH4:");
  36.   SysTick_delay_ms(5);
  37.        
  38.         LCD1602_Show_Str(4,0,"000");
  39.   SysTick_delay_ms(5);
  40.         LCD1602_Show_Str(12,0,"000");
  41.   SysTick_delay_ms(5);
  42.         LCD1602_Show_Str(4,1,"000");
  43.   SysTick_delay_ms(5);
  44.         LCD1602_Show_Str(12,1,"000");
  45.   SysTick_delay_ms(5);
  46. }


  47. void TempShow()
  48. {       
  49.         temp1= temprature1*10;
  50.         temp2= temprature2*10;
  51.         temp3= temprature3*10;
  52.         temp4= temprature4*10;
  53.         if(temp1>=1000)
  54.         {
  55.                 flag1 = 0;
  56.           temp1 = 0;
  57.    LCD1602_Write_Cmd(0x84);
  58.          LCD1602_Write_Dat(0+0x30);
  59.          LCD1602_Write_Cmd(0x85);
  60.          LCD1602_Write_Dat(0+0x30);
  61.    LCD1602_Write_Cmd(0x86);
  62.    LCD1602_Write_Dat(0+0x30);
  63.          LCD1602_Write_Cmd(0x87);
  64.          LCD1602_Write_Dat(' ');               
  65.         }
  66.         else
  67.         {
  68.          flag1 = 1;
  69.          LCD1602_Write_Cmd(0x84);
  70.          LCD1602_Write_Dat(temp1/1000+0x30);
  71.          LCD1602_Write_Cmd(0x85);
  72.          LCD1602_Write_Dat(temp1%1000/100+0x30);
  73.    LCD1602_Write_Cmd(0x86);
  74.    LCD1602_Write_Dat(temp1%100/10+0x30);
  75.          LCD1602_Write_Cmd(0x87);
  76.          LCD1602_Write_Dat(' ');
  77.         }
  78.         if(temp2>=1000)
  79.         {
  80.           temp2 = 0; flag2 =0;
  81.    LCD1602_Write_Cmd(0x80+12);
  82.          LCD1602_Write_Dat(0+0x30);
  83.          LCD1602_Write_Cmd(0x80+13);
  84.          LCD1602_Write_Dat(0+0x30);
  85.          LCD1602_Write_Cmd(0x80+14);
  86.          LCD1602_Write_Dat(0+0x30);
  87.          LCD1602_Write_Cmd(0x80+15);
  88.          LCD1602_Write_Dat(' ');       
  89.         }
  90.         else
  91.         {
  92.          flag2 = 1;
  93.          LCD1602_Write_Cmd(0x80+12);
  94.          LCD1602_Write_Dat(temp2/1000+0x30);
  95.          LCD1602_Write_Cmd(0x80+13);
  96.          LCD1602_Write_Dat(temp2%1000/100+0x30);
  97.          LCD1602_Write_Cmd(0x80+14);
  98.          LCD1602_Write_Dat(temp2%100/10+0x30);
  99.          LCD1602_Write_Cmd(0x80+15);
  100.          LCD1602_Write_Dat(' ');
  101.         }
  102.         if(temp3>=1000)
  103.         {
  104.           temp3 = 0; flag3 = 0;
  105.          LCD1602_Write_Cmd(0x80+0x40+4);
  106.          LCD1602_Write_Dat(0+0x30);
  107.          LCD1602_Write_Cmd(0x80+0x40+5);
  108.          LCD1602_Write_Dat(0+0x30);
  109.          LCD1602_Write_Cmd(0x80+0x40+6);
  110.          LCD1602_Write_Dat(0+0x30);
  111.          LCD1602_Write_Cmd(0x80+0x40+7);
  112.          LCD1602_Write_Dat(' ');
  113.         }
  114.         else
  115.         {
  116.          flag3 = 1;
  117.          LCD1602_Write_Cmd(0x80+0x40+4);
  118.          LCD1602_Write_Dat(temp3/1000+0x30);
  119.          LCD1602_Write_Cmd(0x80+0x40+5);
  120.          LCD1602_Write_Dat(temp3%1000/100+0x30);
  121.          LCD1602_Write_Cmd(0x80+0x40+6);
  122.          LCD1602_Write_Dat(temp3%100/10+0x30);
  123.          LCD1602_Write_Cmd(0x80+0x40+7);
  124.          LCD1602_Write_Dat(' ');
  125.         }
  126.         if(temp4>=1000)
  127.         {
  128.          temp4 = 0; flag4 = 0;       
  129.    LCD1602_Write_Cmd(0x80+0x40+12);
  130.          LCD1602_Write_Dat(0+0x30);
  131.          LCD1602_Write_Cmd(0x80+0x40+13);
  132.          LCD1602_Write_Dat(0+0x30);
  133.          LCD1602_Write_Cmd(0x80+0x40+14);
  134.          LCD1602_Write_Dat(0+0x30);
  135.          LCD1602_Write_Cmd(0x80+0x40+15);
  136.          LCD1602_Write_Dat(' ');
  137.        
  138.         }
  139.         else
  140.         {
  141.          flag4 = 1;
  142.          LCD1602_Write_Cmd(0x80+0x40+12);
  143.          LCD1602_Write_Dat(temp4/1000+0x30);
  144.          LCD1602_Write_Cmd(0x80+0x40+13);
  145.          LCD1602_Write_Dat(temp4%1000/100+0x30);
  146.          LCD1602_Write_Cmd(0x80+0x40+14);
  147.          LCD1602_Write_Dat(temp4%100/10+0x30);
  148.          LCD1602_Write_Cmd(0x80+0x40+15);
  149.          LCD1602_Write_Dat(' ');
  150.         }
  151.                
  152.          
  153.        
  154.          
  155.        
  156.        
  157. }
  158. int main(void)
  159. {
  160.         LED_Init();
  161.         USART_Config();
  162.         printf("师弟师妹你们又在做实验吗?哈哈哈! 别做啦,去找小姐姐吧....\n");
  163.         printf("GIMM Init......\n");
  164.   Init_MAX6675_GPIO();
  165.         LCD1602_Init();       
  166.         LcdShow();
  167.         LCD1602_ClearScreen();
  168.         LcdShowInit();
  169.         TIM3_Int_Init(4999,7199);
  170.         while(1)
  171.         {  
  172.                 if(times1==1)
  173.                 {
  174.                         times1 = 0;
  175.                         if(flag1) LED1_Toggle
  176.       else         LED1_ON;
  177.                         if(flag2) LED2_Toggle
  178.       else         LED2_ON;
  179.                         if(flag3) LED3_Toggle
  180.       else         LED3_ON;
  181.                         if(flag4) LED4_Toggle
  182.       else         LED4_ON;
  183.                                        
  184.                         MAX6675_Read_Temp(1);
  185.                         MAX6675_Read_Temp(2);
  186.                         MAX6675_Read_Temp(3);
  187.                         MAX6675_Read_Temp(4);
  188.                         printf("%4.2f     ",temprature1);
  189.                         printf("%4.2f     ",temprature2);
  190.                         printf("%4.2f     ",temprature3);
  191.                         printf("%4.2f \r\n",temprature4);
  192.       TempShow();                       
  193.                 }       
  194.   }
  195. }




复制代码


使用特权

评论回复
 楼主 | 2019-8-22 16:32 | 显示全部楼层
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "USART.h"
#include "timer.h"
#include "lcd1602.h"
#include "max6675.h"

uint16_t times1,flag1,flag2,flag3,flag4;
extern  float temprature1,temprature2,temprature3,temprature4;
unsigned int temp1,temp2,temp3,temp4;


unsigned char td1,td2;
void LcdShow()
{
  LCD1602_Show_Str(0, 0, "GIMM Init .");
        SysTick_delay_ms(500);
        LCD1602_Show_Str(11, 0,".");
  SysTick_delay_ms(500);
        LCD1602_Show_Str(12, 0,".");
  SysTick_delay_ms(500);
        LCD1602_Show_Str(13, 0,".");
  SysTick_delay_ms(500);
        LCD1602_Show_Str(14, 0,".");
  SysTick_delay_ms(500);
        LCD1602_Show_Str(15,0,".");
  SysTick_delay_ms(500);
}
void LcdShowInit()
{
  LCD1602_Show_Str(0, 0,"CH1: ");
        SysTick_delay_ms(5);
        LCD1602_Show_Str(8, 0,"CH2:");
  SysTick_delay_ms(5);
        LCD1602_Show_Str(0, 1,"CH3:");
  SysTick_delay_ms(5);
        LCD1602_Show_Str(8, 1,"CH4:");
  SysTick_delay_ms(5);
       
        LCD1602_Show_Str(4,0,"000");
  SysTick_delay_ms(5);
        LCD1602_Show_Str(12,0,"000");
  SysTick_delay_ms(5);
        LCD1602_Show_Str(4,1,"000");
  SysTick_delay_ms(5);
        LCD1602_Show_Str(12,1,"000");
  SysTick_delay_ms(5);
}


void TempShow()
{       
        temp1= temprature1*10;
        temp2= temprature2*10;
        temp3= temprature3*10;
        temp4= temprature4*10;
        if(temp1>=1000)
        {
                flag1 = 0;
          temp1 = 0;
   LCD1602_Write_Cmd(0x84);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x85);
         LCD1602_Write_Dat(0+0x30);
   LCD1602_Write_Cmd(0x86);
   LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x87);
         LCD1602_Write_Dat(' ');               
        }
        else
        {
         flag1 = 1;
         LCD1602_Write_Cmd(0x84);
         LCD1602_Write_Dat(temp1/1000+0x30);
         LCD1602_Write_Cmd(0x85);
         LCD1602_Write_Dat(temp1%1000/100+0x30);
   LCD1602_Write_Cmd(0x86);
   LCD1602_Write_Dat(temp1%100/10+0x30);
         LCD1602_Write_Cmd(0x87);
         LCD1602_Write_Dat(' ');
        }
        if(temp2>=1000)
        {
          temp2 = 0; flag2 =0;
   LCD1602_Write_Cmd(0x80+12);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+13);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+14);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+15);
         LCD1602_Write_Dat(' ');       
        }
        else
        {
         flag2 = 1;
         LCD1602_Write_Cmd(0x80+12);
         LCD1602_Write_Dat(temp2/1000+0x30);
         LCD1602_Write_Cmd(0x80+13);
         LCD1602_Write_Dat(temp2%1000/100+0x30);
         LCD1602_Write_Cmd(0x80+14);
         LCD1602_Write_Dat(temp2%100/10+0x30);
         LCD1602_Write_Cmd(0x80+15);
         LCD1602_Write_Dat(' ');
        }
        if(temp3>=1000)
        {
          temp3 = 0; flag3 = 0;
         LCD1602_Write_Cmd(0x80+0x40+4);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+0x40+5);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+0x40+6);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+0x40+7);
         LCD1602_Write_Dat(' ');
        }
        else
        {
         flag3 = 1;
         LCD1602_Write_Cmd(0x80+0x40+4);
         LCD1602_Write_Dat(temp3/1000+0x30);
         LCD1602_Write_Cmd(0x80+0x40+5);
         LCD1602_Write_Dat(temp3%1000/100+0x30);
         LCD1602_Write_Cmd(0x80+0x40+6);
         LCD1602_Write_Dat(temp3%100/10+0x30);
         LCD1602_Write_Cmd(0x80+0x40+7);
         LCD1602_Write_Dat(' ');
        }
        if(temp4>=1000)
        {
         temp4 = 0; flag4 = 0;       
   LCD1602_Write_Cmd(0x80+0x40+12);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+0x40+13);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+0x40+14);
         LCD1602_Write_Dat(0+0x30);
         LCD1602_Write_Cmd(0x80+0x40+15);
         LCD1602_Write_Dat(' ');
       
        }
        else
        {
         flag4 = 1;
         LCD1602_Write_Cmd(0x80+0x40+12);
         LCD1602_Write_Dat(temp4/1000+0x30);
         LCD1602_Write_Cmd(0x80+0x40+13);
         LCD1602_Write_Dat(temp4%1000/100+0x30);
         LCD1602_Write_Cmd(0x80+0x40+14);
         LCD1602_Write_Dat(temp4%100/10+0x30);
         LCD1602_Write_Cmd(0x80+0x40+15);
         LCD1602_Write_Dat(' ');
        }
               
         
       
         
       
       
}
int main(void)
{
        LED_Init();
        USART_Config();
        printf("师弟师妹你们又在做实验吗?哈哈哈! 别做啦,去找小姐姐吧....\n");
        printf("GIMM Init......\n");
  Init_MAX6675_GPIO();
        LCD1602_Init();       
        LcdShow();
        LCD1602_ClearScreen();
        LcdShowInit();
        TIM3_Int_Init(4999,7199);
        while(1)
        {  
                if(times1==1)
                {
                        times1 = 0;
                        if(flag1) LED1_Toggle
      else         LED1_ON;
                        if(flag2) LED2_Toggle
      else         LED2_ON;
                        if(flag3) LED3_Toggle
      else         LED3_ON;
                        if(flag4) LED4_Toggle
      else         LED4_ON;
                                       
                        MAX6675_Read_Temp(1);
                        MAX6675_Read_Temp(2);
                        MAX6675_Read_Temp(3);
                        MAX6675_Read_Temp(4);
                        printf("%4.2f     ",temprature1);
                        printf("%4.2f     ",temprature2);
                        printf("%4.2f     ",temprature3);
                        printf("%4.2f \r\n",temprature4);
      TempShow();                       
                }       
  }
}




使用特权

评论回复
 楼主 | 2019-8-22 16:32 | 显示全部楼层
#include "lcd1602.h"
// RS:PC13   RW:PC14;  EN:PC15      
// DB0~DB7  PA0~PA7
// vO :接电位器
// 1脚:GND
// 2脚:VCC
void GPIO_Configuration()
{   
          GPIO_InitTypeDef GPIO_InitStructure;
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB, ENABLE);
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_Init(GPIOC, &GPIO_InitStructure);
       
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOA, &GPIO_InitStructure);
}


void LCD1602_Wait_Ready(void)
{
        u8 sta;
        DATAOUT(0xff);
        LCD_RS_Clr();
        LCD_RW_Set();
        do
        {
                LCD_EN_Set();
                SysTick_delay_ms(5);
                sta = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7);
                LCD_EN_Clr();
        }while(sta & 0x80);
}

void LCD1602_Write_Cmd(u8 cmd)
{
        LCD1602_Wait_Ready();
        LCD_RS_Clr();
        LCD_RW_Clr();
        DATAOUT(cmd);
        LCD_EN_Set();
        LCD_EN_Clr();
}

void LCD1602_Write_Dat(u8 dat)
{
        LCD1602_Wait_Ready();
        LCD_RS_Set();
        LCD_RW_Clr();
        DATAOUT(dat);
        LCD_EN_Set();
        LCD_EN_Clr();
}



void LCD1602_ClearScreen(void)
{
        LCD1602_Write_Cmd(0x01);
}

void LCD1602_Set_Cursor(u8 x, u8 y)
{
        u8 addr;
       
        if (y == 0)
                addr = 0x00 + x;
        else
                addr = 0x40 + x;
        LCD1602_Write_Cmd(addr | 0x80);
}



void LCD1602_Show_Str(u8 x, u8 y, u8 *str)
{
        LCD1602_Set_Cursor(x, y);
        while(*str != '\0')
        {
                LCD1602_Write_Dat(*str++);
        }
}

void LCD1602_Init(void)
{
        GPIO_Configuration();
        LCD1602_Write_Cmd(0x38);       
        LCD1602_Write_Cmd(0x0c);
        LCD1602_Write_Cmd(0x06);       
        LCD1602_Write_Cmd(0x01);
}


使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表