用MSP430 内置传感器测试温度时为什么在串口上显示的数据不对

2019-03-24 14:09发布

我想用430内置传感器测试环境温度的变化,但是为什么在串口上现实的数据不变化呢 ?哪位高人给指点下,下面的程序有什么错误啊?    
  1. #include <msp430x14x.h>
    #define CPU_F ((double)8000000)
    #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
    #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

    #define uchar unsigned char
    #define uint unsigned int
    #define ulong unsigned long

    /*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/
    #define baud 9600 //设置波特率的大小
    #define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率计算公式
    #define baud_h (uchar)(baud_setting>>8) //提取高位
    #define baud_l (uchar)(baud_setting) //低位
    int long temp;
    int long sum;
    int count_f=0;
    uchar int_f;
    //*************************************************************************
    // 系统时钟初始化
    //*************************************************************************
    void Clock_Init()
    {
    uchar i;
    BCSCTL1&=~XT2OFF; //打开XT振荡器
    BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
    do{
    IFG1&=~OFIFG; //清除震荡标志
    for(i=0;i<100;i++)
    _NOP(); //延时等待
    }
    while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
    IFG1&=~OFIFG;
    }//*************************************************************************
    // MSP430串口初始化
    //*************************************************************************
    void UART_Init()
    {
    U1CTL|=SWRST; //复位SWRST
    U1CTL|=CHAR; //8位数据模式
    U1TCTL|=SSEL1; //SMCLK为串口时钟
    U1BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
    U1BR0=baud_l; //N=UBR+(UxMCTL)/8
    U1MCTL=0x00; //微调寄存器为0,波特率9600bps
    ME2|=UTXE1; //UART1发送使能
    ME2|=URXE1; //UART1接收使能
    U1CTL&=~SWRST;
    IE2|=URXIE1; //接收中断使能位
    P3SEL|= BIT6; //设置IO口为特殊功能模块
    P3DIR|= BIT6; //设置P3.4为输入,P3.5为输出口
    P3SEL|= BIT7; //设置IO口为外围功能模块

    }

    //*************************************************************************
    // 串口1发送数据函数
    //*************************************************************************
    void Send_Byte(uchar data)
    {
    U1TXBUF=data;
    while ((IFG2 & UTXIFG1)==0);
    }

    //*************************************************************************
    // 处理来自串口1的发送中断,预留
    //*************************************************************************

    #pragma vector=UART1TX_VECTOR
    __interrupt void UART1_TX_ISR(void)
    {

    }

    //************主函数*********************************************************//
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    UART_Init();
    Clock_Init();
    ADC12CTL0 = SHT0_8 + REFON + ADC12ON;
    ADC12CTL1 = SHP; // enable sample timer
    ADC12MCTL0 = SREF_1 + INCH_10;
    ADC12CTL1 |= CSTARTADD_10; //定义单次转换地址
    ADC12IE = 0x001;
    ADC12CTL0 |= ENC;
    CCR0=32768;
    CCTL0=CCIE;
    TACTL = TASSEL_1+MC_1+TAIE; //timerA CLK=ACLK,增计数模式
    // _EINT(); //开总中断
    while(1)
    {
    ADC12CTL0 |= ADC12SC; // Sampling and conversion start
    // while((ADC12IFG & BITA)==0);
    _BIS_SR(LPM0_bits + GIE); // LPM0 with interrupts enabled
    }
    }
    //*********************TimerA0中断服务程序*************************************//
    #pragma vector=TIMERA0_VECTOR
    __interrupt void Timer_a(void)
    {
    if(count_f<10)
    {
    temp = ADC12MEM0;
    sum+=temp;
    sum/=2;
    count_f++;
    Send_Byte(sum);
    _BIC_SR_IRQ(CPUOFF);

    }
    }
    //**************ADC中断函数***************************************************//
    #pragma vector=ADC12_VECTOR
    __interrupt void ADC12ISR (void)
    {
    }
复制代码 此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章