?? 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 + -