这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 综合技术» 基础知识» 请教MAX6675测温???????????????

共10条 1/1 1 跳转至

请教MAX6675测温???????????????

助工
2010-05-20 12:49:43 打赏

我的程序主要实现4路温度检测,每隔2秒从MAX6675读取一次,并显示出来!(注意:显示是在另外的一个板子上,采用单片机双机通信),四路温度测量的切换是用的cd4052双四模拟开关


朋友搞过相关的东西吗 帮忙分析一下


/******************************************************************************/
/**
/** 功能描述: 热电偶电路测温程序
/**
/** 创 建 人: 日期:2010-05-11 */
/** 修 改 人: 日期:2010-05-11 */
/** 其他说明:
/**
/******************************************************************************/

#include
#include
#include
/*************************************************
预定义声明
*************************************************/
#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)
{
//int tom;
init();
com_initialize (); /* 初始化串口*/
while(1)
{
CD4052_select();
/* if(count==40)
{

tom=k_tomdata();
tom=(tom/8)-24;
outbuf[5]=0;
fenli(tom);
com_isr ();
count=0;
}*/

}

}
void timer0() interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}




关键词: 请教 MAX6675 测温 CD4052 outb

专家
2010-05-20 13:58:40 打赏
2楼
有问题直接问,把你碰到的问题写上来,但是你上面的程序有点问题!

专家
2010-05-21 08:53:02 打赏
3楼
你仔细的检查这个函数void CD4052_select()
有问题的!

助工
2010-05-21 09:59:39 打赏
4楼

请问哪里有问题??我是刚接触这个,还不大懂!!
以下是接受和显示代码:

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define XTAL 11059200 // CPU振荡频率
#define baudrate 9600 // 波特率

sbit dat=P1^7; //控制并行数据
sbit clk=P1^6;

uchar a;
char idata inbuf[6]; // 接收缓冲区
unsigned char code tab[]={0x11,0xd7,0x32,0x92,0xd4,0x98,0x18,0xd3,0x10,0x90,
0xff};//0-9,A-F,全灭 (共阳字段表)
/*---------函数预声明-------------*/
void com_initialize (void) ;
void com_isr (void) ;
void xianshi();

//LED显示
void xianshi()
{
uchar num,i;
uchar j;

for(j=0;j<6;j++)
{
num=tab[inbuf[j]];
for(i=0;i<8;i++)
{
num<<=1;
clk=0;
dat=CY;
clk=1;
}
}

}

//***************串口中断****************
void ser() interrupt 4 using 1
{

uchar i=0,tmp;
for(i=0;i<6;i++)
{
while(!RI);
tmp=SBUF;
RI=0;
inbuf[i]=tmp;

}
xianshi();

}
//串口初始化
void com_initialize (void)
{

// 配置T1作为波特率发生器
PCON |= 0x80; // 波特率加倍
TMOD |= 0x20; // T1方式2,自动重装
TH1 = (unsigned char) (256 -(XTAL / (16L * 12L * baudrate)));
TR1 = 1; // 启动T1
SCON = 0x50;//串口方式1,允许接收
ES=1;
EA=1;
}


void main (void)
{

com_initialize (); //初始化串口
while (1);

}

下面是我抓的几个图:









这几个数值也不是固定的,只是抓了一组(没有接热电偶时,T+和T-没有短起来)


1.请问T+和T-在未接K型热电偶时,是不是要短路!!

2. 还有我做了一个实验,热电偶不经cd4052直接接到T+和T-时,100度以内看到的温度显示是逐渐上升的,但超过了100度直接跳变到200多度,(注:没有经过滤波处理)


希望多多帮忙!!谢谢!


专家
2010-05-21 10:40:13 打赏
5楼

串口中断函数有问题,仔细的看看就能看出来你的中断函数有问题
//***************串口中断****************
void ser() interrupt 4 using 1
{

uchar i=0,tmp;
for(i=0;i<6;i++) //问题
{
while(!RI);
tmp=SBUF;
RI=0;
inbuf[i]=tmp;

}
xianshi();

}

为什么不那么写?

char uartconut=0;
//***************串口中断****************
void ser() interrupt 4 using 1
{

uchar tmp;

while(!RI);
tmp=SBUF;
RI=0;
inbuf[uartconut++]=tmp;
if(uartconut==6)
{
uartconut=0;
xianshi();
}

}


专家
2010-05-21 10:43:27 打赏
6楼
按照你原来写的中断函数的话得出来的现象肯定是不确定的!

专家
2010-05-21 10:56:57 打赏
7楼
函数:void CD4052_select() 中i的值不是你想要的数值,我觉得应该这么修改:
while(i<4) ---去丢
switch(i)中的i换成一个外部变量step
case 0:
if(count==40)
{
step++;
..........(你原来要出来的函数)
} break;
case 1:
if(count==80)
{
step++;
..........(你原来要出来的函数)
} break;
case 2:
if(count==160)
{
step++;
..........(你原来要出来的函数)
}break;
case 3
if(count==240)
{
step=0;//你的意思应该是到了一定的时间后再回到通道1来处理了
..........(你原来要出来的函数)
} break;

助工
2010-05-21 11:05:51 打赏
8楼

/*************************************************
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;
}
}


这里面有什么问题??

还有采集过来的数据超过一个字节显示就会出错是吧??


助工
2010-05-21 11:21:40 打赏
9楼
照着你的改了 效果是一样的!!晕了!还有其他联系方式吗??
这样聊太费劲了!!我的qq282042513 可以的话加我!谢了

专家
2010-05-21 11:27:10 打赏
10楼
有问题,哥们!一步一步的分析程序就能看得出来了!


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]