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

2019-07-31 18:38发布

本帖最后由 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, 下载次数: 344) 2012-6-23 17:02 上传 点击文件名下载附件



msp430和外设的端口连接如下:
截图.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
zoomone
1楼-- · 2019-07-31 20:04
本帖最后由 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 =' ';
  96.         while (!(IFG2 & UCA0TXIFG));
  97.                 UCA0TXBUF =' ';
  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 =' ';
  129.                     while (!(IFG2 & UCA0TXIFG));UCA0TXBUF =' ';
  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. }

复制代码
zzk0314
2楼-- · 2019-07-31 22:00
很强悍啊。。新手求教。。。能加QQ么。。604337991.。。。想学习下。。
chrishardy
3楼-- · 2019-08-01 01:17
CCS5.1 下载器是如何配置的啊? 我总是编译的时候报错呢!
li563897969
4楼-- · 2019-08-01 03:38
执拗的人没能改变世界,世界也没能改变执拗的人
zoomone
5楼-- · 2019-08-01 05:08
 精彩回答 2  元偷偷看……
apple_chen
6楼-- · 2019-08-01 06:43
应该是1602吧?1206还是头一回看到呢。

一周热门 更多>