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

[复制链接]
 楼主| 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开发板的外设



源码如下:



msp430和外设的端口连接如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 1威望 +1 收起 理由
tianm + 1

查看全部评分

 楼主| zoomone 发表于 2012-6-23 17:05 | 显示全部楼层
本帖最后由 zoomone 于 2012-6-24 22:01 编辑

主文件代码如下:

  1. #include  <msp430.h>
  2. #include "init.h"
  3. #include "lcd.h"
  4. /***************主函数****************/
  5. void main(void)
  6. {
  7.     /*关闭所有的IO口*/
  8.     P1DIR = 0XFF;P1OUT = 0XFF;
  9.     P2DIR = 0XFF;P2OUT = 0XFF;
  10.       WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
  11.     /*------选择系统主时钟为1MHz-------*/
  12.     BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  13.     DCOCTL = CALDCO_1MHZ;
  14.     /*各种初始化*/
  15.      music_init();
  16.      uart_init();
  17.      temp_init();
  18.      LCD_init();
  19.    //打开全局中断
  20.     _BIS_SR( GIE);
  21.     send_string("请选择功能:  1,播放歌曲   2,歌曲停止 3,测温度"); //开机菜单
  22.     while(1)
  23.     {    Play_Song();    }
  24. }

  25. /*******************************************
  26. 定时器A的中断服务函数
  27. ********************************************/
  28. #pragma vector = TIMER0_A0_VECTOR
  29. __interrupt void TimerA_ISR(void)
  30. {
  31.     counter++;
  32.     if(new)   {
  33.                     if(new==1)
  34.         {send_string("  歌曲开  曲名:《祝你平安》"); P1OUT|=BIT0;
  35.             LCD_clear();    LCD_write_str(1,0,"music on ! ");
  36.             delay_ms(250);
  37.         }
  38.           else        if(new==2)
  39.         {send_string("  歌曲关 ")1OUT&=~BIT0;
  40.         LCD_clear();
  41.             LCD_write_str(1,0,"music off ! ");
  42.             delay_ms(250);}
  43.                     if(new==3)          temp_get();;
  44.                     new=0;
  45.             }
  46. }


  47. void Delay_Nms(uchar n)
  48. {
  49.     uchar i,j;
  50.     for( i = 0;i < n; i++ )
  51.     {
  52.         for( j = 0;j < 3;j++ )              _NOP();
  53.     }
  54. }
  55. /*******************************************
  56. 播放《祝你平安》的乐曲
  57. ********************************************/
  58. void Play_Song(void)
  59. {
  60.     uchar Temp1,Temp2;
  61.     uchar addr = 0;
  62.     counter = 0; //中断计数器清0
  63.     while(music_on==1)
  64.     {            if(music_on==2)
  65.                     break;
  66.         Temp1 = SONG[addr++];
  67.         if ( Temp1 == 0xFF )        //休止符
  68.         {            TACTL &=~MC_1;          //停止计数
  69.             Delay_Nms(100);
  70.         }
  71.         else if ( Temp1 == 0x00 )   //歌曲结束符
  72.         {            return;       }
  73.         else
  74.         {         Temp2 = SONG[addr++];
  75.             TACTL |=MC_1;           //开始计数
  76.             while(music_on==1)
  77.             {
  78.                 Buzzer_Port ^= Buzzer;
  79.                 Delay_Nms(Temp1);
  80.                 if ( Temp2 == counter )               {   
  81.        counter = 0;
  82.                     break;
  83.                 }
  84.             }
  85.         }
  86.     }
  87. }

  88. void send_string(char *str)
  89. {
  90.         volatile char i=0;

  91.         while(str)
  92.         {while (!(IFG2 & UCA0TXIFG));
  93.                 UCA0TXBUF =str[i++];
  94.                 }        while (!(IFG2 & UCA0TXIFG));
  95.                 UCA0TXBUF ='\n';
  96.         while (!(IFG2 & UCA0TXIFG));
  97.                 UCA0TXBUF ='\r';
  98. }


  99. //  Echo back RXed character, confirm TX buffer is ready first
  100. #pragma vector=USCIAB0RX_VECTOR
  101. __interrupt void USCI0RX_ISR(void)
  102. {

  103.   while (!(IFG2&UCA0TXIFG));                // USCI_A0 TX buffer ready?
  104.   UCA0TXBUF =UCA0RXBUF;// UCA0RXBUF;                    // TX -> RXed character
  105.   if(UCA0RXBUF=='1')
  106.           {music_on=1;new=music_on;}
  107.   else if(UCA0RXBUF=='2')
  108.           {music_on=2;new=music_on;}
  109.   else if(UCA0RXBUF=='3')
  110.           {music_on=3;new=music_on;}
  111. }

  112. void temp_get()
  113. {
  114.         if(music_on==3)
  115.         {        music_on=0;
  116.         ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
  117.         }

  118. }

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

  136.                     delay_ms(250);
  137.                     LCD_write_char(9,1,'C');
  138.                     delay_ms(250);
  139. }

