原创 【TI博客大赛】学习launchpad做的小东西

2012-11-16 08:53 2091 10 11 分类: MCU/ 嵌入式

收到launchpad开发板后这几天一直学习msp430。本打算用m430g2553做个读SD卡的wav音乐播放器,因为以前在cortex-m3上做过,心想轻车熟路应该不难,但sd卡驱动和fatfs文件系统都加上后才发现,这么庞大的体积不是16k能装的下的。
于是,放弃了sd卡音乐播放器的计划,现在做的这个东西是通过pc上的串口终端控制单片机工作,按下电脑键盘1键:蜂鸣器播放一段音乐;按键2:音乐停止;按键3:测试环境温度并显示。显示方式为lcd1602和串口终端同步显示。虽然都是一些常见的单片机功能,但是充分利用了msp430内部资源。注意:launchpad开发板上的两个串口套帽原来是竖式插放的,后来发现要改成横式的才能正常和pc收发。即照开发板上文字提示的HW UART方式。
下面是一段演示视频:
http://player.youku.com/player.php/sid/XNDE4NDMzNzc2/v.swf


单片机 m430g2553
编程环境 CCS 5.1
蜂鸣器和lcd1602等外设用的手头的一块51开发板的外设
 

msp430和外设的端口连接如附图:
 

主文件代码:

#include 
#include "init.h"
#include "lcd.h"
/***************主函数****************/
void main(void)
{
    /*关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
      WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
    /*------选择系统主时钟为1MHz-------*/
    BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
    DCOCTL = CALDCO_1MHZ;
    /*各种初始化*/
     music_init();
     uart_init();
     temp_init();
     LCD_init();
   //打开全局中断
    _BIS_SR( GIE);
    send_string("请选择功能:  1,播放歌曲   2,歌曲停止 3,测温度"); //开机菜单
    while(1)
    {    Play_Song();    }
}

/*******************************************
定时器A的中断服务函数
********************************************/
#pragma vector = TIMER0_A0_VECTOR
__interrupt void TimerA_ISR(void)
{
    counter++;
    if(new)   {
                    if(new==1)
        {send_string("  歌曲开  曲名:《祝你平安》"); P1OUT|=BIT0;
            LCD_clear();    LCD_write_str(1,0,"music on ! ");
            delay_ms(250);
        }
          else        if(new==2)
        {send_string("  歌曲关 ")1OUT&=~BIT0;
        LCD_clear();
            LCD_write_str(1,0,"music off ! ");
            delay_ms(250);}
                    if(new==3)          temp_get();;
                    new=0;
            }
}


void Delay_Nms(uchar n)
{
    uchar i,j;
    for( i = 0;i < n; i++ )
    {
        for( j = 0;j < 3;j++ )              _NOP();
    }
}
/*******************************************
播放《祝你平安》的乐曲
********************************************/
void Play_Song(void)
{
    uchar Temp1,Temp2;
    uchar addr = 0;
    counter = 0; //中断计数器清0
    while(music_on==1)
    {            if(music_on==2)
                    break;
        Temp1 = SONG[addr++];
        if ( Temp1 == 0xFF )        //休止符
        {            TACTL &=~MC_1;          //停止计数
            Delay_Nms(100);
        }
        else if ( Temp1 == 0x00 )   //歌曲结束符
        {            return;       }
        else
        {         Temp2 = SONG[addr++];
            TACTL |=MC_1;           //开始计数
            while(music_on==1)
            {
                Buzzer_Port ^= Buzzer;
                Delay_Nms(Temp1);
                if ( Temp2 == counter )               {  
       counter = 0;
                    break;
                }
            }
        }
    }
}

void send_string(char *str)
{
        volatile char i=0;

        while(str)
        {while (!(IFG2 & UCA0TXIFG));
                UCA0TXBUF =str[i++];
                }        while (!(IFG2 & UCA0TXIFG));
                UCA0TXBUF ='\n';
        while (!(IFG2 & UCA0TXIFG));
                UCA0TXBUF ='\r';
}


