导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助]初学单片机,碰到一个问题,如何将ADC12和串口通信[xiechenlei1985]

 *第16399篇: [求助]初学单片机,碰到一个问题,如何将ADC12和串口通信相连。请大侠帮忙,小弟不胜感激

  
楼 主:xiechenlei1985 2008年2月20日09:01
 [求助]初学单片机,碰到一个问题,如何将ADC12和串口通信相连。请大侠帮忙,小弟不胜感激
这是我从书上找得程序,又改了点,但是无法验证通过,不知道什么原因,请大侠指点。

#include   <msp430x14x.h>  

//定义全局变量
//模拟采集变量
int nADC_Flag;
int nADC_Count;
//串口发送变量
int nSend_TX1;
static int nTX1_Len;
static int nTX1_Flag;
//模拟采集缓冲区
int ADC_BUF_Temp0[10];
int ADC_BUF0[10];
//发送缓冲区
char UART1_TX_BUF[50];
//子程序声明
void Init_CLK(void);
void Init_ADC(void);
void Init_TimerA(void);
void Init_UART1(void);


void main(void)
{  int i;
   WDTCTL = WDTPW + WDTHOLD; // 停止WDT

   P1DIR |= 0x01;
   P1OUT |= 0x0f;      //LED设置

   _DINT();     //关闭中断
   //初始化
   Init_CLK();
   Init_ADC();
   Init_TimerA();
   //初始化变量
   nADC_Flag=0;
   nADC_Count=0;
   nSend_TX1=0;
   nTX1_Len=0;
   nTX1_Flag=0;
   _EINT();     //打开中断
   //开始循环
   for(;;)
   {
      //处理模拟量采集并发送
      if(nADC_Flag==1)
      {  
         nADC_Flag=0;
         while(1)    //等待缓冲区里的数据发送完毕
         {
            if(nTX1_Flag==1)   break;
          }
      //将数据由字转换成字节
      for(i=0;i  <10;i++)
      {
        UART1_TX_BUF[2*i]=(char)(ADC_BUF_Temp0[i]&0x00ff);
        UART1_TX_BUF[2*i+1]=(char)((ADC_BUF_Temp0[i]>  >  8)&0x00ff);
       }
      //设置帧结束标记
      UART1_TX_BUF[20]=0xaa;
      UART1_TX_BUF[21]=0xaa;
      nTX1_Len=22;   //发送数据的长度
      IFG2|=UTXIFG1;  //设置中断标志
      }
    }


//时钟初始化
void Init_CLK(void)
{
   unsigned int i;
   BCSCTL1 &= ~XT2OFF;        //启动XT2,
   do
     { IFG1 &= ~OFIFG;         //清OSCFault标志
     for(i=0xFF;i>  0;i--);     //延时等待
     }
   while((IFG1 & OFIFG) != 0); //查OSCFault,为0时转换完成
   BCSCTL2 |= SELS;            //SMCLK为XT2
   return;
}

      
//ADC12初始化
void Init_ADC(void)
{
 //ADC12设置**************************
 P6SEL |= 0x01;                   //使用A/D通道 A0
 ADC12CTL0 &= ~ENC ;               //转换允许(上升沿)
 ADC12CTL0 = ADC12ON+MSC+SHT0_2 ; //开ADC12内核,设SHT0=2 (N=4) 
 ADC12CTL1 = SHP+CONSEQ_2 ;       //SAMPCON信号选为采样定时器输出,单口连发

 //ADC12内部参考电压设置
 ADC12CTL0 |= REF2_5V;            //选用内部参考电压为2.5V
 ADC12CTL0 |= REFON;              //内部参考电压打开
 ADC12MCTL0 |= SREF_1+INCH_0;     //R+=2.5V R-=VSS,A0输入
 ADC12CTL1 = ADC12SSEL_1;         //SMCLK
 ADC12CTL1 = ADC12DIV_0;          //时钟分频为1
 //转换允许 
 ADC12IE =0x01;                   //使能中断ADC12IFG A0
 return;
 }


//定时器TimerA初始化
void Init_TimerA(void)
{
   TACTL=TASSEL1+TACLR;           //选择SMCLK,清除TAR
   TACTL+=ID1;
   TACTL+=ID0;                    //1/8SMCLK
   CCTL0=CCIE;                    //CCR0 中断允许
   CCR0=4000;                     //时间间隔为250Hz

   //CCR0=0x01;                   //连续计数方式
   //TACTL|=MC1;

   TACTL|=MC0;                    //增计数模式
   return;
}

//定时器中断,完成ADC转换
interrupt [TIMERA0_VECTOR] void TimerA_ISR(void)
{
   int i;

   ADC12CTL0 &=~ENC;                  //关闭转换
   ADC_BUF0[nADC_Count]=ADC12MEM0;    //读出转换结果
   nADC_Count +=1;
   if(nADC_Count==10)
   {
     nADC_Flag=1;                     //设置标志
     nADC_Count=0;
     //将数据倒向数据缓冲区
     for(i=0;i  <10;i++)
       ADC_BUF_Temp0[i]=ADC_BUF0[i];
   }
   ADC12CTL0 |=ENC+ADC12SC;            //开启转换
}

//UART1初始化
void Init_UART1(void)
{
   U1CTL=0x00;               //将寄存器的内容清零
   UCTL0=CHAR;               // 数据位为8bit

   U1TCTL=0x00;               //将寄存器的内容清零
   U1TCTL+=SSEL1;             //波特率发生器选择SMCLK
   
   UBR0_1=0x45;               //波特率为115200
   UBR1_1=0x00; 
   UMCTL_1=0x00; 

   ME2|=UTXE1 + URXE1;          // Enable Tx1,Rx1
   IE1|=URXIE1;                 // RX使能
   IE1|=UTXIE1;                 // TX使能

   P3SEL |= 0xc0;               // 将P3.6,7使用外围模块 = USART1 TXD/RXD
 P3DIR |= 0x40;               // 将P3.6设为输出(发),P3.7默认为输入(收)
 return;
}

//处理来自串口1的发送中断

interrupt [UART1TX_VECTOR] 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;
       }
   }
}


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:硬件人才招聘信息

[下一篇主题]:Wavecom Q24PL002接口开发的一些问题