天天看點

4.0 IO口控制LED燈閃爍

執行個體2---IO口控制LED燈閃爍-----程式目的:學會如何實作軟體延時與應用IAR軟體自帶延時

在上程式前我們先來了解下MSP430的時鐘周期及機器周期,在MSP430單片機中,一個時鐘周期 = MCLK晶振的倒數。如果MCLK是8MHz,則一個時鐘周期為1/8us。一個機器周期 = 一個時鐘周期,即MSP430每個動作都能完成一個基本操作。一個指令周期 = 1~6個機器周期,具體根據具體指令而定。就因為一個機器周期等于一個時鐘周期,是以軟體延時還是比較準确。舉個例子,寫個1ms的延時函數,我們調用個500次,延時基本上就是500ms。但是如果是51單片機,那就未必,特别是調用的函數延時越小,所産生的誤差就越大,原因很簡單,因為51的指令周期需要的時鐘周期比較多,在調用函數時的過程也産生延時。下面我們來做些測試:

首先寫個1ms的延時函數

時鐘晶振為16MHz

void delay_ms(u16 ms)

{

        u16 i,j;

        for(i=ms; i>0; i--)

                for(j=4000; j>0; j--);

}

用邏輯分析捕抓了1ms函數,看圖,有圖有真相

4.0 IO口控制LED燈閃爍

基本上就是1ms。

下面我們調用500次,看是不是有500ms,還是比500ms多

while(1)

{

        LED_L;//點亮led燈

        delay_ms(500);

        LED_H;//熄滅led燈

        delay_ms(500);

}

看圖

4.0 IO口控制LED燈閃爍

基本上就是500ms,是吧,還是很不錯的。大夥用手上的51闆子測試下,看有沒有這個效果。

下面咱們就來看看利用IAR的延時

__intrinsic void __delay_cycles(unsigned long __cycles);

在使用這個延時時就要加入intrinsics.h這個頭檔案,别問我為什麼,因為這延時就在這個頭檔案裡。現在我看看如何使用這個延時,建立個點H檔案,比如叫delay.h,我們就在這個檔案裡寫如下代碼:

//延時函數代碼

#ifndef __DELAY_H

#define __DELAY_H

#include <intrinsics.h>

//IAR自帶延時函數

#define CPU_F ((double)16000000)//晶振頻率,如果是8MHz就寫8000000 

#define Delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 

#define Delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#endif 

就這麼簡單,然後你在你的其他代碼裡要用到延時,包含此頭檔案即可,然後就可以調用Delay_us(x)或者Delay_ms(x),注意延時超過1ms就不要調用Delay_us(x)這個函數。下面我們也來測試這個準不準,我們就調用200次這樣:

while(1)

{

        LED_L;//點亮led燈

        Delay_ms(200);

        LED_H;//熄滅led燈

        Delay_ms(200);

}

看圖

4.0 IO口控制LED燈閃爍

怎麼樣,這個精度驚人吧,199.9999ms。TI的品質再加IAR的牛逼,有時候牛逼不是用來吹的。

IO口控制LED燈閃爍課程完結。源程式: 

4.0 IO口控制LED燈閃爍

 002 led-flash.rar (184.02 KB, 下載下傳次數: 0)    學習讨論Q群:167390222     2014年7月2日

繼續閱讀