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

📄 main.c

📁 MSP430F149采集放射性能谱
💻 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 + -