MAX6675早就调试出来,感觉没有任何压力,我就是参考下面的程序调试出来的:
#include <REGX52.H>
#include "intrins.h" //_nop_();延时函数用
#define uchar unsigned char
#define uint unsigned int
sbit SO = P0^6; //P3.6口与SO相连
sbit SCK = P0^4; //P3.4口与SCK相连
sbit CS = P0^5; //P3.5口与CS相连
static uchar tempture[4];
static unsigned int MAX6675_Temp;
const uchar DevID = 1; //本机设备ID
static uchar Flag_connect;
void DelayMs(unsigned int i);
unsigned int MAX6675_ReadReg(void)
{
unsigned char i;
unsigned int dat;
i = 0;
dat = 0;
SCK = 0;
CS = 0;
_nop_();
SCK = 1;
for(i=0; i<16; i++) //get D15-D0 from 6675
{
SCK = 0;
_nop_();
dat = dat<<1;
if( SO == 1 )
dat = dat | 0x01;
SCK = 1;
_nop_();
}
CS = 1;
return dat;
}
/*
* 功 能:延时,若干毫秒
* 参 数:毫秒数
* 返回值:无
*/
void DelayMs(unsigned int i) //一个延时函数,这个函数在11.0592M晶振下的延时时间大概为1ms
{
unsigned int j,k;
for(j=i; j>0; j--)
for(k=114; k>0; k--);
}
/*
* 功 能:串口初始化
* 参 数:无
* 返回值:无
*/
void init_serialcomm( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80 ; //SMOD=1;
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
// TI=1;
// ES=1; //打开接收中断
// EA=1; //打开总中断
// TR1=1; //打开计数器
}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF = ch;
while (TI == 0 );
TI = 0 ;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( unsigned char *str, unsigned int strlen)
{
unsigned int k= 0 ;
do
{
send_char_com(*(str + k));
k++;
}
while (k < strlen);
}
void display(uint temp)
{
uchar *n;
tempture[0]=(temp % 10000)/1000 | 0x30;
tempture[1]=(temp % 1000)/100 | 0x30;
tempture[2]=(temp % 100)/10 | 0x30;
tempture[3]=temp % 10 | 0x30;
n= &tempture;
send_string_com( n , 4 );
}
void main(void)
{
unsigned int t=0,j=0;
unsigned int Temp=0;
unsigned int id=0;
P0=0x00;
init_serialcomm(); // 串口初始化
while(1)
{
t = MAX6675_ReadReg();
Flag_connect = t & 0x04; //读出数据的D2位是热电偶掉线标志位,该位为1表示掉线,该位为0表示连接
Flag_connect = Flag_connect >> 2; //MAX6675是否在线
id = t & 0x02;
id = id >> 1;
if(Flag_connect==0)
{
t = t<<1; //读出来的数据的D3~D14是温度值
t = t>>4;
MAX6675_Temp = t/4; //测得的温度单位是0.25,所以要乘以0.25(即除以4)才能得到以度为单位的温度值
Temp = Temp + MAX6675_Temp;
j=j+1;
if(j==20)
{
Temp=Temp/20-32;
j=0;
send_string_com( "读取的温度值为:", 16);
display(Temp);
send_string_com( " ℃", 3); // ℃
Temp=0;
DelayMs(500);
}
}
else
{
send_string_com( "热电偶未连接", 12);
DelayMs(500);
}
}
}
我调试成功之后读16位数据的程序是这个样子:
unsigned int MAX6675_ReadReg( void )
{
unsigned char i;
unsigned int dat;
i = 0;
dat = 0;
sck = 0;
cs = 0;
_nop_( ) ;
for(i=0; i<16; i++) //get D15-D0 from 6675
{
sck = 1;
_nop_( ) ;
dat <<= 1 ;
if ( so == 1 )
{
dat |= 0x01 ;
}
sck = 0 ;
}
cs = 1;
return dat;
}
|