/******************************************************************************/
/**
/** 功能描述: 热电偶电路测温程序
/**
/** 创 建 人: 日期:2010-05-11 */
/** 修 改 人: 日期:2010-05-11 */
/** 其他说明:
/**
/******************************************************************************/
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
/*************************************************
预定义声明
*************************************************/
#define XTAL 11059200 // CPU振荡频率
#define baudrate 9600 // 波特率
#define uchar unsigned char
#define uint unsigned int
sbit k_so=P2^0;
sbit k_sck=P2^1;
sbit k_cs=P2^2;
sbit CD4052_A = P2^3;
sbit CD4052_B = P2^4;
sbit INHBIT = P2^5;
uchar idata outbuf[6]; // 发送缓冲区
unsigned char count;
/*************************************************
子函数声明
*************************************************/
void fenli(unsigned char wd );
void com_initialize (void);//串口初始化
void com_isr (void);//串口发送函数
void CD4052_select();//巡检
void init(void);
int k_read(void);//获得数据
//bit k_flag(void);//掉线检测 0为掉线,1为正常;
int k_tomdata(void);//获得13为温度数据
/*************************************************
定时器0初始化
*************************************************/
void init(void)
{
EA=1;
ET0=1;
TMOD=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
count=0;
}
/*************************************************
分离函数
*************************************************/
void fenli(unsigned char wd )
{
outbuf[0]=wd%10;
outbuf[1]=wd%100/10;
outbuf[2]=wd%1000/100;
outbuf[3]=10;
outbuf[4]=10;
// outbuf[5]=10;
}
/*************************************************
MAX232串口
*************************************************/
//初始化串口
void com_initialize (void)
{
//配置T1及波特率
PCON |= 0x80; // 波特率加倍
TMOD |= 0x20; // 方式2
TH1 = (unsigned char) (256 -(XTAL / (16L * 12L * baudrate)));
TR1 = 1; // 启动T1
SCON = 0x50; // 串口方式1,允许接收
EA = 1; //允许串行中断
}
void com_isr (void)
{ unsigned char i;
//------发送数据中断.
for(i=0;i<6;i++)
{
SBUF=outbuf[i];
while(!TI);
TI=0;
}
}
/*************************************************
CD4052 四路巡检
*************************************************/
void CD4052_select()
{
unsigned char i;
int tom;
INHBIT=0;//使能CD4052
while(i<4)
{
switch(i)
{
case 0 :
if(count==40)
{
CD4052_B=0;
CD4052_A=0;
tom=k_tomdata();
tom=(tom/8)-24;
outbuf[5]=0;
fenli(tom);
com_isr ();
}
break;
case 1 :
if(count==80)
{
CD4052_B=0;
CD4052_A=1;
tom=k_tomdata();
tom=(tom/8)-24;
outbuf[5]=1;
fenli(tom);
com_isr ();
}
break;
case 2 :
if(count==160)
{
CD4052_B=1;
CD4052_A=0;
tom=k_tomdata();
tom=(tom/8)-24;
outbuf[5]=2;
fenli(tom);
com_isr ();
}
break;
case 3 :
if(count==240)
{
CD4052_B=1;
CD4052_A=1;
tom=k_tomdata();
tom=(tom/8)-24;
outbuf[5]=3;
fenli(tom);
com_isr ();
count=0;
}
break;
}
i++;
if(i==4)i=0;
}
}
/*************************************************
MAX6675 读取转换结果
*************************************************/
int k_read(void)//获得数据
{
int dat=0,i;
k_sck=0;
k_cs=0;//开始读数据
k_sck=1;
k_sck=0;//输出D15
k_sck=1;
for(i=15;i>=1;i--)
{
k_sck=0;
dat=dat|k_so;
dat=dat<<1;
k_sck=1;
}
k_cs=1;
return( dat);
}
/*bit k_flag(void)//掉线检测 0为掉线,1为正常;
{ int dat;
dat=k_read();
if(dat&0x04==1)return(0);
if(dat&0x04==0)return(1);
}*/
int k_tomdata(void) //获得13位温度数据
{
int dat;
dat=k_read();
dat=dat&0x7ff8;
dat=dat>>3;
dat=(1023.75/4095)*dat;
return(dat);
}
//-------------主函数--------------
void main (void)
{
init();
com_initialize (); /* 初始化串口*/
while(1)
{
CD4052_select();
}
}
void timer0() interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}