MSP430F249的IO端口_第1頁(yè)
MSP430F249的IO端口_第2頁(yè)
MSP430F249的IO端口_第3頁(yè)
MSP430F249的IO端口_第4頁(yè)
MSP430F249的IO端口_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第3章 MSP430單片機(jī)通用I/O接口I/O口是單片機(jī)控制系統(tǒng)對(duì)外溝通的最基本部件,從基本的鍵盤、LED 顯示到復(fù)雜的外設(shè)芯片等,都是通過(guò)I/O口的輸入、輸出操作來(lái)進(jìn)行讀取或控制的。為滿足單片機(jī)系統(tǒng)對(duì)外部設(shè)備控制的需要,MSP430提供了許多功能強(qiáng)大、使用方便靈活的輸入/輸出接口。一般來(lái)說(shuō),MSP430單片機(jī)的I/O口可分為以下幾種: (1)通用數(shù)字I/O口。用于外部電路數(shù)字邏輯信號(hào)的輸入和輸出。(2)并行總線輸入/輸出端口。用于外部擴(kuò)展需要并行接口的存儲(chǔ)器等芯片。一般包括數(shù)據(jù)總線、地址總線和包括讀寫控制信號(hào)的控制總線等。(3)片內(nèi)設(shè)備的輸入/輸出端口。如:定時(shí)器/計(jì)數(shù)器的計(jì)數(shù)脈沖輸入,外部

2、中斷源信號(hào)的輸入等,A/D輸入、D/A輸出接口,模擬比較輸入端口,脈寬調(diào)制(PWM)輸出端口等。有的單片機(jī)還將LCD液晶顯示器的接口也集成到單片機(jī)。(4)串行通信接口。用于計(jì)算機(jī)之間或者計(jì)算機(jī)和通信接口芯片之間數(shù)據(jù)交換。如:異步串行接口(RS-232、RS-485),I2C串行接口,SPI串行接口,USB串行口等。為了減少芯片引腳的數(shù)量以降低芯片的成本,又提供更多功能的I/O口,現(xiàn)在許多單片機(jī)都采用了I/O口復(fù)用技術(shù),即端口可作為通用的I/O口使用,也可作為某個(gè)特殊功能的端口使用,用戶可根據(jù)系統(tǒng)的實(shí)際需要來(lái)定義使用。這樣就為設(shè)計(jì)開發(fā)提供了方便,簡(jiǎn)化了單片機(jī)系統(tǒng)的硬件設(shè)計(jì)工作。在MSP430系列

3、中,不同單片機(jī)擁有的I/O口數(shù)目不同,引腳最少的MSP430F20XX只有10個(gè)可用I/O口,而功能更豐富的MSP430FG46XX擁有多達(dá)80個(gè)I/O口。 MSP430F249單片機(jī)有6組I/O口:P1P6。每組I/O口都有8個(gè)可以獨(dú)立編程的引腳,例如P1口有8個(gè)可編程引腳,為P1.0P1.7。所有這些 I/O 口都是雙功能(有的為3功能)復(fù)用的。其中第一功能均作為數(shù)字通用 I/O 接口使用,而復(fù)用功能則分別用于中斷、時(shí)鐘/計(jì)數(shù)器、USCI、比較器等應(yīng)用。這些 I/O 口同外圍電路構(gòu)成單片機(jī)系統(tǒng)的人機(jī)接口和數(shù)據(jù)通信接口。MSP430F249單片機(jī)的I/O口主要有以下特征:(1) 每個(gè)I/O口

4、可以獨(dú)立編程設(shè)置。(2) 輸入、輸出功能可以任意結(jié)合使用。(3) P1和P2口具有中斷功能,可以單獨(dú)設(shè)置成上升沿或下降沿觸發(fā)中斷。(4)有獨(dú)立的輸入/輸出寄存器。3.1通用 I/O接口MSP430F249單片機(jī)的每組I/O口都有4個(gè)控制寄存器,分別為方向控制寄存器 PxDIR、輸入寄存器 PxIN、輸出寄存器PxOUT和功能選擇寄存器PxSEL,此處,小寫字母“x”表示6組I/O口的數(shù)字序號(hào),x= 16,即P1口的方向控制寄存器為P1DIR,P6口的方向控制寄存器為P6DIR。另外,P1和P2口還具有3個(gè)中斷寄存器,分別為中斷允許寄存器PxIE、中斷沿選擇寄存器PxIES和中斷標(biāo)志寄存器PxI

5、FG,此處,x= 12。1、方向控制寄存器 PxDIR該寄存器控制Px口的各個(gè)引腳的方向。設(shè)置相應(yīng)的比特位(bit)為1時(shí),相對(duì)應(yīng)的引腳為輸出;設(shè)置相應(yīng)的bit為0時(shí),則對(duì)應(yīng)的引腳為輸入。PxDIR寄存器復(fù)位時(shí)初始值全部輸入為0。PxDIR寄存器的比特分配如下所示:PxDIR.7PxDIR.6PxDIR.5PxDIR.4PxDIR.3PxDIR.2PxDIR.1PxDIR.0可以看出,Px口的每個(gè)引腳都可以單獨(dú)配置成輸入或者輸出方向的控制。需要注意的是:MSP430系列單片機(jī)端口輸出電流最大為6mA,當(dāng)需要驅(qū)動(dòng)比較大的負(fù)載的時(shí)候,需要利用三極管或者緩沖器來(lái)提高端口的驅(qū)動(dòng)能力。MSP430 單片

