www.pudn.com > adt7301.rar > adt7301.c


#include  
#include  
#include  
 
unsigned char low7301,high7301; 
unsigned int TempVal;                  // 16位温度值 
unsigned int FinishBCDtoASCII;         // BCD转换成ASCII码结束标志 
 
unsigned int TempValASCII[8],ASCIInum; 
float TempValFloat;                      
 
unsigned long TempValLong; 
unsigned long TempValBCD;              // BCD码形式存储的温度值 
 
void Delayms(unsigned int ms) 
{ 
	WORD i, j; 
	for(i=0; i 0; i--); // 延时等待. 
		if((IFG1 & OFIFG) == 0) 
		break; // 等待LFXT1振荡器工作正常. 
	} 
	if((IFG1 & OFIFG) != 0) 
	return 0; 
	BCSCTL2 |= 0x88; // 主时钟=辅助时钟=LFXT1=HF XTAL. 
	return 1; 
} 
 
void main(void) 
{   
  TempValASCII[7] = 10; 
  TempValASCII[6] = 48; 
  TempValASCII[3] = 46; 
  TempValASCII[0] = 43; 
  ASCIInum = 0; 
  FinishBCDtoASCII = 0;   
   
  WDTCTL = WDTPW + WDTHOLD;   
   
  XT2_clock_high();   
// *****************USART0 SPI 初始化 AD7301通讯********************************     
  P3SEL |= 0x0e; 
  P3DIR |= 0x04; 
  ME1 |= USPIE0;                              // 物理初始化 
 
  U0CTL = CHAR + SYNC + MM + SWRST;          // 复位 UART0, 选择主机方式,SPI模式,8位数据   
  U0TCTL = TXEPT + CKPL + SSEL0 + SSEL1 + STC;       //  初始化为模式3 
  U0BR0 = 0x02; 
  U0BR1 = 0x00; 
  U0MCTL = 0x00; 
  U0CTL &= ~SWRST; 
  IFG1 &= ~(URXIFG0 + UTXIFG0);   
// ***************************************************************************** 
// ******************USART1 UART 初始化 串口通讯********************************   
  P3SEL |= 0xC0; 
  P3DIR |= 0x20; 
  U1CTL = CHAR;                 // 设置USART1,UART异步模式,8位数据 
  U1TCTL = SSEL0 + SSEL1;        // 选择时钟源为SMCLK 
     
  U1BR0 = 0x71;                  // 6M/9600 
  U1BR1 = 0x02; 
  U1MCTL = 0x00;                 // 波特率调整寄存器 
  U1CTL &= ~SWRST; 
   
  AD7301_init(); 
  Delayms(100); 
  ME2 |= UTXE1; 
  U1CTL &= ~SWRST; 
// ***************************************************************************** 
// ************************定时器初始化***************************************** 
  TACTL = TASSEL1 + TACLR; 
  CCTL0 = CCIE; 
  CCR0 = 30*200;   
  TACTL |= MC0; 
// ***************************************************************************** 
  
  for(;;) 
  { 
     _DINT(); 
     AD7301_cs(); 
     Delayus(5); 
     Write7301Data(); 
     Delayus(5); 
     _EINT();   
     if(FinishBCDtoASCII ==1) 
     { 
          ASCIInum = 0; 
          TempValBCD = DWBinToBCDa(TempValLong);       
                             
          TempValASCII[5] = ((TempValBCD & 0x0f) + 48); 
          TempValBCD = TempValBCD >> 4;  
                            
          TempValASCII[4] = ((TempValBCD & 0x0f) + 48); 
          TempValBCD = TempValBCD >> 4; 
                     
          TempValASCII[2] = ((TempValBCD & 0x0f) + 48); 
          TempValBCD = TempValBCD >> 4; 
                     
          TempValASCII[1] = ((TempValBCD & 0x0f) + 48); 
          TempValBCD = TempValBCD >> 4;                
                     
          _NOP(); 
          FinishBCDtoASCII = 0;                
     } 
  }     
} 
 
 
#pragma vector = TIMERA0_VECTOR 
__interrupt void Timer_A(void) 
{ 
   if((IFG2 & UTXIFG1) && (FinishBCDtoASCII == 0)) 
   { 
       U1TXBUF = TempValASCII[ASCIInum]; 
       ASCIInum ++; 
       if(ASCIInum == 8) 
       { 
           TempValFloat = (((float)TempVal)/32)*100.0; 
           TempValLong = (unsigned long)TempValFloat; 
           ASCIInum = 0; 
           FinishBCDtoASCII = 1; 
       } 
   } 
}