『壹』 msp430g2553單片機控制蜂鳴器發出音樂的程序
看起來數組應該是音樂數據,其中包括四種數據,就是休止符(每個100毫秒)、歌曲結束符、音階(給出的是蜂鳴器的震盪周期)、一個音階持續的時間長度。如果你的晶振是12MHz,按照定時器中斷給Count加一來看,音階持續的時間應該是以10毫秒為單位。Play_Song函數要求給出參數i我的看法是這個i是指要播放第幾段樂曲,i*217表示每段樂曲都是217個位元組。本例中95數組只給出217個位元組,所以只有一段樂曲,播放時需要給出參數i=0.if(Temp1==0xFF)//休止符{TR0=0;Delay_xMs(100);}所以休止符每個固定是100毫秒。如果讀到第一個不是休止符或者結束符的位元組那就是音階,而下一個位元組就是這個音階的長度或者說節拍while(1){FMQ=~FMQ;Delay_xMs(Temp1);if(Temp2==Count){Count=0;break;}}這一段是說,如果當前音階的時間(Temp2次定時器中斷,由Count計時)還沒完,就每隔Temp1毫秒震動一次蜂鳴器,就形成一個震動頻率,這段時間就發出一定音調的樂音不過我也有疑惑,震盪周期如果以毫秒為單位恐怕只能發出次聲波,所以以上對有關Delay_xMs函數時間的估算都可能有問題907還得看Delay_xMs函數的具體定義才行。
『貳』 如何配置 msp430g2553 io口的 其他功能
一 I/O的簡介
1、各種復用和各種設置(可以作為簡單IO功能也可以作各種第二功能;可控制為輸入、輸出、接上拉電阻、接下拉電阻、接受中斷等各種情況);
2、IO口常用寄存器有:PXDIR、PXIN、PXOUT、PXREN、PXSEL、PXDS;其中,X可以是1~8,也可以是A~D,因為P1、P2可以合稱為PA。例如(PAREN=0x0480)就等價於(P2REN=0x04、P1REN=0x80)。
IO口中斷相關寄存器:PXIV、PXIFGX、PXIE、PXIES;由於IO中斷僅存在於P1口和P2口,因此X只能為1或2,而且不可以為A。
3、msp430f5529.h中定義了BIT0~BITF,方便用戶進行位操作。例如要設置P1.7和P2.2為輸入,代碼可如下:PADIR &= ~(BITA + BIT7)。
二 IO口常用寄存器配置
1、PxDIR,Px口方向寄存器
0 埠配置為輸入(默認)
1 埠配置為輸入
2、PxOUT,Px口輸出寄存器(輸入、輸出兩種模式)
當IO口配置為輸出模式時:
0 輸出低電平
1 輸出高電平
當IO口配置為輸入模式並且置高/ 置低使能時:
0置低
1置高
3、PxIN,Px 口輸入寄存器
只讀
4、PxREN,Px口置高/ 置低使能寄存器
0關閉置高/ 置低
1使能置高/ 置低
5、PxSEL,Px功能選擇寄存器(IO中斷只有在普通IO下才能使用)
0普通的I/O(默認)
1有連接外圍電路的特殊用途
6、PxDS,Px 口輸出驅動能力寄存器(我都是用的默認)
0減弱輸出驅動能力(默認)
1全力輸出驅動能力
三 普通IO使用舉例
說明:本常式是流水燈加按鍵控制,每次S1按下,便在等待S2按下,否則,所有LED一直閃爍。若無按鍵按下,則八盞燈以流水燈方式顯示。
#include <msp430f5529.h>
#define uint8_t unsigned char
#define uint16_t unsigned int
//********* 控制LED的IO口宏定義 *************
#define LED145678_PORT_DIR P1DIR
#define LED145678_PORT_OUT P1OUT
#define LED23_PORT_DIR P8DIR
#define LED23_PORT_OUT P8OUT
//************ LED的IO口宏定義 *************
#define LED1 0x01
#define LED2 0x02
#define LED3 0x04
#define LED4 0x08
#define LED5 0x10
#define LED6 0x20
#define LED7 0x40
#define LED8 0x80
#define LED_ALL 0xFF
//************ 按鍵的IO口宏定義 *************
#define BUTTON_S1 (P1IN & BIT7)
#define BUTTON_S2 (P2IN & BIT2)
//**********************************************************
//*函數: void delay(uint16_t x_ms)
//*功能: 延時程序
//*參數: x_ms(單位:ms)
//*返回: 無
//*備註: 無
//**********************************************************
void delay(uint16_t x_ms)
{
uint16_t i=0,j=0;
for(i=x_ms;i>0;i--)
for(j=110;j>0;j--);
}
//**********************************************************
//*函數: void LED_Init()
//*功能: LED的IO口方向初始化
//*參數: 無
//*返回: 無
//*備註: 無
//**********************************************************
void LED_Init()
{
LED145678_PORT_OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);
LED145678_PORT_DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;
LED23_PORT_OUT &= ~(BIT1 + BIT2);
LED23_PORT_DIR |= BIT1 + BIT2;
}
//**********************************************************
//*函數: void Board_ledOn(uint8_t ledMask)
//*功能: 打開輸入的那盞燈
//*參數: ledMask
//*返回: 無
//*備註: 無
//**********************************************************
void Board_ledOn(uint8_t ledMask)
{
if (ledMask & LED1) LED145678_PORT_OUT |= BIT0;
if (ledMask & LED2) LED23_PORT_OUT |= BIT1;
if (ledMask & LED3) LED23_PORT_OUT |= BIT2;
if (ledMask & LED4) LED145678_PORT_OUT |= BIT1;
if (ledMask & LED5) LED145678_PORT_OUT |= BIT2;
if (ledMask & LED6) LED145678_PORT_OUT |= BIT3;
if (ledMask & LED7) LED145678_PORT_OUT |= BIT4;
if (ledMask & LED8) LED145678_PORT_OUT |= BIT5;
}
//**********************************************************
//*函數: void Board_ledOff(uint8_t ledMask)
//*功能: 關閉輸入的那盞燈
//*參數: ledMask
//*返回: 無
//*備註: 無
//**********************************************************
void Board_ledOff(uint8_t ledMask)
{
if (ledMask & LED1) LED145678_PORT_OUT &= ~BIT0;
if (ledMask & LED2) LED23_PORT_OUT &= ~BIT1;
if (ledMask & LED3) LED23_PORT_OUT &= ~BIT2;
if (ledMask & LED4) LED145678_PORT_OUT &= ~BIT1;
if (ledMask & LED5) LED145678_PORT_OUT &= ~BIT2;
if (ledMask & LED6) LED145678_PORT_OUT &= ~BIT3;
if (ledMask & LED7) LED145678_PORT_OUT &= ~BIT4;
if (ledMask & LED8) LED145678_PORT_OUT &= ~BIT5;
}
//**********************************************************
//*函數: void Board_ledToggle(uint8_t ledMask)
//*功能: 輸入的那盞燈的狀態取反
//*參數: ledMask
//*返回: 無
//*備註: 無
//**********************************************************
void Board_ledToggle(uint8_t ledMask)
{
if (ledMask & LED1) LED145678_PORT_OUT ^= BIT0;
if (ledMask & LED2) LED23_PORT_OUT ^= BIT1;
if (ledMask & LED3) LED23_PORT_OUT ^= BIT2;
if (ledMask & LED4) LED145678_PORT_OUT ^= BIT1;
if (ledMask & LED5) LED145678_PORT_OUT ^= BIT2;
if (ledMask & LED6) LED145678_PORT_OUT ^= BIT3;
if (ledMask & LED7) LED145678_PORT_OUT ^= BIT4;
if (ledMask & LED8) LED145678_PORT_OUT ^= BIT5;
}
//**********************************************************
//*函數: void main(void)
//*功能: 主函數
//*參數: 無
//*返回: 無
//*備註: 無
//**********************************************************
void main(void)
{
uint8_t LED = LED1; //定義變數LED
WDTCTL = WDTPW | WDTHOLD; //關閉看門狗
LED_Init(); //初始化LED的IO口方向
PADIR &= ~(BITA + BIT7); //將按鍵的IO口方向設為輸入
PAREN |= (BITA + BIT7); //置高/ 置低使能
PAOUT |= (BITA + BIT7); //置高(類似於上拉)
while(1)
{
Board_ledOn(LED);
delay(1000); //延時1s左右
Board_ledOff(LED);
LED = LED << 1;
if(LED == 0x00) LED = LED1;
if(!BUTTON_S1)
{
delay(10); //消抖
if(!BUTTON_S1)
{
while(!BUTTON_S1);//等待S1釋放
while(BUTTON_S2) //等待S2按下
{
Board_ledToggle(LED_ALL);//所有LED狀態取反
delay(300);
}
Board_ledOff(LED_ALL);//關閉所有LED
}
}
}
}