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