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

共10条 1/1 1 跳转至

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

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

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


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


/******************************************************************************/
/**
/** 功能描述: 热电偶电路测温程序
/**
/** 创 建 人:                 日期: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)  
{  
    //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<reg51.h>
#include<intrins.h>
#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 跳转至

回复

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