温度测量与通信系统设计
利用MSP430G2口袋实验平台(需焊接32.768kHz晶振并使用外部晶振)的相应模块,基于MSP430G2553 MCU,CCS6.2例程进行调试,实现以下功能:
(1)开机LCD先显示AA2019三秒,123456三秒,然后在LCD显示MCU芯片温度信息xx.x℃。
(2)同时与PC进行RS232通信,05作为握手信号(PC发送,MSP430实验平台接收),当握手信号正确时,蜂鸣器响一声(1000Hz、响2秒),回送温度给PC机,格式为“测量的温度为xx.x摄氏度”;不正确时蜂鸣器响三声(2000Hz、响1秒停1秒重复三次),回送字符串给PC机,格式为“序号是05”。
通信参数设置为:波特率4800bps,校验位N,数据位8,停止位1。
参考例程
(1) http://www.hpati.com/ay_source_download/action_download_116.html
5_Interrupt_Key_LED 中断按键(文献 [1] ch5)
7_2_Timer_Key_LED 定时查询按键(文献 [1] ch7)
8_1_TouchPad_LED 电容触摸按键(文献 [1] ch8)
10_UART_KeyBoard 串口键盘(文献 [1] ch10)
14_LCD_SelfScan_Hard_or_Soft_I2C LCD显示自检(文献 [1] ch14)
19_ADC10_Temperature 温度测量(文献 [1] ch19)
(2) http://www.ti.com/lit/sw/slac435f/slac435f.zip
MSP-EXP430G2 Software Examples (Rev. F)
cpp展开代码警告:由于G2 LaunchPad上的LED2使用了P1.6(I2C引脚),所以所有涉及到I2C的实验都必须把P1.6跳线拔除,包含本例程!
 *
 *
 * P1.1接串口模块的TX    P1.2接串口模块的RX
 *
 * 程序上电后显示 AA2019 三秒钟
 *
 * 然后显示123456 三秒钟
 *
 *
 * 然后进入温度的实时刷新,使用ADC10读取芯片内部温度传感器,换算成摄氏度显示
 *
 *
 * 串口4800,8位数据,1位停止
 * 接受到05时,返回温度数值,并且让蜂鸣器1000HZ响3秒钟
 *
 * 接收到的不是05,返回警告,并且让蜂鸣器响一秒停一秒,三次,2000HZ
cpp展开代码    //显示AA2019
    LCD_DisplayDigit(8, 1);
    LCD_DisplayDigit(8, 2);
    LCD_DisplayDigit(2, 3);
    LCD_DisplayDigit(0, 4);
    LCD_DisplayDigit(1, 5);
    LCD_DisplayDigit(9, 6);
    LCD_ClearSeg(4);
    LCD_ClearSeg(12);
    HT1621_Reflash(LCD_Buffer);
    TACTL = TASSEL_1 + MC_1 + TACLR; /* 打开定时器 */
    //等待3s
    delay_ms(3000);
    //显示123456
    LCD_DisplayDigit(1, 1);
    LCD_DisplayDigit(2, 2);
    LCD_DisplayDigit(3, 3);
    LCD_DisplayDigit(4, 4);
    LCD_DisplayDigit(5, 5);
    LCD_DisplayDigit(6, 6);
    HT1621_Reflash(LCD_Buffer);
    TACTL = TASSEL_1 + MC_1 + TACLR; /* 打开定时器 */
    //等待3s
    delay_ms(3000);
    /* 定时器0 检测按键的 */
    CCTL0 = CCIE;
    TACCR0 = 20000; /* 10MS */
    TACTL = TASSEL_2 + MC_0 + ID_3; //2MHZ
    _EINT();
    //初始化显示芯片内部温度
    dis_num_6(275);
    while (1)
    {
        if (ifg == 1)
        {
            ifg = 0;
            cycaaa = 2000; //响声2s
            while (cycaaa--)
            {
                //一个周期是6个数字给蜂鸣器  6个166us就是1ms  1000HZ的声音
                for (numasa = 0; numasa < 6; numasa++)
                {
                    write2DAC8411(Data[numasa]);
                    delay_us(166);
                }
            }
        }
        else if (ifg == 2)
        {
            for (xunhuan = 0; xunhuan < 3; xunhuan++)
            {
                cycaaa = 800; //响声1s应该是cycaaa=2000  太难听  适当减少点
                while (cycaaa--)
                {
                    //一个周期是6个数字给蜂鸣器  6个83us就是0.5ms  2000HZ的声音
                    for (numasa = 0; numasa < 6; numasa++)
                    {
                        write2DAC8411(Data[numasa]);
                        delay_us(83);
                    }
                }
                delay_ms(500); //停1s  适当减少了
            }
            ifg = 0;
        }
        init_ad_rxtx();
        //Print_Str("测量的温度为");
        ADC10CTL0 |= ENC + ADC10SC;                    //开始转换
        while (ADC10IFG == 0)
            ;       //等待 ADC10IFG 标志变高(转换完成)
        temp = ADC10MEM;
        IntDegC = (int) ((((float) temp - 673.0) / 1024.0) * 4230.0);
        if ((IntDegC < 1000) && (IntDegC > 0))
        {
            init_banzi();
            dis_num_6(IntDegC);
            init_ad_rxtx();
        }
        TACTL = TASSEL_1 + MC_1 + TACLR; /* 打开定时器 */
        LPM0;
    }
}
/* Timer A0 interrupt service routine */
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A(void)
{
    //正常刷新温度
    time_c++;
    if (time_c == 10)
    {
        time_c = 0;
        TACTL = TASSEL_1 + MC_0 + TACLR; /* 停下时钟 */
        //bofang(); /* 播放嘟 */
        LPM0_EXIT;
    }
}
char xianshia[6];
char count_xianshia = 0;
//  Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
    //while (!(IFG2 & UCA0TXIFG))
    //    ;                // USCI_A0 TX buffer ready?
    //UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
    if (UCA0RXBUF == 0x05)
    {
        count_xianshia = 0;
        xianshia[count_xianshia++] = IntDegC % 1000 / 100 + '0';
        xianshia[count_xianshia++] = IntDegC % 100 / 10 + '0';
        xianshia[count_xianshia++] = '.';
        xianshia[count_xianshia++] = IntDegC % 10 + '0';
        xianshia[count_xianshia++] = 0;
        Print_Str("测量的温度为");
        Print_Str(xianshia);
        Print_Str("摄氏度\r\n");
        ifg = 1;    //控制蜂鸣器
    }
    else
    {
        Print_Str("序号是05\r\n");
        ifg = 2;    //控制蜂鸣器
    }
}
cpp展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!