6、機(jī)的 I/O口為雙向I/O口,因此在使用 I/O口前首先要用方向選擇寄存器來(lái)設(shè)置每個(gè) I/O 口的方向,在程序運(yùn)行中還可以動(dòng)態(tài)改變I/O口的方向。例如P1.0、P1.1、P1.2接有按鍵,P1.4、P1.5、P1.6接有 LED,通用I/O接口應(yīng)用示例如圖3.1所示。圖3.1 通用I/O接口應(yīng)用示例圖 其中按鍵為輸入設(shè)備,按鍵未按下時(shí),電阻R4、R5、R6將端口P1.0、P1.1、P1.2上拉到高電平,按鍵按下時(shí),按鍵將對(duì)應(yīng)的端口短路到地。P1.0、P1.1、P1.2要設(shè)為輸入,P1.4、P1.5、P1.6外接發(fā)光二極管,要設(shè)置為輸出。程序如下: #define BIT0 (0x0001)#d

7、efine BIT1 (0x0002)#define BIT2 (0x0004)#define BIT3 (0x0008)#define BIT4 (0x0010)#define BIT5 (0x0020)#define BIT6 (0x0040)#define BIT7 (0x0080)P1DIR |= BIT4+BIT5 +BIT6; / P1.4、P1.5、P1.6設(shè)為輸出 P1DIR &= (BIT0+BIT1+BIT2); / P1.0、P1.1、P1.2設(shè)為輸入(可省略) 其中BIT0BIT7為宏定義,P1DIR |= BIT4+BIT5 +BIT6是將P1DIR寄存器的第

8、4、5、6比特位置1,即配置為輸出;P1DIR &= (BIT0+BIT1+BIT2)是將P1DIR寄存器的第0、1、2比特位置0,即配置為輸入。由于 PxDIR 寄存器在復(fù)位過(guò)程中會(huì)被清 0,沒(méi)有被設(shè)置的 I/O 口方向均為輸入狀態(tài),因此第二句可以被省略。對(duì)于所有已經(jīng)設(shè)成輸出狀態(tài)的I/O口,可以通過(guò) PxOUT寄存器設(shè)置其輸出電平。 2、輸入寄存器 PxIN在輸入的模式下,讀取該寄存器的相應(yīng)比特來(lái)獲得相應(yīng)引腳上的數(shù)據(jù)。在輸入模式下,當(dāng)I/O口相應(yīng)輸入高電平時(shí),該寄存器相應(yīng)的比特為1;當(dāng)I/O口相應(yīng)輸入低電平時(shí),該寄存器相應(yīng)的比特則為0。PxIN寄存器的比特分配如下所示:PxIN.7P

9、xIN.6PxIN.5PxIN.4PxIN.3PxIN.2PxIN.1PxIN.0 該寄存器為只讀寄存器,寫無(wú)效。其每個(gè)比特可以單獨(dú)讀取,從而獲得相應(yīng)引腳上的輸入數(shù)據(jù)或者引腳的狀態(tài)。 3、輸出寄存器PxOUT 在輸出模式下,如果該寄存器的相應(yīng)比特設(shè)置為1時(shí),相應(yīng)的引腳輸出為高電平;如果設(shè)置該寄存器的相應(yīng)比特為0時(shí),則相應(yīng)的引腳輸出低電平。PxOUT寄存器的比特分配如下所示:PxOUT.7Px OUT.6PxOUT.5Px OUT.4PxOUT.3Px OUT.2Px OUT.1PxOUT.0值得注意的是:PxOUT復(fù)位時(shí)其值不確定,在使用過(guò)程中應(yīng)該先使PxOUT的值確定以后才設(shè)置方向控制寄存器

10、。對(duì)于所有已經(jīng)被設(shè)成輸入狀態(tài)的I/O 口,可以通過(guò) PxIN 寄存器讀回其輸入電平。例如讀回 P1.0口上所接按鍵的開關(guān)狀態(tài),若處于按下狀態(tài)(低電平),則從 P1.4口輸出低電平點(diǎn)亮 LED,程序如下:P1OUT = BIT4+BIT5 +BIT6; / P1.4P1.6輸出高電平/ 二極管陽(yáng)極接高電平,二極管不發(fā)光if(P1IN & BIT0) = 0) P1OUT |= BIT4; /P1.4輸出低電平點(diǎn)亮LED 4、功能選擇寄存器PxSEL 用于設(shè)置Px口的每一個(gè)引腳作為一般I/O口使用還是作為外圍模塊的功能使用。當(dāng)該寄存器的相應(yīng)比特設(shè)置為1時(shí),其對(duì)應(yīng)的引腳為外圍模塊的功能,即第

11、二功能,具體每個(gè)端口的第二功能請(qǐng)參考芯片手冊(cè)。當(dāng)該寄存器的相應(yīng)比特設(shè)置為0時(shí),其對(duì)應(yīng)的引腳為一般I/O口。PxSEL寄存器的比特分配如下所示。其復(fù)位值全為0,默認(rèn)為I/O口功能。PxSEL.7PxSEL.6PxSEL.5PxSEL.4PxSEL.3PxSEL.2PxSEL.1PxSEL.0在MSP430F249單片機(jī)中,很多內(nèi)部功能模塊也需要和外界進(jìn)行數(shù)據(jù)交換,為了不增加芯片引腳數(shù)量,大部分都和I/O口復(fù)用引腳,導(dǎo)致MSP430F249單片機(jī)的所有I/O口都具有第二功能。通過(guò)寄存器PxSEL可以設(shè)置某些I/O口作為第二功能使用。例如從MSP430F249芯片手冊(cè)中可以查到,MSP430x249