评论

中断里边 尽然延时250ms ,程序有待改进。  发表于 2012-12-2 17:00
zzk0314 发表于 2012-6-23 20:48 | 显示全部楼层
很强悍啊。。新手求教。。。能加QQ么。。604337991.。。。想学习下。。
chrishardy 发表于 2012-6-24 09:08 | 显示全部楼层
CCS5.1 下载器是如何配置的啊? 我总是编译的时候报错呢!
li563897969 发表于 2012-6-24 14:38 | 显示全部楼层
执拗的人没能改变世界,世界也没能改变执拗的人
 楼主| zoomone 发表于 2012-6-24 21:48 | 显示全部楼层
CCS5.1 下载器是如何配置的啊? 我总是编译的时候报错呢!
chrishardy 发表于 2012-6-24 09:08

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
apple_chen 发表于 2012-6-25 07:51 | 显示全部楼层
应该是1602吧?1206还是头一回看到呢。
5509 发表于 2012-6-25 09:14 | 显示全部楼层
LZ的钻研精神值得学习
gaoyang9992006 发表于 2012-6-25 09:33 | 显示全部楼层
楼主加油
shenmu2012 发表于 2012-6-25 11:46 | 显示全部楼层
楼主精神值得学习啊
 楼主| zoomone 发表于 2012-6-25 22:04 | 显示全部楼层
应该是1602吧?1206还是头一回看到呢。
apple_chen 发表于 2012-6-25 07:51


哈哈 又丢人了 这液晶应该是去年买51开发板带的,就搞51实验时候学习了一下,一年没动了 名都叫错了 :lol
Rancho13502 发表于 2012-6-26 07:50 | 显示全部楼层
是要顶一下
lhe881023 发表于 2012-6-26 15:49 | 显示全部楼层
顶顶顶
taobao96 发表于 2012-7-11 19:25 | 显示全部楼层
呵呵!!我也想照葫芦画瓢玩玩,也是前两天收到的板子,希望多多交流呀!!
taobao96 发表于 2012-7-11 20:57 | 显示全部楼层
你好!有几个问题需要请教一下:
1:请问串口终端是款什么软件呢?
2:由于目前我没有1062,我能否先实现蜂鸣器的音乐播放呢?(51单片机开发板上的蜂鸣器)

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

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


1、如果是xp就直接用系统自带的超级终端,因为win7没有超级终端,所以我用的SecureCRT。
2、可以
wangchu426 发表于 2012-7-12 09:54 | 显示全部楼层
还没入手板子,开发环境只能有你的这个么?
 楼主| zoomone 发表于 2012-7-12 21:46 | 显示全部楼层
还没入手板子,开发环境只能有你的这个么?
wangchu426 发表于 2012-7-12 09:54


还有 IAR for msp430
江枫渔火 发表于 2012-7-13 14:37 | 显示全部楼层
模拟MIDI的音乐是怎么弄的呢?
yytpy2008 发表于 2012-7-13 18:58 | 显示全部楼层
音乐是怎么弄的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

370

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

3

主题

370

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部