⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adt7301.c

📁 MSP430F149与ADT7301组成的高精度测温程序
💻 C
字号:
#include <msp430x14x.h>
#include <sys.h>
#include <math.h>

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<ms; i++)
	{
		for(j=0; j<577; j++);
	}
}

void Delayus(unsigned int us)
{
	WORD i, j;
	for(i=0; i<us; i++)
	{
		for(j=0; j<5; j++);
	}               
}
      
void AD7301_init(void)
{
      _DINT();
      P2DIR |= 0x80;
      _EINT();
}

void AD7301_cs(void)
{       
       P2OUT |= 0x80;
       Delayms(6);
       P2OUT &= 0x7f;
}

unsigned char UWriteSpi(unsigned char Data)
{
	IFG1 &= (~URXIFG0);
	U0TXBUF = Data;
	WAIT_SPI_OVER;
        Delayms(500);
	return U0RXBUF;
}
        
void Write7301Data(void)            //写7301    
{	
	high7301 = UWriteSpi(0x00);
	low7301 = UWriteSpi(0x00);	
	 
        TempVal = (high7301<<8) + low7301;         
}

unsigned char XT2_clock_high(void) 
{
	unsigned char i;
	unsigned char Count;
	BCSCTL1 &= ~(XT2OFF); 	
	for(Count=0;Count<10;Count++)
	{
		IFG1 &= ~OFIFG; // 清除振荡器失效标志.
		for (i = 0xFF; 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;
       }
   }
}

      
  
  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -