基于ATMEGA8A单片机+MAX6675的K型热电偶程序Proteus测试
2021-12-21 来源:51hei
采用avr系列ATMEGA8A单片机,数码管采用74hc595静态驱动,读取MAX6675芯片并进行温度转换。
冷结补偿钾热电偶数字转换器(0℃至+1024℃)
MAX6675执行冷结补偿,并将K型热电偶的信号数字化。数据以12位分辨率、SPI兼容、只读格式输出。该转换器可将温度解析为0.25°C,读数最高可达+1024°C,热电偶精度在0°C至+700°C范围内为8 LSb。max 6675采用小型8引脚SO4封装。应用●工业●家电●暖通空调
特点●K型热电偶输出的直接数字转换●冷结补偿●简单的SPI兼容串行接口● 12位,0.25°C分辨率●开放式热电偶检测
简单来说,读16个二进制,只有中间3到14是有效的,取出来,然后乘以分辨率0.25就是多少摄氏度。
单片机源程序如下:
#include
#include
#include
#define Date16 PORTD.5
#define CLK PORTD.7
#define RCLK PORTD.6
#define DateIN PINB.0
#define MCLK PORTB.1
#define CS PORTB.2
const unsigned char Dis_Code[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0XB6, 0xBE, 0xE0, 0XFE, 0xF6};
unsigned char Blk_Flg,Blk_Bit;
unsigned char Disp_Timer, Dis_Buffer[8];
unsigned int wendu,T_Timer;
unsigned int Read6675(void)
{
unsigned int date6675=0;
unsigned char i;
CS=0;
delay_us(15);
MCLK=0;
delay_us(15);
for(i=0;i<16;i++)
{
date6675<<=1;
delay_us(15);
MCLK=1;
delay_us(15);
if(DateIN==1) date6675|=0X01;
delay_us(15);
MCLK=0;
delay_us(15);
}
CS=1;
delay_us(15);
// MCLK=1;
if((date6675&0X0004)!=0) date6675=4095;
else date6675>>=3;
return date6675;
}
void T_zhuanhuan(void)
{
float temp;
temp=Read6675();
temp*=2.5;
wendu=(unsigned int)temp;
}
int EEPROMwrite( int location, unsigned char byte)
{
unsigned char oldSREG;
while (EECR & 0x02);
EEAR = location;
EEDR = byte;
oldSREG = SREG;
SREG &= ~0x80;
EECR |= 0x04;
EECR |= 0x02;
SREG = oldSREG;
return 0;
}
unsigned char EEPROMread( int location)
{
while (EECR & 0x02);
EEAR = location;
EECR |= 0x01;
return (EEDR);
}
void Disp_Led(void)
{
unsigned char Dis_Temp_B1,Dis_Temp_B2,Dis_Temp_B3 ;
RCLK=1 ;
for(Dis_Temp_B1=0;Dis_Temp_B1<5;Dis_Temp_B1++)
{
Dis_Temp_B3=1 ;
for(Dis_Temp_B2=0;Dis_Temp_B2<8;Dis_Temp_B2++)
{
if((Dis_Buffer[Dis_Temp_B1]&Dis_Temp_B3)!=0)
Date16=1 ;
else
Date16=0 ;
CLK=0 ;
CLK=1 ;
Dis_Temp_B3*=2 ;
}
}
RCLK=0 ;
RCLK=1 ;
}
void Dex_To_Bcd(int Dis_Value,unsigned char Blk_En,unsigned char Bcd_T_B1)
{
Dis_Buffer[4]=Dis_Code[Dis_Value/10000];
Dis_Value%=10000 ;
Dis_Buffer[3]=Dis_Code[Dis_Value/1000];
Dis_Value%=1000 ;
Dis_Buffer[2]=Dis_Code[Dis_Value/100];
Dis_Value%=100 ;
Dis_Buffer[1]=Dis_Code[Dis_Value/10];
Dis_Value%=10 ;
Dis_Buffer[0]=Dis_Code[Dis_Value];
if((Blk_Flg==1)&&(Blk_En!=0))
{
switch(Blk_Bit)
{
/*0*/
case 0 :
break ;
/*1*/
case 1 :
if(Bcd_T_B1==4)Bcd_T_B1=3 ;
break ;
/*2*/
case 2 :
if(Bcd_T_B1==3||Bcd_T_B1==4)Bcd_T_B1=2 ;
break ;
/*3*/
case 3 :
if(Bcd_T_B1==2||Bcd_T_B1==3||Bcd_T_B1==4)Bcd_T_B1=1 ;
break ;
/*4*/
case 4 :
Bcd_T_B1=0 ;
break ;
default :
break ;
}
}
if(Bcd_T_B1==1&&Dis_Buffer[4]==0xFC)Dis_Buffer[4]=0x00 ;
if(Bcd_T_B1==2&&Dis_Buffer[4]==0xFC)
{
Dis_Buffer[4]=0x00 ;
if(Dis_Buffer[3]==0xFC)
……………………