本帖最后由 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和外设的端口连接如下:
主文件代码如下:
- #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 ='
';
- while (!(IFG2 & UCA0TXIFG));
- UCA0TXBUF ='
';
- }
- // 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 ='
';
- while (!(IFG2 & UCA0TXIFG));UCA0TXBUF ='
';
- 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);
- }
复制代码一周热门 更多>