12、 系列單片機(jī)的 P3.4、P3.5 口的第二功能為串行口的 TXD、RXD。若需要將這兩個(gè)引腳配置為串口收發(fā)引腳,則須將P3SEL的 第4、5比特位置高,程序如下:P3SEL |= BIT4 + BIT5; / P3.4,、P3.5 設(shè)為串口收發(fā)引腳5、 中斷允許寄存器PxIE該寄存器控制P1、P2口的中斷允許。設(shè)置相應(yīng)的比特為1,則對(duì)應(yīng)的引腳允許中斷功能;如果設(shè)置相應(yīng)的比特為0,則對(duì)應(yīng)的引腳不允許中斷功能。寄存器的比特分配如下所示。其復(fù)位值全為0,默認(rèn)為不允許中斷。PxIE.7PxIE.6PxIE.5Px IE.4Px IE.3PxIE.2PxIE.1Px IE.0 6、中斷沿選擇寄存器Px

13、IES 控制P1、P2口的中斷觸發(fā)沿選擇。如果設(shè)置相應(yīng)的比特為1,則其對(duì)應(yīng)的引腳選擇下降沿觸發(fā)中斷方式;如果設(shè)置相應(yīng)的比特為0,則其對(duì)應(yīng)的引腳選擇上升沿觸發(fā)中斷方式。PxIES寄存器的比特分配如下所示。其復(fù)位值全為0,默認(rèn)為上升沿觸發(fā)中斷。PxIES.7Px IES.6Px IES.5Px IES.4Px IES.3PxIES.2PxIES.1Px IES.0 在使用I/O口中斷之前,需要先將I/O口設(shè)置為輸入狀態(tài),并允許該比特位的中斷,再通過(guò)PxIES寄存器選擇觸發(fā)沿方式為上升沿觸發(fā)或者下降沿觸發(fā)。例如將 P1.0、P1.1、P1.2口設(shè)為外部中斷源,P1.0為上升沿觸發(fā),P1.1、P1.2

14、下降沿觸發(fā),程序設(shè)計(jì)如下:P1DIR &=(BIT0 + BIT1 + BIT2); / P1.0、P1.1、P1.2設(shè)為輸入P1IES |= BIT1 + BIT2 ; / P1.0為上升沿觸發(fā)、P1.1、P1.2設(shè)為下降沿中斷 P1IE |= BIT0 + BIT1+ BIT2; / 允許P1.5、P1.6、P1.7中斷 _EINT( ); / 總中斷允許7、中斷標(biāo)志寄存器PxIFG 如果P1、P2口相應(yīng)的比特為1,則該位對(duì)應(yīng)的引腳有外部中斷產(chǎn)生;若相應(yīng)的比特為0,則其對(duì)應(yīng)的引腳沒(méi)有外部中斷產(chǎn)生。 PxIFG寄存器的比特分配如下所示。其復(fù)位值全為0,默認(rèn)為未發(fā)生中斷。PxIFG.7

15、PxIFG.6PxIFG.5PxIFG.4PxIFG.3PxIFG.2PxIFG.1PxIFG.0 無(wú)論中斷是否被允許,也無(wú)論是否正在執(zhí)行中斷程序,只要對(duì)應(yīng)的I/O口滿足中斷條件(如一個(gè)下降沿觸發(fā)),PxIFG中的相應(yīng)比特都會(huì)立即置1并保持,必須通過(guò)軟件復(fù)位將其清零,最大可能的保證不會(huì)漏掉每一次中斷。在 MSP430系列單片機(jī)中,P1口的8個(gè)中斷和P2口的8個(gè)中斷各公用了一個(gè)中斷入口,當(dāng)引腳中斷功能打開后,外部輸入的變化會(huì)使得PxIFG對(duì)應(yīng)的比特位置1。當(dāng)有多個(gè)引腳產(chǎn)生中斷時(shí),可以通過(guò)查詢?cè)摷拇嫫髟谥袛喾?wù)程序中用于判斷哪一位 I/O 口產(chǎn)生的中斷。下面的中斷服務(wù)程序示范P1.0、P1.1、P

16、1.2 發(fā)生中斷后將P1.4、P1.5、P1.6的LED點(diǎn)亮。 #pragma vector = PORT1_VECTOR /P1口中斷源 _interrupt void PORT1_ISR(void) /聲明一個(gè)中斷服務(wù)程序,名為PORT1_ISR() if(P1IFG & BIT0) /判斷P1中斷標(biāo)志第0位 P1OUT = BIT4; /P1.4的LED點(diǎn)亮,其他LED熄滅 if(P1IFG & BIT1) /判斷P1中斷標(biāo)志第1位 P1OUT = BIT5; /P1.4的LED點(diǎn)亮,其他LED熄滅 if(P1IFG & BIT2) /判斷P1中斷標(biāo)志第2位 P1

