📄 main.c
字号:
#include <msp430x14x.h>
#define ADCEM ((int *)0x0140)
static int Data[511];
static int Sum;
/////////////////////////////////////////////////////////////////
//定义串口操作变量
char nRev_UART1;//串口 1 的接收标志
char UART1_TX_BUF[60];// 串口 1 的发送缓冲区
char UART1_RX_BUF[60];// 串口 1 的接收缓冲区
int nTX1_Len;
char nRX1_Len;
char nRX1_Len_temp;
char nTX1_Flag;
int nSend_TX1;
/////////////////////////////////////////////////////////////////
/////////////////////////初始化ADC12////////////////////////////
void Init_ADC12( void )
{
//WDTCTL=WDTPW+WDTHOLD;//停止Watchdog
P6SEL=0x01;//P6.0为ADC模块使用
ADC12CTL0 &=~0x02;//复位ADC的转换使能
//ADC12CTL0=ADC12CTL0_;
ADC12MCTL0=0x00;//Ref=AVss,AVcc;Input=A10
ADC12CTL1=0x0100;
//CsstartAdd=0000 单次转换地址的首地址
//SHS=00 采样输入信号源选择(这里是ADC12CS)
//SHP=1 采样信号选择 (SAMPCON直接源于采样输入信号)
//ISSH=0 采样输入信号反向与否控制 (同向输入)
//ADC12DIV=000+1 ADC12时钟源分频因子选择 (1)
//ADC12SSEL=00 ADC12内核时钟源选择
//CONSEQ=00 单通道单次转换模式
//ADC12BUSY=0 ADC忙标志位
ADC12CTL0=0x0030+SHT0_8+SHT1_8;//tample=4*Tadc12CLK*n (这里=8)
//SHT1 =SHT1_8 (8*0x1000u)
//SHT0 =SHT0_8 (8*0x100u)
//MSC 0 多次采样/转换位
//2.5V 0 内部参考电压电压值选择
//REFON 1 参考电压控制
//ADC12ON 1 ADC12内核控制
//ADC12OVIE 0 溢出中断允许位
//ADC12TVIE 0 转换时间溢出中断允许位
//ENC 0 转换允许位
//ADC12SC 0 采样/转换控制位
ADC12CTL0|=0x02;//使能ADC转换 ENC =1
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
void Init_CLK(void)
{
unsigned int i;
BCSCTL1 = 0X00; //将寄存器的内容清零
//XT2振荡器开启
//LFTX1工作在低频模式
//ACLK分频因子为1
do
{// 清除OSCFault标志
IFG1 &= ~OFIFG;
for (i = 0x20; i > 0; i--);
}
while ((IFG1 & OFIFG) == OFIFG);//如果OSCFault=1
BCSCTL2 = 0X00; //将寄存器的内容清零
BCSCTL2 += SELM1; //MCLK的时钟源为TX2CLK,分频因子为1(3.6864MHz)
BCSCTL2 += SELS; //SMCLK的时钟源为TX2CLK,分频因子为1(3.6864MHz)
}
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void Start_Key(void)
{
unsigned int j;
j=0;
while (!((P1IFG==0x01)&&(P1IN==0x01)));//等待Mode(P1.0)键按下
while (P1IN==0x01)
{
if (j==9)//延迟10个时钟周期
{
break;
}
j++;
if (P1IN!=0x01)//延迟时间不够,重新开始
{
j=0;
while (!((P1IFG==0x01)&&(P1IN==0x01)));//等待Mode(P1.0)键按下
}
}
P1IFG&=~0x01;//将P1.0的中断标志复位
}
/////////////////////////////////////////////////////////////////
/////////////////////////初始化P1口/////////////////////////////
void Init_P1(void)
{
P1SEL=0x0b;//P1口设置,选择为P1口为IO
P1DIR=0x0b;//P1.3为输入模式
P1IE=0x00;//P1.3中断失能
}
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void Init_UART1(void)
{
U1CTL=0X00;//将寄存器的内容清零
U1CTL&=~SWRST;//SWRST复位,UART被允许
U1CTL+=CHAR;//数据位为8bit,1位停止位
U1TCTL=0X00;//将寄存器的内容清零
U1TCTL+=SSEL1;//波特率发生器选择SMCLK(3.6864MHz)
UBR0_1=0X20;//波特率为115200
UBR1_1=0X00;//
UMCTL_1=0X00;//调整寄存器
ME2|=UTXE1+URXE1;//使能UART1的TXD和RXD
IE2|=URXIE1;//使能UART1的RX中断
IE2|=UTXIE1;//使能UART1的TX中断
P3SEL|=BIT6;//设置P3.6为UART1的TXD
P3SEL|=BIT7;//P3.7为UART1的RXD
P3DIR|=BIT6;//为输出管脚
return;
}
////////////////////////////////////////////////////////////////
void Sent_Data(void)
{
//int nRes_UART1;
//int nRes = 0;
char UART1_RX_Temp[60];
int i;
_DINT();// 关闭中断
Init_UART1();// 初始化串口1
_EINT();// 打开中断
IFG2|=UTXIFG1;// 设置中断标志,进入发送中断程序
for(;;)// 进入处理循环,接收数据
{
if(nRev_UART1 == 1)
{
nRev_UART1 = 0;
for(i=0;i<nRX1_Len;i++)
UART1_RX_Temp[i]=UART1_RX_BUF[i];
break;
}
}
}
/////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
void main(void)
{
void ReadADCMEM(unsigned int *Result);
void Convert_Address_And_Add1(unsigned int *Result);
unsigned int i;
unsigned int j;
unsigned int *Result;
WDTCTL=WDTPW+WDTHOLD;//停止Watchdog
Init_CLK();//初始化时钟
Init_ADC12();//初始化ADC12
Init_P1();//初始化P1口
P1IE=0x0b;//P1.3中断使能
P1IES=~0x0b;//P1.3上升沿触发
_EINT();//使能全局中断
loop:
for (i=0;i<1;i++)
{
Start_Key();
if (P1IFG==0x0a)
{
ADC12CTL0|=0x01;//开始转换
ADC12CTL0&=~0x01;
for (j=0;j<=1000;j++);
P1IFG&=~0x03;//P1.3的标志位清零
}
}
while ((ADC12CTL1&0x01)==1);//等待ADC转换完成
ReadADCMEM(Result);
Convert_Address_And_Add1(Result);
//Sent_Data();
goto loop;
}
/////////////////////////////////////////////////////////////////
/////////////////读出转换存储寄存器的数据////////////////////////
void ReadADCMEM(unsigned int *Result)
{ unsigned int j;
for (j=0;j<1;j++)
{
Result[j]=ADC12MEM[j];
}
}
/////////////////////////////////////////////////////////////////
////////把ADC转换的数据转换成地址并对应地址的数据加1/////////////
void Convert_Address_And_Add1(unsigned int *Result)
{
unsigned int i;
Sum=0;
*Result>>=3;
for (i=0;i<=512;i++)
{
if (i==*Result)
{
Data[i]+=1;
//break;
}
Sum=Sum+Data[i];
}
//int *Address;
//Address=(int *)(*Result+0x0200);
}
#pragma vector=PORT1_VECTOR
__interrupt void Mode_Key(void)
{
if (P1IFG==0x01)//Mode(P1.0)键按下
{
}
if (P1IFG==0x02)//Set(P1.1)键按下
{
Sent_Data();//发送能谱数据
}
}
/////////////////////////////////////////////////////////////////
///////////////////处理来自串口 1 的接收中断////////////////////
#pragma vector=UART1RX_VECTOR
__interrupt void UART1_RX_ISR(void)
{
UART1_RX_BUF[nRX1_Len_temp] = RXBUF1;//接收来自的数据
nRX1_Len_temp += 1;
if(UART1_RX_BUF[nRX1_Len_temp - 1] == 13)
{
nRX1_Len = nRX1_Len_temp;
nRev_UART1 = 1;
nRX1_Len_temp = 0;
}
}
/////////////////////////////////////////////////////////////////
///////////////////处理来自串口 1 的发送中断////////////////////
#pragma vector=UART1TX_VECTOR
__interrupt void UART1_TX_ISR(void)
{
if(nTX1_Len != 0)
{
nTX1_Flag = 0;//表示缓冲区里的数据没有发送完
TXBUF1 = UART1_TX_BUF[nSend_TX1];
nSend_TX1 += 1;
if(nSend_TX1 >= nTX1_Len)
{
nSend_TX1 = 0;
nTX1_Len = 0;
nTX1_Flag = 1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -