一,MAX6675热电偶介绍
见此文
MAX6675
二,程序源码
#include "reg51.h"
#include "intrins.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define DISPLAYLED P1
sbit CS =P2^5;
sbit SCK =P2^6;
sbit SO =P2^7;
typedef struct __MAX6675
{
uint temperature;
float finallyDat;
uchar displaydat[4];
uchar flag;
}MAX6675;
MAX6675 max6675={0,0.0,0};
uchar code str[]="max6675: ";
void delay_ms(uint cnt);
void MAX6675_ReadData(void);
void Send_Char(uchar chr);
void Send_Str(uchar *str);
void displayData(void);
void UartInit(void);
//时序中各时间延时如下:(根据官方手册)
/*
fSCL <= 4.3MHz
tCH >= 100ns
tCL >= 100ns
tCSS >= 100ns
tDV <= 100ns
tTR <= 100ns
tDO <= 100ns
*/
void MAX6675_ReadData(void)
{
uchar i=0;
uint dat=0;
CS=0;
SCK=0;
for(i=0;i<16;i++) //get D15-D0 from 6675
{
SCK = 1;
_nop_();
dat=dat<<1;
if(SO)
dat=dat|0x01;
SCK=0;
_nop_();
}
CS=1;
max6675.temperature=dat;
max6675.temperature>>=3;//读出来的数据的D3~D14是温度值
max6675.temperature&=~(0xf<<12);
max6675.finallyDat=max6675.temperature*0.25;
}
void delay_ms(uint cnt)
{
uint j,k;
for(j=0;j<cnt;j++)
for(k=0;k<114;k++);
}
void displayData(void)
{
uint temp=max6675.finallyDat;
DISPLAYLED=temp;
Send_Str(str);
max6675.displaydat[0]=temp/100+'0';
max6675.displaydat[1]=temp%100/10+'0';
max6675.displaydat[2]=temp%10+'0';
Send_Char(max6675.displaydat[0]);
Send_Char(max6675.displaydat[1]);
Send_Char(max6675.displaydat[2]);
SBUF=0x0A;
SBUF=0X0D;
while(!TI);
SCON&=~(1<<1);
}
void UartInit(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;//0101 0000
TH1=0XF3;
TL1=0XF3;
TR1=1;
}
void Send_Char(uchar chr)
{
SBUF=chr;
while(!TI);
SCON&=~(1<<1);
}
void Send_Str(uchar *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);
TI=0;
str++;
}
SCON&=~(1<<1);
}
int main(void)
{
SCK=CS=1;
UartInit();
while(1)
{
MAX6675_ReadData();
displayData();
//delay_ms(10);
}
return 0;
}
三,仿真图:
四,仿真视频
基于51单片机的MAX6675数据采集(Proteus仿真)(串口打印数据)