17、OUT = BIT6; /P1.6的LED點(diǎn)亮,其他LED熄滅 P1IFG=0; /清除P1所有中斷標(biāo)志位 以上點(diǎn)亮LED的程序?yàn)镻1OUT = BIT6,而沒(méi)有用P1OUT &= BIT6,原因是P1OUT &= BIT6只會(huì)影響到P1.6,其他引腳狀態(tài)不變。當(dāng)三個(gè)按鍵都按過(guò)后,三個(gè)LED都會(huì)被點(diǎn)亮,按鍵將對(duì)LED不起控制作用。另外在程序退出中斷前一定要軟件清除中斷標(biāo)志,程序中語(yǔ)句為P1IFG = 0,否則由于該中斷標(biāo)志位保持為1,中斷退出后又會(huì)引發(fā)另外一次相同的中斷,中斷就會(huì)不停發(fā)生。類似的原理,即使 I/O 口沒(méi)有出現(xiàn)中斷條件,程序向PxIFG 寄存器相應(yīng)位寫“1”,也會(huì)

18、引發(fā)中斷。更改中斷沿選擇寄存器中的位相當(dāng)于產(chǎn)生了跳變,也會(huì)引發(fā)上升沿或者下降沿中斷。所以更改 PxIES寄存器應(yīng)該在關(guān)閉中斷后進(jìn)行,并在打開中斷之前及時(shí)清除中斷標(biāo)志,這種軟件產(chǎn)生中斷的方式稱為軟中斷。 3.2 LED彩燈控制I/O口的應(yīng)用主要包括三個(gè)方面:一般I/O口、中斷功能端口和外圍模塊特殊功能端口。從這一節(jié)開始,我們列舉幾個(gè)具體的應(yīng)用實(shí)例。發(fā)光二極管LED 是一種電路設(shè)計(jì)中常用的顯示器件,比如很多電子設(shè)備中,當(dāng)電源打開時(shí)采用LED作為電源指示,系統(tǒng)出現(xiàn)異常時(shí)采用LED閃爍提示報(bào)警。將發(fā)光二極管排列成方陣8×8或者16×16,構(gòu)成一個(gè)點(diǎn)陣模塊,再由這些模塊可以構(gòu)成工作和

19、生活中常用的LED 電子顯示屏,顯示單色或者彩色漢字及各種圖形,如體育場(chǎng)館中的大型顯示屏。實(shí)例3.1 彩燈控制任務(wù)要求:利用MSP430F249單片機(jī)的P1口控制8個(gè)發(fā)光二極管LED1LED8,P1口接入三個(gè)開關(guān)K1K3,當(dāng)K1閉合時(shí),LED1和LED4閃爍,閃爍時(shí)間1s;當(dāng)K2閉合時(shí),LED2和LED5閃爍,閃爍時(shí)間2s;當(dāng)K3閉合時(shí),LED1LED8循環(huán)閃爍,閃爍時(shí)間1s。分析說(shuō)明:發(fā)光二極管LED是一種半導(dǎo)體器件,當(dāng)兩端壓降大于1V時(shí),通過(guò) 5mA 左右的導(dǎo)通電流時(shí)即可發(fā)光。導(dǎo)通電流越大,亮度越高,但若電流過(guò)大,會(huì)燒毀二極管,一般我們控制在320mA。在這里,給發(fā)光二極管串聯(lián)一個(gè)電阻的目

20、的就是為了限制通過(guò)發(fā)光二極管的電流不要太大,因此這個(gè)電阻又稱為“限流電阻”,通常取3001000。MSP430F249單片機(jī)的I/O口輸出電流最大為6mA,所有電流之和不超過(guò)48mA。且當(dāng)其 I/O 口輸出“0”時(shí),可以吸收最大 40mA 的電流。因此采用單片機(jī)I/O口控制發(fā)光二極管負(fù)極的設(shè)計(jì)。 1)硬件電路設(shè)計(jì)在桌面或者開始菜單中點(diǎn)擊圖標(biāo),打開proteus開發(fā)環(huán)境,單擊菜單File->New design,新建一個(gè)default設(shè)計(jì)工程,保存文件為為flash.DSN,選擇器件按鈕單擊P按鈕,添加如表3-1中所示的元件。表3-1 實(shí)例3-1元件表序號(hào)12345元件名單片機(jī)電阻R1R8

21、發(fā)光二極管LED1LED8電阻R11R13開關(guān)K1K3參數(shù)MSP430F249330歐姆4.7K歐姆 在原理圖編輯窗口中放置元件,以單片機(jī)為中心合理布局,盡量減少導(dǎo)線的交叉,導(dǎo)線過(guò)多的地方可用標(biāo)號(hào)label表示連接關(guān)系,在對(duì)象選擇器中選擇POWER和GROUND放置電源和地線,按照設(shè)計(jì)要求連接好各個(gè)元件之間的連線。雙擊各個(gè)元件編輯參數(shù),完成原理圖設(shè)計(jì),P1口接8個(gè)LED發(fā)光二極管,P2口接三個(gè)開關(guān)。硬件電路圖如圖3.2所示,限流電阻R1R8取330,開關(guān)上拉電阻取4.7K。 圖3.2 實(shí)例3-1彩燈控制硬件電路圖2)程序設(shè)計(jì)#include <MSP430f249.h>#defin

22、e uchar unsigned char#define uint unsigned int/*軟件延遲ms子程序*/void delayus(uint t) uint i; while(t-) for(i=1300;i>0;i-);void main(void) uint mask = 0x01; WDTCTL = WDTPW + WDTHOLD; / 關(guān)閉看門狗 P1DIR = 0xFF; / 設(shè)置方向?yàn)檩敵?P1SEL = 0x00; / 設(shè)置為普通I/O 口 P1OUT = 0xFF; /LED輸出全部關(guān)閉 while(1) if(P2IN&0x07) = 0x06) /

