//程序功能:MAX6675 的输出数据为16 位,输出时高位在前。D15 为无用位;
//D14~D3 对应于热电偶模拟输出电压的数字量;
//D2 用于检测热电偶是否断线(D2为1表明热电偶断线) ;
//D1为 MAX6675的 标识符;D0为三态
//温度值= 1023.75 ×转换后的数字量/4095 =0.25*转换后的数字量
//程序接口:P3.2->SO; P3.0->CS; P3.3->SCK;使用IO口模拟SPI接口;
//当室温为11C时,用热电偶测得的显示温度值为24C,约为两倍,程序有待改进;
//实验结果:此结果为对读取的MAX6675的输出数值做右移一位处理的结果,也就是除以2
// 热电偶输出3.1mv,显示的温度值88.25C;
// 热电偶输出2.9mv,显示的温度值84.25C
// 测量工具为普通的万用表;
//编写时间:2月23日
//作者:林丽娟
#include <msp430x14x.h>
#include "lcd1602to430.h"
#define CS1 P3OUT |= BIT0;
#define CS0 P3OUT &=~BIT0;
#define SCK1 P3OUT|=BIT3;
#define SCK0 P3OUT&=~BIT3;
#define SO P3IN&BIT2
const unsigned char digit[10] = {'0','1','2','3','4','5','6','7', '8','9'};
unsigned char dis_temp [9] = {'+','0','0','0', '0', '.' ,'0','0','\0'};
unsigned char dis_K[]={"T-K-->"};
int disdata[12]={0};
unsigned char flag;
int i;
Init()
{
P3SEL&= 0x00; // 普通I/O
P3DIR |= 0x09; // P3.0,P3.3 输出;P3.2输入;
P3OUT |= 0x01;
}
void delay3(int z) //z=1时为2ms
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void K_test()
{
double ch;
unsigned int dt;
unsigned char temp1,temp2;
unsigned char da=0;
temp1=0;
temp2=0;
CS0;
_NOP();
SCK1;
delay3(20);
SCK0;
delay3(20); //*输出数据D15
SCK1;
delay3(20);
for(i=0;i<4;i++)
{
SCK0 ;
if((P3IN&BIT2)==0x00)
{da=0x00;}
else
da=0x01;
delay3(10);
SCK1 ;
temp1=(temp1<<1)|da;
delay3(10);
}
da = 0;
for(i=0;i<8;i++)
{
SCK0;
if((P3IN&BIT2)==0x00)
{da=0x00;}
else
da=0x01;
delay3(2);
SCK1;
temp2=(temp2<<1)|da;
delay3(5);
}
dt=temp1*256+temp2;
dt>>=1;
SCK0;
delay3(5);
if((P3IN&BIT2)==0x00)
{flag=0;}
else
flag=1; //*读取D2断偶标志so=1表断线
SCK1;
delay3(5);
SCK0;
SCK1;
SCK0; //*输出数据D0
CS1;
delay3(10);
ch=(double)dt*0.25;
disdata[0]=(int)ch/1000;
disdata[1]=(int)ch%1000/100;
disdata[2]=(int)ch%100/10;
disdata[3]=(int)ch%10;
// disdata[4]=10;
disdata[5]=(int)(ch*100)%100/10;
disdata[6]=(int)(ch*100)%10;
delay3(500);
dis_temp[1]=digit[disdata[0]];
dis_temp[2]=digit[disdata[1]];
dis_temp[3]=digit[disdata[2]];
dis_temp[4]=digit[disdata[3]];
dis_temp[6]=digit[disdata[5]];
dis_temp[7]=digit[disdata[6]];
}
main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
InitPort();
InitLCD() ;
Init();
while(1)
{
K_test();
lcd_pos(0x44); // 设置显示位置为第一行的第5个字符
delay(30);
i = 0;
while(i<8)
{ // 显示字符"welcome!"
lcd_wdat(dis_temp [i]);
delay(10);
i++;
}
if(flag==1)
{
lcd_pos(0x00); // 设置显示位置为第一行的第5个字符
lcd_wdat('r');
}
else
{
lcd_pos(0x00); // 设置显示位置为第一行的第5个字符
for(i=0;i<6;i++)
lcd_wdat(dis_K[i]);
}
delay3(2000);}
}