//  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;// UCA0RXBUF;                    // TX -> RXed character
  if(UCA0RXBUF=='1')
          {music_on=1;new=music_on;}
  else if(UCA0RXBUF=='2')
          {music_on=2;new=music_on;}
  else if(UCA0RXBUF=='3')
          {music_on=3;new=music_on;}
}

void temp_get()
{
        if(music_on==3)
        {        music_on=0;
        ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
        }

}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
  // oC = ((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
            temp = ADC10MEM;
            IntDegC = ((temp - 673) * 423) / 1024;    //转化好的摄氏温度
            send_string(" 当前温度为:");
            UCA0TXBUF=ch[IntDegC/10];while (!(IFG2&UCA0TXIFG));   //串口终端显示
            UCA0TXBUF=ch[IntDegC%10];while (!(IFG2&UCA0TXIFG));
            while (!(IFG2 & UCA0TXIFG));UCA0TXBUF ='\n';
                    while (!(IFG2 & UCA0TXIFG));UCA0TXBUF ='\r';
                    LCD_clear();
                    LCD_write_str(1,0,"temperature is ");    //LCD1602显示
                    delay_ms(250);
                    LCD_write_char(6,1,ch[IntDegC/10]);
                    delay_ms(250);
                    LCD_write_char(7,1,ch[IntDegC%10]);

                    delay_ms(250);
                    LCD_write_char(9,1,'C');
                    delay_ms(250);
}


 

 

文章评论1条评论)

登录后参与讨论

wiliamzhou_446210705 2014-11-12 22:14

楼主,图看不到,求看图

用户1730221 2013-12-30 18:03

不错
相关推荐阅读
gaon 2014-12-14 14:13
[我与ROB的故事]机器人印象
对于机器人的了解,更多的来自于电影及小说中,由于这些的影响对于机器人的印象始终有人的影子,直到参加工作后,当人们对于一些移动装配臂及智能机械时才知道机器人有时并不是’人‘,或者说不象人。尽管仍然可...
gaon 2014-12-05 10:27
[智能手机]作为普通用户的感受和需求
自从智能手机面世以来,发展可谓迅速,众多的操作系统,不同的外观外形,越来越高的配置,,,,,, 发展到今天,仿佛又看到了PC以前的影子。核心处理器一家独大,操作系统几家分立。生产厂家在拼个性化,高...
gaon 2014-11-10 12:26
[废品拆解]让主机的USB口翻倍--坏的USBHUB再利用
电脑的主机通常有4-8个外接USB口(后置加前置),但由于外设产品越来越多的采用USB接口,感觉USB口越来越不够用了。 让我们先来数数这些东西;键盘,鼠标,打印机,摄象头,手机,读卡器,MP...
gaon 2014-10-31 10:09
[废品拆解] MP3拆解
前些年,买了个MP3,上班路上听听音乐,结果没几年,智能手机就让它没有了用武之地。放了两年没动,前些日子偶然翻了出来,试了一下,发现屏已经不亮了,决定拆开来看看。   型号,TL-x19+...
gaon 2012-11-30 09:32
【TI博客大赛】MSP430系列超低功耗单片机及应用
引 言    单片机的应用日趋广泛,对处理器的综合性能要求也越来越高。纵观单片机的发展,以应用需求为目标,市场越来越细化,充分突出以“单片”解决问题。单片机系统作为嵌入式系统的一部分,主要集中在中、低...
gaon 2012-11-21 10:08
【TI博客大赛】手把手教你使用TI MSP430 LaunchPad
可以参考一下,说的东西比较简单。   简易教程:基于IAR的LaunchPad开发入门   测试工程源码:LED1闪烁。  ...
我要评论
1
10
关闭 站长推荐上一条 /2 下一条