23、K1 開關(guān)閉合 P1OUT = (BIT0 + BIT4); /LED0,LED4閃爍 delayus(100); /延遲0.1s else if(P2IN&0x07) = 0x05) /K2 開關(guān)閉合 P1OUT = (BIT1 + BIT5); /LED1,LED5閃爍 delayus(200); /延遲0.2s else if(P2IN&0x07) = 0x03) /K3 開關(guān)閉合 P1OUT = mask; /LED逐個(gè)點(diǎn)亮 delayus(100); /延遲0.1s mask += mask; /mask的值從0x01,0x02,0x04.0x80,對(duì)應(yīng)8個(gè)LED i

24、f(mask = 0x100) /恢復(fù)到0x01 mask = 0x01; if(P2IN&0x07) = 0x07) P1OUT = 0xFF; /無(wú)鍵按下,關(guān)閉全部LED 說(shuō)明: 程序首先包含了MSP430f249.h頭文件,該頭文件中給出了該系列單片機(jī)內(nèi)部寄存器名字的C語(yǔ)言的定義,比如P1DIR,P2OUT等,通過(guò)定義好的這些名字,通過(guò)利用C語(yǔ)言可以直接對(duì)寄存器賦值或者讀取寄存器的值,從而完成單片機(jī)功能的調(diào)用。 主程序中首先WDTCTL = WDTPW + WDTHOLD關(guān)閉看門狗功能(看門狗具體內(nèi)容請(qǐng)參考第5章),因?yàn)?30單片機(jī)復(fù)位后會(huì)默認(rèn)為啟動(dòng)看門狗,程序正常執(zhí)行時(shí)應(yīng)關(guān)閉該

25、功能或者定時(shí)復(fù)位看門狗。 主循環(huán)中讀取P2口的輸入值,判斷是哪一個(gè)開關(guān)閉合,控制LED閃爍,其中delayus函數(shù)是通過(guò)軟件實(shí)現(xiàn)延遲,需要注意的是P1口的某一位輸出為低時(shí)對(duì)應(yīng)的LED點(diǎn)亮,因?yàn)長(zhǎng)ED的陽(yáng)極接電源,而陰極接的是單片機(jī)的端口。在K3閉合時(shí),通過(guò)mask每次累加得到P1口的對(duì)應(yīng)位,mask初始值為0x01,每次累加后變?yōu)?x02、0x04、0x08,一直到0x100后恢復(fù)原來(lái)的值0x01,這一段代碼也可以用mask <<= 1左移運(yùn)算來(lái)代替,左移運(yùn)算的效率要比加法高,讀者可以自行體會(huì)。3)仿真結(jié)果與分析點(diǎn)擊桌面或者開始菜單中的IAR開發(fā)環(huán)境圖標(biāo),單擊File菜單的New-

26、>Workspace新建一個(gè)工作區(qū),如圖3.3所示。點(diǎn)擊菜單Project-Create New Project新建工程,如圖3.4所示。 圖3.3 新建工作區(qū) 圖3.4 新建工程 圖3.4中有個(gè)Tool Chain:MSP430表示選擇的芯片類型,另外在Project templates(工程模板),可以選擇asm(匯編語(yǔ)言)、C+(C+語(yǔ)言)、C(C語(yǔ)言),這里可以選擇C。展開C前面的“+”號(hào),點(diǎn)擊main之后再點(diǎn)OK。得到如圖3-5所示的一個(gè)空白工程模板,保存工程名。根據(jù)需要選擇工程保存的位置,更改工程名,這里工程名設(shè)置為flash保存。圖3.5 工程模板 模板中已經(jīng)存在一個(gè)mai

27、n.c文件,將前述的代碼加入到該文件中。如果還需要增加新的文件,可以通過(guò)File->New->File編寫新的程序文件,保存后可通過(guò)Project->Add Files菜單將新的程序文件加入到工程中。 下一步是IAR的工程參數(shù)的設(shè)置和代碼的編譯。點(diǎn)擊IAR菜單Project->Options。得到如圖3.6所示的設(shè)置界面。圖3.6 工程參數(shù)設(shè)置 在General Option選型中,Device設(shè)置選擇合適的單片機(jī)型號(hào),這里我們選擇與硬件原理圖相對(duì)應(yīng)的MSP430F249, 其他都設(shè)置為默認(rèn)即可。 為生成單片機(jī)運(yùn)行所需的程序文件,選擇Linker選型,得到如下設(shè)置界面如

28、圖3.7所示。圖3.7 程序文件選擇在output選file項(xiàng)中,勾選Override default選項(xiàng),輸入文件名和類型,選擇other單選按鈕,在Output選項(xiàng)中可以有很多種不同的輸出格式選擇。我們可以選擇其中三種格式,一種是即intel standard(intel公司標(biāo)準(zhǔn)),此時(shí)文件名應(yīng)該為flash.hex,這個(gè)輸出格式可以供proteus進(jìn)行仿真,但是不能源碼調(diào)試,或者作為單片機(jī)下載的二進(jìn)制文件;一種是即TI公司對(duì)MSP430系列單片機(jī)利用BSL方式進(jìn)行燒寫的一種格式,此時(shí)文件名應(yīng)該為flash.txt;還有一種是這是proteus對(duì)MSP430系列單片機(jī)實(shí)現(xiàn)源碼級(jí)調(diào)試一種文件

