采用avr系列ATMEGA8A单片机,数码管采用74hc595静态驱动,读取MAX6675芯片并进行温度转换。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
系统图
冷结补偿钾热电偶数字转换器(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就是多少摄氏度。
读取MAX6675时序图
单片机源程序如下:
- #include<mega8.h>
- #include <math.h>
- #include <delay.h>
- #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)
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
avr单片机代码与仿真:
max6675 K型热电偶.zip
(240 KB, 下载次数: 41)
|