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