打印

MSP430G2553ADC采集程序

[复制链接]
2234|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Erichk|  楼主 | 2017-7-31 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在网上找到并略加修改的一段代码 通过串口调试助手测试的时候 设定的ADC输入端未连接任何信号源 单片机不断发出数据   也不知道是什么东西  求大神指导
#include<MSP430G2553.h>
unsigned int k;
char str[]="00.0";
long temp;
unsigned char tmp[3];
long IntDeg;
void ADC10_ISR(void);
void ADC10_init(void);
void Init_uart0(void);


void Uart0Sends(char *s)
{
  while(*s!='\0')  //查找字符。
  {
    UCA0TXBUF=*s;
    while((IFG2&UCA0TXIFG)==0); //查询发送是否结束,寄存器为空置位,满为复位??
    IFG2&=~UCA0TXIFG; //清除发送一标志位,多余的语句,发送完毕
    s++;
  }
}


void main()
{
        WDTCTL=WDTPW+WDTHOLD;
        ADC10_init();
          BCSCTL1 = CALBC1_1MHZ;
          DCOCTL  = CALDCO_1MHZ;
                  P1DIR|=BIT0;
        Init_uart0();

        _EINT();
    while(1)
    {
      ADC10CTL0 |= ENC + ADC10SC;            // Sampling and conversion start   采样开始,
//     _bis_SR_register(CPUOFF + GIE);                // LPM0 with interrupts enabled
      __delay_cycles(1000);
      //-----ADC转换完成中断唤醒CPU后才执行以下代码-----

      temp = ADC10MEM;
      //读取AD采样值
//      IntDeg= temp*4225/1024 - 2777;//转换为摄氏度,并10倍处理
      IntDeg=((temp*33)/1023);
//if(IntDeg>=200)
//                       P1OUT |= BIT0;
//                     else
//                       P1OUT &= ~BIT0;
      str[0]=IntDeg/100+0X30;
     str[1]=IntDeg%100/10+0X30;
     str[3]=IntDeg%100%10+0X30;

//  IntDeg=-123;                                                                        //由于难以获得负温,直接给负值以测试LCD显示
    }

}

/******************************************************************************************************
* 名       称:ADC10_init(void)
* 功       能:初始化ADC10采集内部温度传感器,单次手动采样
* 入口参数:无
* 出口参数:无
* 说       明:直接从CCS的Example中移植过来
* 范       例:无
******************************************************************************************************/
void ADC10_init(void)
{
        P1DIR&=~BIT4;
        ADC10CTL0 &= ~ENC;  //  关闭AD转换器
        ADC10CTL0 = ADC10IE + ADC10ON + REFON + ADC10SHT_3 + SREF_1;//1    允许ADC10中断   1    ADC10开启 ,打开基准源    64个ADC10CLK周期
    ADC10CTL1 = CONSEQ_0 + ADC10SSEL_0 + ADC10DIV_3 + SHS_0 + INCH_4;//单通道单次采样模式     ADC10OSC  8分频     ADC10SC位
      __delay_cycles(30000);
    ADC10CTL0 |= ENC;   //开启AD转换器
}
/******************************************************************************************************
* 名       称:ADC10_ISR_HOOK
* 功       能:ADC转换完成后唤醒CPU
* 入口参数:无
* 出口参数:无
* 说       明:直接从CCS的Example中移植过来
* 范       例:无
******************************************************************************************************/
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR_HOOK(void)
{
         Uart0Sends(str);
        _bic_SR_register_on_exit(LPM4_bits);
}
/**********************************************************************************************************
* 串口初始化
********************************************************************************************************* */
void Init_uart0()
{
  UCA0CTL1|=UCSWRST;
  P1SEL|=BIT1+BIT2; //将P1.1 P1.2设为第二功能
  P1SEL2|=BIT1+BIT2;//系统组合
  P1DIR  |= BIT2;           //P1.2  UART_TX
  P1DIR  &=~BIT1;           //P1.2  UART_RX
  UCA0CTL0&=~UC7BIT;//字符长度为8
  UCA0CTL1|=UCSSEL_2;//选择系统时钟
  UCA0BR0=0x68;  //波特率为9600
  UCA0BR1=0;
  UCA0MCTL=0X40;//UCA0MCTL=UCBRS0;
  UCA0CTL1&=~UCSWRST;

  IE2|=UCA0RXIE;//开接收使能

}




#pragma vector=USCIAB0RX_VECTOR
__interrupt void usart0_rx(void)
{
  while((IFG2&UCA0RXIFG )==0);//接收一位然后给发送缓存器 再中断再接受 再发送的过程
  IFG2&=~UCA0RXIFG ;


  Uart0Sends(str);

  UCA0TXBUF = UCA0RXBUF;
}

相关帖子

沙发
Thorald| | 2017-7-31 16:24 | 只看该作者
程序不管你有没有输入,它只会按指令办事,浮空输入同样也会转换并输出。

使用特权

评论回复
板凳
Bjorn| | 2017-7-31 16:37 | 只看该作者
可以将模拟输入管脚接在一个稳定的电平上,看看转换结果是否同样稳定。

使用特权

评论回复
地板
Rollo| | 2017-7-31 16:46 | 只看该作者
ADC输入端未连接任何信号源 ,你不连接信号源,输入端也是有电压值得,只要采样,计算,发送,电脑就可以收到数据啊。

使用特权

评论回复
5
Rangar| | 2017-7-31 17:02 | 只看该作者
不接入信号源,AD也会有数值漂的

使用特权

评论回复
6
Stannis| | 2017-7-31 17:13 | 只看该作者
先用示波器,看看,确定AD输入端的波形发生了变化。再看看电脑得到的数据是什么。

使用特权

评论回复
7
Brand2| | 2017-7-31 18:22 | 只看该作者
初始化写的有问题加一句  ADC10AE0 |= 0x01;//模拟信号输入使能
采样口是P1.0

使用特权

评论回复
8
kkzz| | 2017-8-2 21:41 | 只看该作者
单步调试查看寄存器是否有问题吗

使用特权

评论回复
9
hudi008| | 2017-8-2 21:41 | 只看该作者
只是串口存在问题吗?

使用特权

评论回复
10
lzmm| | 2017-8-2 21:42 | 只看该作者
while(*s!='\0') 这个有问题

使用特权

评论回复
11
minzisc| | 2017-8-2 21:42 | 只看该作者
ADC的数据采集应该没有问题。

使用特权

评论回复
12
selongli| | 2017-8-2 21:43 | 只看该作者
这个使用的延时处理的吗?

使用特权

评论回复
13
fentianyou| | 2017-8-2 21:43 | 只看该作者
串口接收到的数据是什么?

使用特权

评论回复
14
febgxu| | 2017-8-2 21:44 | 只看该作者
单片机不断发出数据是串口的问题。

使用特权

评论回复
15
sdlls| | 2017-8-2 21:45 | 只看该作者
这个有什么问题,ADC采样不行吗

使用特权

评论回复
16
kkzz| | 2017-8-2 21:45 | 只看该作者
寄存器的数据是否变化?

使用特权

评论回复
17
hudi008| | 2017-8-2 21:45 | 只看该作者
不要使用指针使用发送。

使用特权

评论回复
18
lzmm| | 2017-8-2 21:45 | 只看该作者
说明字符串没有停止。

使用特权

评论回复
19
minzisc| | 2017-8-2 21:45 | 只看该作者
楼主可以发送几位数据试试。

使用特权

评论回复
20
selongli| | 2017-8-2 21:45 | 只看该作者
是不是数据的发送速度有些快了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

500

帖子

0

粉丝