零基礎學習單片機(一)--LED

最近公司要做智能小車的改裝。筆者很是慚愧,渾渾噩噩在大學讀了4年的電子專業,到頭來單片機都沒玩過2次。

計劃花一段時間來玩單片機,從最簡單的LED入手。

該系列的學習筆記 開發環境是:

開發板:HC800EM3  感覺是一塊很不錯的開發板,提供的外部接口不少,板子還提供了單片機與ARM的“轉換接口”。

單片機型號:STC90C516RD+

ARM:STM32

開發工具:keil 3 (單片機版)

一、原理圖

由於網上的教程很多,對於keil的使用以及板子的電路分析 就不具體介紹了。(很慶幸,板子的原理圖多少還能看的懂,以後要惡補啊~)。


很容易理解,將1管腳置0,這燈D8會亮。

二、單片機延時程序的粗淺分析

爲了讓LED燈能夠具有多種效果(例如閃爍),必然要用到延時程序。部分網友說,單片機的延時程序精度不高,建議用定時器。但是畢竟是入門,之後再研究定時器吧。

下面的程序是在12MHZ 晶振源,延時1ms的c程序。

void delay_ms(void) 
{
    unsigned char a,b,c;

    for(c = 1;c > 0; c--)
        for(b = 142; b > 0; b--)
            for(a = 2; a>0; a--);
}
1、機器週期

一個機器週期包含12個時鐘週期。時鐘週期的計算公式=(1/晶振頻率)秒。

例如,晶振爲12MHZ

該單片機的時鐘週期=(1/12)微秒,由此可以得到機器週期爲1us。

在這裏機器週期可以理解爲指令週期,就是單片機執行一條指令花費的時間。注:這裏的指令並不是C語言的指令,而且機器指令,可以通過反彙編查看。

2、反彙編

我們要計算一個程序執行的時間,畢竟查看其對應的反彙編代碼。這裏附上上面程序的反彙編代碼,keil 可以調出反彙編代碼查看窗口。

    54: void delay(void)    
    55: { 
    56:     unsigned char a,b,c; 
    57:     for(c=1;c>0;c--) 
C:0x0045    7F01     MOV      R7,#0x01
    58:         for(b=142;b>0;b--) 
C:0x0047    7E8E     MOV      R6,#0x8E
    59:             for(a=2;a>0;a--); 
C:0x0049    7D02     MOV      R5,#0x02
C:0x004B    DDFE     DJNZ     R5,C:004B
C:0x004D    DEFA     DJNZ     R6,C:0049
C:0x004F    DFF6     DJNZ     R7,C:0047
    60: } 
C:0x0051    22       RET   
3、反彙編分析

下面列出了 delay_ms() 每條指令對應的機器週期。

這裏附上8051 的指令週期表下載地址。

				指令		機器週期
C:0x0045    7F01     MOV      R7,#0x01		1

C:0x0047    7E8E     MOV      R6,#0x8E		1

C:0x0049    7D02     MOV      R5,#0x02		1
C:0x004B    DDFE     DJNZ     R5,C:004B		2
C:0x004D    DEFA     DJNZ     R6,C:0049		2
C:0x004F    DFF6     DJNZ     R7,C:0047		2

C:0x0051    22       RET      			2
下面我們來計算 該程序 需要耗費多少時間。(不理解彙編指令的話,可以查看8051 指令週期表)

DJNZ     R5,C:004B,執行該循環所用的機器週期數爲2*2=4。

從第三條指令到第五條指令的循環,執行該循環所用的機器週期數爲(1+2*2+2)*142

從第二條指令到第六條指令的循環,執行該循環所用的機器週期數爲(1+(1+2*2+2)*142+2)*1 

delay_time = 1+(1+(1+2*2+2)*142+2)*1+2 秒
網上提供了一個很不錯的延時程序計算軟件。單片機小精靈軟件
三、主程序

int main(void)
{
	P2 = 0xFE;

	while(1)
	{
		delay_ms(100);		//延時100ms
		P2 ^= (1 << 0);		//取反
	}

	return 0;
}

程序的執行效果是 D1每隔100ms會閃爍一次


有興趣的朋友,可以自己修改主程序,讓LED燈顯示不同的效果。單片機挺有趣的~~今天就先寫到這。

以上純屬個人學習筆記,如果哪裏錯了,希望提出。願和大家一起共同學習,一起進步。我的郵箱地址是:[email protected]



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章