51微控制器那點兒事 從LED開始

2021-06-22 14:19:37 字數 1447 閱讀 7703

又要從51開始學微控制器了,突然感覺到學習最痛苦的不是學不會,而是學會了容易忘,忘了還得重頭翻書學。所以呢,這次決定留下點兒學習筆記,也方便以後檢視。實驗用的是普中科技的6800em3微控制器開發板,不出意外的話會有c語言和彙編兩個版本的例程。

上面是led的電路原理圖。

c語言(實現簡單的所有燈的間隔,同時亮滅)

#include void delay();

main(void)

}void delay()

彙編**(實現流水燈)

org 0000h

ljmp main

org 030h;main從0030h處開始

main: mov a, #0feh;00000001,只讓d1亮

loop: mov p2, a

acall delay

rl a;迴圈左移

jmp loop

delay: mov r5, #25;延時函式

f1: mov r6, #100

f2: mov r7, #100

djnz r7, $

djnz r6, f2

djnz r5, f1

retend

經驗總結:

1、在"mov a, #0feh"語句中把#號和f前的0丟掉,導致燈全亮,且不變

2、彙編的轉移指令總結:

1)無條件轉移指令:

ljmp addr16 :長轉移;3位元組指令,範圍是64k

sjmp rel:短轉移;2位元組指令;範圍是-128~127k

jmp @a+dptr :變址定址轉移

2)條件轉移指令:

減一條件指令:djnz rn/direct rel;注意運算元;指令的操作是rn和direct的內容減一,如果結果不是0,則轉移,是0則按順序執行

累加器到零轉移指令:jz/jnz rel;jz是當(a)=0,則轉移,否則順序執行,jnz相反

比較轉移指令:cjne 有3個運算元第乙個運算元減去第二個運算元,若為零則不轉移,小於/小於零cy置1/0,並且轉移(第3個運算元為rel)

3)位控制轉移:

以cy為條件的轉移指令:jc/jnc rel,cy是0/1時轉移

以位狀態為條件的轉移指令:jb/jnb/jbc bit,rel,jbc的含義是該位是零時轉移並且清零

3、彙編延時的計算:使用的振盪頻率是12mhz,乙個機器週期為1微秒,乙個djnz語句的執行需要兩個機器週期,則延長時間是100*100*25*2微秒=0.5秒(只是大概估算)

4、呼叫子程式的指令有acall和lcall兩種分別是11位的絕對轉移和16位的轉移;返回指令也有兩種:ret和ret1,分別是一般子程式的返回和中斷程式的返回

51微控制器 LED點陣

這次的程式是通過控制led點陣,點亮乙個 號。我們使用的是乙個8 8的電子,需要操作16bit,實現對行和列的管理,這點其實和矩陣按鍵是有些類似,只不過乙個是輸入,乙個是輸出,都是通過逐行掃瞄實現的 矩陣按鍵由於每次只檢查乙個按鍵,也可以使用行列掃瞄 下面是led點陣的原理圖 從上圖可以看出,每乙個...

51微控制器控制LED顯示漢字

2007 12 25 12 34 26 用51微控制器控制led顯示漢字,電路中行方向由p0口和p2口完成掃瞄,由於p0口沒有上拉電阻,因此接乙個4.7k 8的排阻上拉。如沒有排阻,也可用8個普通的4.7k 1 8w電阻。為提供負載能力,接16個2n5551的npn三極體驅動。列方向則由4 16解碼...

51微控制器 LED類程式設計技巧

8x8點陣 個人感覺點陣需要注意的地方有 第乙個就是驅動點陣的方式 我認為8x8點陣的驅動程式分為行掃瞄和列掃瞄兩種。比如行掃瞄就是用一層for迴圈 先選中第一行,然後送入這一行的資料,再選擇第二行,然後送入第二行資料,如此迴圈下去,直至顯示完乙個螢幕 即8行 同時記得要消隱和微延時 後面會說消隱和...