29、格式,此時(shí)文件名應(yīng)該為flash.d90,為以后程序調(diào)試方便,可以選擇最后一種。其他的輸出文件格式就不一一介紹了。最后代碼的編譯可以通過(guò)菜單Project->Make,或者用快捷鍵F7,或者單擊工具欄的圖標(biāo),對(duì)整個(gè)工程進(jìn)行編譯,當(dāng)程序沒(méi)有錯(cuò)誤時(shí),在IAR軟件輸出窗口提示代碼編譯的結(jié)果, 如圖3.8所示。圖3.8 編譯結(jié)果輸出窗口最后兩行表示程序的錯(cuò)誤和警告的數(shù)量,當(dāng)有錯(cuò)誤警告提示可以根據(jù)錯(cuò)誤和警告提示修改代碼,錯(cuò)誤不消除將不能得到可運(yùn)行的程序文件,警告要根據(jù)具體情況分析解決。作為初學(xué)者應(yīng)該將程序中所有的錯(cuò)誤和警告都予以排除,養(yǎng)成良好的編程風(fēng)格和習(xí)慣。當(dāng)程序編譯通過(guò)后,將在工程目錄的子目錄

30、DebugExe下,生成所需的編程或者仿真用的文件。雙擊proteus原理圖設(shè)計(jì)窗口中的MSP430f249單片機(jī),如圖3.9所示。圖3.9 編輯元件屬性在Program File中選擇裝載可執(zhí)行文件DebugExeflash.d90,點(diǎn)擊proteus工程窗口左下角的第一個(gè)按鈕運(yùn)行仿真程序,點(diǎn)擊K1可以觀察到LED1和LED4燈亮0.1s滅0.1s;運(yùn)行后點(diǎn)擊K2可以觀察到LED2和LED5燈亮0.2s滅0.2s運(yùn)行后點(diǎn)擊K3可以觀察到LED1LED8周而復(fù)始逐個(gè)點(diǎn)亮。開關(guān)K1閉合時(shí),仿真結(jié)果如圖3.10所示。圖3.10 實(shí)例3-1仿真結(jié)果圖當(dāng)程序運(yùn)行不正常時(shí),可以利用proteus的deb

31、ug菜單MSP430 source code進(jìn)行源碼調(diào)試,如圖3.11所示。具體調(diào)試方法請(qǐng)參考附錄。圖3.11 源碼調(diào)試4、注意問(wèn)題 在應(yīng)用 I/O 口輸出時(shí),在系統(tǒng)的軟硬件設(shè)計(jì)上應(yīng)注意的問(wèn)題有: 輸出電平的轉(zhuǎn)換和匹配。如一般 MSP430 系統(tǒng)的工作電源為3.3伏(手持系統(tǒng)往往采用1.5v3v 電源),所以 I/O 的輸出電平為3.3V。當(dāng)連接的外圍器件和電路采用 5v、9v、12v、15v 等與 3.3v 不同的電源時(shí),應(yīng)考慮輸出電平轉(zhuǎn)換電路。 輸出電流的驅(qū)動(dòng)能力。MSP430 的 I/O 口輸出可以提供 4mA 左右的驅(qū)動(dòng)電流。輸出總電流最大為 48mA。 當(dāng)連接的外圍器件和電路需要大電

32、流驅(qū)動(dòng)或有大電流灌入時(shí),應(yīng)考慮使用功率驅(qū)動(dòng)電路。 輸出電平轉(zhuǎn)換的延時(shí)。MSP430 是一款高速單片機(jī),當(dāng)系統(tǒng)時(shí)鐘為 8M 時(shí),執(zhí)行一條指令的時(shí)間為 0.125us,這意味著將一個(gè) I/O 引腳置“1”,再置“0”僅需要 0.125us,既輸出一個(gè)脈寬為 0.125us 高電平脈沖。在一些應(yīng)用中,往往需要較長(zhǎng)時(shí)間的高電平脈沖驅(qū)動(dòng),如步進(jìn)馬達(dá)的驅(qū)動(dòng),動(dòng)態(tài) LED 數(shù)碼顯示器的掃描驅(qū)動(dòng)等,因此在軟件設(shè)計(jì)中要考慮轉(zhuǎn)換時(shí)間延時(shí)。對(duì)于不需要精確延時(shí)的應(yīng)用,可采用軟件延時(shí)的方法,編寫軟件延時(shí)的子程序。如果要求精確延時(shí),要使用 MSP430 內(nèi)部的定時(shí)器。 實(shí)例3-2 花樣彩燈控制任務(wù)要求:利用MSP430F

33、249單片機(jī)的P1口控制8個(gè)發(fā)光二極管LED1LED8,點(diǎn)亮順序如表3-9所示,每個(gè)發(fā)光二極管點(diǎn)亮?xí)r間為0.5s。表3-9 流水燈點(diǎn)亮次序(低電平為點(diǎn)亮)序號(hào)P1.7P1.6P15.P1.4P1.3P1.2P1.1P1.0模式11111111單個(gè)LED左移模式2111111131111111411111115111111161111111711111118111111191111111單個(gè)LED右移模式101111111111111111121111111131111111141111111151111111161111111171111111多個(gè)LED左移模式1811111119111112

34、011112111122112312425多個(gè)LED右移模式261271128111291111301111131111111321111111分析說(shuō)明:利用單片機(jī)的P1口控制8個(gè)LED,電路與圖3.2類似,但是此處不需要開關(guān)輸入,重點(diǎn)在于C程序設(shè)計(jì)的算法和技巧。1)硬件電路設(shè)計(jì)在桌面或者開始菜單中點(diǎn)擊圖標(biāo),打開proteus開發(fā)環(huán)境,單擊菜單File->New design,新建一個(gè)default設(shè)計(jì)工程,保存文件為light2.DSN,選擇器件按鈕單擊P按鈕,添加MSP430F249、LED、RES等元件。在原理圖編輯窗口中放置元件,硬件電路圖如圖3.12所示。 圖3.12 實(shí)例3-

