打印

做个小东西总结一下几天来launchpad的学习

[复制链接]
14104|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zoomone|  楼主 | 2012-6-23 17:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zoomone 于 2012-6-25 22:09 编辑

收到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开发板的外设



源码如下: launchpad.zip (34.64 KB)



msp430和外设的端口连接如下:
评分
参与人数 1威望 +1 收起 理由
tianm + 1

相关帖子

沙发
zoomone|  楼主 | 2012-6-23 17:05 | 只看该作者
本帖最后由 zoomone 于 2012-6-24 22:01 编辑

主文件代码如下:

#include  <msp430.h>
#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);
}

使用特权

评论回复
评论
dong_abc 2012-12-2 17:00 回复TA
中断里边 尽然延时250ms ,程序有待改进。 
板凳
zzk0314| | 2012-6-23 20:48 | 只看该作者
很强悍啊。。新手求教。。。能加QQ么。。604337991.。。。想学习下。。

使用特权

评论回复
地板
chrishardy| | 2012-6-24 09:08 | 只看该作者
CCS5.1 下载器是如何配置的啊? 我总是编译的时候报错呢!

使用特权

评论回复
5
li563897969| | 2012-6-24 14:38 | 只看该作者
执拗的人没能改变世界,世界也没能改变执拗的人

使用特权

评论回复
6
zoomone|  楼主 | 2012-6-24 21:48 | 只看该作者
CCS5.1 下载器是如何配置的啊? 我总是编译的时候报错呢!
chrishardy 发表于 2012-6-24 09:08

创建项目的时候有个选择单片机的型号的步骤,只要这个型号选对了其他默认就行了。。。 不知道你错误的提示是什么样的?

使用特权

评论回复
7
apple_chen| | 2012-6-25 07:51 | 只看该作者
应该是1602吧?1206还是头一回看到呢。

使用特权

评论回复
8
5509| | 2012-6-25 09:14 | 只看该作者
LZ的钻研精神值得学习

使用特权

评论回复
9
gaoyang9992006| | 2012-6-25 09:33 | 只看该作者
楼主加油

使用特权

评论回复
10
shenmu2012| | 2012-6-25 11:46 | 只看该作者
楼主精神值得学习啊

使用特权

评论回复
11
zoomone|  楼主 | 2012-6-25 22:04 | 只看该作者
应该是1602吧?1206还是头一回看到呢。
apple_chen 发表于 2012-6-25 07:51


哈哈 又丢人了 这液晶应该是去年买51开发板带的,就搞51实验时候学习了一下,一年没动了 名都叫错了 :lol

使用特权

评论回复
12
Rancho13502| | 2012-6-26 07:50 | 只看该作者
是要顶一下

使用特权

评论回复
13
lhe881023| | 2012-6-26 15:49 | 只看该作者
顶顶顶

使用特权

评论回复
14
taobao96| | 2012-7-11 19:25 | 只看该作者
呵呵!!我也想照葫芦画瓢玩玩,也是前两天收到的板子,希望多多交流呀!!

使用特权

评论回复
15
taobao96| | 2012-7-11 20:57 | 只看该作者
你好!有几个问题需要请教一下:
1:请问串口终端是款什么软件呢?
2:由于目前我没有1062,我能否先实现蜂鸣器的音乐播放呢?(51单片机开发板上的蜂鸣器)

谢谢!!

使用特权

评论回复
16
zoomone|  楼主 | 2012-7-12 08:54 | 只看该作者
你好!有几个问题需要请教一下:
1:请问串口终端是款什么软件呢?
2:由于目前我没有1062,我能否先实现蜂鸣器的音乐播放呢?(51单片机开发板上的蜂鸣器)

谢谢!! ...
taobao96 发表于 2012-7-11 20:57


1、如果是xp就直接用系统自带的超级终端,因为win7没有超级终端,所以我用的SecureCRT。
2、可以

使用特权

评论回复
17
wangchu426| | 2012-7-12 09:54 | 只看该作者
还没入手板子,开发环境只能有你的这个么?

使用特权

评论回复
18
zoomone|  楼主 | 2012-7-12 21:46 | 只看该作者
还没入手板子,开发环境只能有你的这个么?
wangchu426 发表于 2012-7-12 09:54


还有 IAR for msp430

使用特权

评论回复
19
江枫渔火| | 2012-7-13 14:37 | 只看该作者
模拟MIDI的音乐是怎么弄的呢?

使用特权

评论回复
20
yytpy2008| | 2012-7-13 18:58 | 只看该作者
音乐是怎么弄的

使用特权

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

本版积分规则

3

主题

370

帖子

2

粉丝