单片机源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char rs,set[]={0,0,0,0,0,0};
unsigned int data a;
int maxtemp,mintemp,ctemp;
double aa=0;
uint j;
//MAX6675引脚定义
sbit SO=P1^5;
sbit SCK=P1^6;
sbit CS=P1^7;
//函数名定义
uint min=0; //软件初始下限阈值(低温提示预警)
uint max=1023; //软件初始上限阈值(高温提示预警)
uint MAX6675_ReadData(void);
void mDelay(unsigned int DelayTime);
void Display(uint i);
void Display(uint i)
{
uchar dis[4]={0,0,0,0};
uint m,n;
uint LED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9显示码 共阳极数码管
n=0x08;
dis[3]=i/1000;
dis[2]=i%1000/100;
dis[1]=i%100/10;
dis[0]=i%10;
for(m=0;m<4;m++) //动态扫描
{
P0=0xff;
P2=0xf0|n; //指定位给1
P0=LED[dis[m]];
mDelay(3);
n=_cror_(n,1);
}
}
uint MAX6675_ReadData(void)
{
int k,i;
long int dat;
int n;
i=0;
dat=0;//初始化时间大于Tcss即>100ns
CS=0;
SCK=0;
for(i=0;i<16;i++) //16个脉冲采集信号
{
SCK=1; //拉高
dat<<=1;
if(SO==1)
dat=dat|0x01;
SCK=0; //拉低
}
CS=1; //拉高
dat>>=3; //D3-D14有效 温度值
dat&=0x0fff;
k=(dat*0.25); //乘分辨率0.25 就是摄氏度
if((0<k&&k<=161)||(406<=k&&k<=440)) //误差处理 冷端温度为0℃
{k+=1;}
if((162<=k&&k<=195)||(367<=k&&k<=405))
{k+=2;}
if((196<=k&&k<=240)||(305<=k&&k<=366))
{k+=3;}
if(241<=k&&k<=304)
{k+=4;}
if(471<=k&&k<=499)
{k-=1;}
if(500<=k&&k<=526)
{k-=2;}
if(527<=k&&k<=555)
{k-=3;}
if(556<=k&&k<=584)
{k-=4;}
if(585<=k&&k<=610)
{k-=5;}
if(441<=k&&k<=470)
{k=k;}
return k;//函数返回值 返回温度
}
void time0() interrupt 1 using 0
{
long int temp=1;
unsigned int cctemp;
ET0=0; //定时器0关
TH0=(65535-250)/256; //50000/250=200
TL0=(65535-250)%256;
a++;
if(a==3000)//a每加到3000 进行处理 1秒
{
a=0;
aa= MAX6675_ReadData();//调用读取温度函数
temp=aa*10;//读取温度按照上位机要求乘10处理
TI=0;SBUF='h';while(!TI);//通信协议 先发‘h’
TI=0;SBUF=temp/256;while(!TI);//乘10后先发高八位
TI=0;SBUF='l';while(!TI);//通信协议 在发‘l’
TI=0;SBUF=temp%256;while(!TI);//发温度的第八位
}
if(RI)
{RI=0;set[rs]=SBUF;rs++;if(rs==2)
{
ctemp = set[0];
ctemp = ctemp<<8;
ctemp = ctemp|set[1]; rs=0;
}
}
Display(ctemp/10);
ET0=1;//定位器开
}
void mDelay(unsigned int DelayTime)//软件延时1ms
{
unsigned char j=0;
while(DelayTime--);
}
void main()
{
TMOD=0X21;//定时器初始化模式设置
SCON=0X50;
PCON=0X80;
TH1=0XFA;
TL1=0XFA;
TH0=(65535-250)/256; //50000/250=200
TL0=(65535-250)%256;
TR1=1;
ET0=1;IT0=1;TR0=1;EX0=1;EA=1; //允许外部中断0产生中断
while(1);
}
|