35、2花樣彩打控制硬件電路圖2)程序設(shè)計(jì)#include <MSP430f249.h>#define uchar unsigned char#define uint unsigned int#define SHIFT_NUM 8 /移位循環(huán)次數(shù)8enum LED_MODE LEFT_SHIFT_ON, /單個(gè)LED左移模式 RIGHT_SHIFT_ON, /單個(gè)LED右移模式 LEFT_SHIFT_OFF,/多個(gè)LED左移模式 RIGHT_SHIFT_OFF, /多個(gè)LED右移模式 ;enum LED_MODE mode;/*軟件延遲ms子程序*/void delayus(uint t

36、) uint i; while(t-) for(i=1300;i>0;i-);void main(void) uint mask = 0x01; uchar i; uchar mode = LEFT_SHIFT_ON; WDTCTL = WDTPW + WDTHOLD; / 關(guān)閉看門狗 P1DIR = 0xFF; / 設(shè)置方向?yàn)檩敵?P1SEL = 0x00; / 設(shè)置為普通I/O 口 P1OUT = 0xFF; /LED輸出全部關(guān)閉 while(1) for(i = 0;i < SHIFT_NUM;i+) switch(mode) case LEFT_SHIFT_ON:/單個(gè)LE

37、D左移模式 mask <<= 1; if(mask = 0x100) /下一個(gè)狀態(tài)的初始值 mask = 0x80; break; case RIGHT_SHIFT_ON:/單個(gè)LED右移模式 mask >>= 1; if(mask = 0x00) /下一個(gè)狀態(tài)的初始值 mask = 0x01; break; case LEFT_SHIFT_OFF:/多個(gè)LED左移模式 mask <<= 1; mask |=1; if(mask = 0x1FF) /下一個(gè)狀態(tài)的初始值 mask = 0x7F; break; case RIGHT_SHIFT_OFF:/多個(gè)L

38、ED右移模式 mask >>= 1; mask &= 0x80; if(mask = 0x00) /下一個(gè)狀態(tài)的初始值 mask = 0x01; break; P1OUT = mask; /LED輸出 delayus(100); /延遲0.1s mode+; /顯示模式變換 mode %= 4; 說(shuō)明: 程序首先定義了一個(gè)枚舉類型LED_MOD,定義了四種顯示模式,分別是單個(gè)LED左移模式、單個(gè)LED右移模式、多個(gè)LED左移模式和多個(gè)LED右移模式,分別對(duì)應(yīng)表xxxxx中的四種模式,利用枚舉類型定義變量mode,該變量在程序中控制LED顯示的方式。 主程序中首先WDTCTL

39、 = WDTPW + WDTHOLD關(guān)閉看門狗功能, P1輸出全部為高電平關(guān)閉所有的LED。 主循環(huán)中利用for循環(huán)控制LED的順序點(diǎn)亮,循環(huán)次數(shù)SHIFT_NUM為宏定義,這樣的寫法可以提高程序的可讀性和可移植性。在for循環(huán)中首先是單個(gè)LED左移模式,mask為P1輸出口的值,起始值為0x01,后面一條語(yǔ)句P1OUT = mask,將mask取反賦值給P1端口,P1口輸出0xFE,使得P1.0對(duì)應(yīng)的LED點(diǎn)亮,其他LED熄滅,mask <<= 1語(yǔ)句使得每次循環(huán)時(shí)mask左移一次,即mask值從0x01->0x02->0x04->0x08->0x100x

40、80,再左移一次mask變?yōu)?x100,注意mask定義為uint為16位整數(shù),不會(huì)因?yàn)?次移位后變?yōu)?,這時(shí)顯示模式應(yīng)該為轉(zhuǎn)換為單個(gè)LED右移模式,初始值為0x80,mask再逐次右移,即由0x80->0x40->0x01;當(dāng)mask右移8次后為0時(shí),顯示模式轉(zhuǎn)換為多個(gè)LED左移模式,初始值0x01,在循環(huán)中mask <<= 1; mask |=1兩條語(yǔ)句使得mask的值從0x01->0x03->0x070xFF,即LED從左到右依次多個(gè)點(diǎn)亮,當(dāng)移位8次mask的值將變?yōu)?x1FF,轉(zhuǎn)換為多個(gè)LED左移模式,初始值為0x7F,只有P1.7端口LED的熄滅,

41、在循環(huán)中 mask >>= 1; mask &= 0x80語(yǔ)句使得mask的值從0x7F->0x3F->0x1F0x00,LED從右到左依次多個(gè)熄滅,最后重新從單個(gè)LED左移模式開始,如此反復(fù)。模式變換的語(yǔ)句為 mode+; mode %= 4,模式初始值按照枚舉的定義為0,每次模式變換后加一,mode %= 4為mode對(duì)4取余,即mode值為0、1、2、3時(shí),mode%4的值依舊是0、1、2、3,當(dāng)mode加一等于4,再取余時(shí)mode的值重新為0。實(shí)現(xiàn)了模式的循環(huán)變換,當(dāng)然這種寫法并不是唯一的,也可以采用以下代碼:if(+mode = 4) mode = 0

