我的程序主要实现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++;
}  
			
			
			
						
			
 我要赚赏金