42、;讀者注意體會(huì)其中的不同之處。3)仿真與結(jié)果分析程序的仿真運(yùn)行,點(diǎn)擊運(yùn)行后可以觀察到LED逐漸變換的效果。多個(gè)LED左移模式,仿真結(jié)果如圖3.13所示。圖3.13 實(shí)例3-2花樣彩打控制仿真結(jié)果圖4)注意問(wèn)題 本實(shí)例采用了多個(gè)模式變換來(lái)實(shí)現(xiàn)流水燈的控制,程序中利用了枚舉變量,并采用switch語(yǔ)句控制模式的循環(huán),要特別注意模式切換時(shí)mask的初始值的取值。 以上的兩個(gè)實(shí)例分別介紹了按鍵控制的閃爍燈和多種模式變換的流水燈,下面一個(gè)實(shí)例為利用按鍵選擇LED顯示方式更為復(fù)雜的花樣燈設(shè)計(jì),一方面理解單片機(jī)I/O口的輸入和輸出控制,一方面更深入的學(xué)習(xí)C語(yǔ)言編程的技巧和調(diào)試方法。實(shí)例3-3 帶按鍵選擇的花

43、樣燈任務(wù)要求:利用MSP430F249單片機(jī)的P1口控制8個(gè)發(fā)光二極管LED1LED8,發(fā)光二極管根據(jù)P0口的接入的開關(guān)K1K5完成不同的顯示花樣變換。當(dāng)K1閉合時(shí),LED1和LED2點(diǎn)亮,延遲0.1s之后LED2和LED3點(diǎn)亮,最后是LED7和LED8點(diǎn)亮后重新開始;當(dāng)K2閉合時(shí),LED1LED8相當(dāng)于8位二進(jìn)制數(shù),延遲0.1s之后加一并點(diǎn)亮對(duì)應(yīng)的LED;當(dāng)K3閉合時(shí),先LED1LED4點(diǎn)亮,延遲0.1s后LED5LED8點(diǎn)亮;隨后LED1LED2、和LED5LED6點(diǎn)亮,延遲0.1s后LED3LED4、LED7LED8逐次點(diǎn)亮,最后LED1、LED3、LED4、LED6點(diǎn)亮,延遲0.1s后

44、LED2、LED4、LED6、LED8點(diǎn)亮后重新開始;當(dāng)K4閉合時(shí),顯示如圖3.xxxx,圖中0部分為發(fā)光的LED。即先點(diǎn)亮P1.0P1.3引腳連接的4個(gè)LED,然后讓LED從右向左移動(dòng),當(dāng)P1.7引腳連接的LED點(diǎn)亮后,下一步重新點(diǎn)亮P1.0,依次循環(huán)。表3-11彩燈花樣式樣圖序號(hào)P1.7P1.6P15.P1.4P1.3P1.2P1.1P1.011111211113111141111511116111171111811111)硬件電路設(shè)計(jì) 在原理圖編輯窗口中放置元件,硬件電路圖如圖3.14所示。 圖3.14 實(shí)例3-3硬件電路圖2)程序設(shè)計(jì)#include <MSP430f249.h&

45、gt;#define uchar unsigned char#define uint unsigned int/*軟件延遲ms子程序*/void delayus(uint t) uint i; while(t-) for(i=1300;i>0;i-);void main(void) uchar i; uchar val = 0; uchar mask1 = 0x80; uchar mask2 = 0x01; uchar mode = 4; static unsigned char LEDs = 0x0f; / 靜態(tài)變量用于存儲(chǔ)LEDs發(fā)光狀態(tài) WDTCTL = WDTPW + WDTHO

46、LD; / 關(guān)閉看門狗 P1DIR = 0xFF; / 設(shè)置方向?yàn)檩敵?P1SEL = 0x00; / 設(shè)置為普通I/O 口 P1OUT = 0xFF; /LED輸出全部關(guān)閉 while(1) if(P2IN&0x1F) = 0x01E) /K1 開關(guān)閉合 val = 0x03; for(i = 0;i < 8;i+) /兩位LED同時(shí)移動(dòng) P1OUT = val; val <<= 1; delayus(1000); else if(P2IN&0x1F) = 0x1D) /K2 開關(guān)閉合 P1OUT = (val+); /LED按照二進(jìn)制數(shù)據(jù)累加顯示 dela

47、yus(1000); else if(P2IN&0x1F) = 0x1B) /K3 開關(guān)閉合 switch(mode) case 4:/每四個(gè)一組LED間隔顯示 P1OUT = 0xF0; delayus(1000); P1OUT = 0x0F; delayus(1000); break; case 2:/每?jī)蓚€(gè)一組LED間隔顯示 P1OUT = 0xCC; delayus(1000); P1OUT = 0x33; delayus(1000); break; case 1:/每一個(gè)LED間隔顯示 P1OUT = 0x55; delayus(1000); P1OUT = 0xAA; de

48、layus(1000); break; mode /= 2; if(mode = 0) mode = 4; else if(P2IN&0x1F) = 0x17) /K4 開關(guān)閉合 P1OUT = (mask1|mask2); /兩個(gè)LED對(duì)向移動(dòng)顯示 mask1 >>= 1; mask2 <<= 1; delayus(1000); if(mask1|mask2) = 0x00) mask1 = 0x80; mask2 = 0x01; else if(P2IN&0x1F) = 0x0F) /K5 開關(guān)閉合 P1OUT = LEDs; /四個(gè)LED循環(huán)顯示 delayus(1000); if(LE

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論