c51的閃爍led設計
本設計採用通俗易懂的語言組織,看好了,在進行以下主要內容之前,先話癆話癆,學習這些微控制器設計啊,真的得有興趣,所謂興趣,就是你懂了它,理解了它,自然而然就對它產生了興趣了,換句話說,你他麼一點都不懂,你來跟我說興趣,你個龜兒,鬼都不信,牆都不服舅扶你。話不多說,想玩這個,總得知道入口吧,你是通過什麼方式知道玩這個微控制器呢,有人專業課就是這個,有人網上知乎聽水友嘮嘮知道,千奇百怪的方式,而我呢,確實是專業課所需的,沒辦法,寫這篇部落格,我正在讀大三呢,哈哈,一起加油吧!
我寫的這個led閃爍小燈,是採用at89c51的,是採用組合語言來寫程式的,主要使小燈輪流點亮,逐點點亮,間隔點亮。下圖(1)是閃爍小燈電路原理圖,其中p1口作led燈控制輸出埠,p3.0~p3.2分別為三個閃爍功能開關控制埠,p3.3埠做備用,限流電阻10k,採用12mhz晶振。
圖(1)
系統程式設計
一.主要程式
掃瞄p3.0~p3.2口,看一看有沒有按鍵按下,然後呢,在20記憶體單元中的低三位全部置1,進而確定所執行的閃爍功能,來看看,20h.0為1時,led燈輪流點亮,20h.1為1時,led燈逐點點亮;20h.2為1時,led燈間隔點亮;然後呢,注意要先對20h低三位的位值判斷是否為1,會轉入相應的閃爍控制程式,上電要初始化的,要先對20h.0進行置1,系統首先進入輪流點亮功能。主程式流程圖如圖(2)
二.鍵掃瞄子程式
採用直接埠掃瞄鍵開關,要用軟體延時消抖確認後呢,要對20h記憶體單元相應的位進行置1,其餘位置零。
三.閃爍控制程式
這個程式用來控制p1口的發光變化方式的,其中如下:
功能程式0(fun0)的p1口輸出變化為:11111110 延時 11111101 延時 11111011 延時 11110111 延時 11101111 延時 11011111 延時 10111111 延時 01111111 延時 結束 轉去執行主程式
功能程式1(fun1)的p1口輸出變化為:11111110 延時 11111100 延時 11111000 延時 11110000 延時 11100000 延時 11000000 延時1000000 延時 00000000 延時 結束轉去執行主程式
功能程式2(fun2) 的p1口輸出變化為:10101010 延時 01010101 延時 結束轉去執行主程式。
四.延時子程式
延時子程式有10ms和0.5s兩個,用作鍵掃瞄消抖及led閃爍延時,led的閃爍快慢由r4暫存器內的初值進行改變。
匯程式設計序清單
rg 0000h ;程式執行開始位址
ljmp start ;轉去start執行
org 0003h ;外中斷0中斷入口位址
reti ;中斷返回(不開中斷)
org 000bh ;定時器t0中斷入口位址
reti ;不開中斷
org 0013h ;外中斷1中斷入口位址
reti ;不開中斷
org 001bh ;定時器t1中斷入口位址
reti ;不開中斷
org 0023h ;序列口中斷入口位址
reti ;不開中斷
clear:mov 20h,#00h ;20h單元內容清零(閃爍標誌清零)
setb 00h ;20h.0位置置1
ret ;子程式返回
start:acall clear ;呼叫初始化子程式
main:lcall keywork ;呼叫鍵掃瞄子程式
jb 00h,fun0 ;20h.0位為1時轉去執行fun0
jb 01h,fun1 ;20h.1位為1時轉去執行fun1
jb 02h,fun2 ;20h.2位為1時轉去執行fun2
jb 03h,main ;備用
ajmp main ;返回主程式main
fun0:mov a,#0feh ;累加器賦初值
fun00:mov p1,a ;累加器值送入p1口
lcall dl05s ;呼叫延時05s子程式
jnb acc.7,main
rl a
ajmp fun00 ;轉去執行fun00
fun1:mov a,#0feh ;累加器賦初值
fun11:mov p1,a ;累加器值送入p1口
lcall dl05s ;呼叫延時05s子程式
jz main ; 累加器為0轉去執行主程式main
rl a ;累加器中資料迴圈左移1位
anl a,p1 ;a中值與p1值相與
ajmp fun11 ;轉去執行fun11
fun2:mov a,#0aah ;累加器賦初值
fun22:mov p1,a ;累加器值送入p1口
lcall dl05s ;呼叫延時05s子程式
cpl a ;a中各位取反
mov p1,a ;再把累加器值送入p1口
lcall dl05s ;呼叫05s子程式
ajmp main ;轉去執行主程式main
keywork:mov p3,#0ffh
jnb p3.0,key0
jnb p3.1,key1
jnb p3.2,key2
jnb p3.3,key3
retkey0:lcall dl10ms
jb p3.0,out0
setb 00h
clr 01h
clr 02h
clr 03h
out0:ret
key1:lcall dl10ms
jb p3.1,out1
setb 01h
clr 00h
clr 02h
clr 03h
out1:ret
key2:lcall dl10ms
jb p3.2,out2
setb 02h
clr 00h
clr 01h
clr 03h
out2:ret
key3:lcall dl10ms
jb p3.3,out3
setb 03h
clr 00h
clr 01h
clr 02h
out3:ret
dl512:mov r2,#0ffh
loop1:djnz r2,loop1
retdl10ms:mov r3,#14h
loop2:lcall dl512
djnz r3,loop2
retdl05s:mov r4,#0fh
loop3:lcall dl25ms
djnz r4,loop3
retdl25ms:mov r5,#0ffh
loop4:lcall keywork
djnz r5,loop4
retend
簡述基於89c51的8 8LED點陣屏使用方法
最近弄了一塊32 64的led點陣屏,想做個萬年曆的.發現不會驅動,我去。遂拿起放了很久的8 8led點陣來耍耍。話歸正題,此次試驗用89c51 74hc595兩塊 1塊8 8led點陣 首先關於74hc595的驅動,就不多說了。參考 關於8 8點陣 首先要解決的是關於引腳順序的問題 如圖,阿拉伯數...
89C51和89S51的區別
89c51和89s51的區別 很多初學51微控制器的會有這樣的問題 at89s51是什麼?書上和網路教程上可都是8051,89c51等!沒聽說過有89s51 這 裡,初學者要澄清微控制器實際使用方面的乙個產品概念,mcs 51微控制器是美國inte公司於1980年推出的產品,典型產品有 8031 內...
基於89c51晶元的開發 搶答器
搶答器簡介 總共有8個按鈕,其中7個按鈕給選手使用,1個按鈕給主持人使用,當1位選手按下按鈕後,對應的led燈將會變亮,同時靜態數碼管上會顯示該名選手的號碼,另外6位選手無論怎麼按按鈕都不會發生改變 只有通過主持人手中的復位按鈕才會使led燈熄滅,並且靜態數碼管上數字消失。include sbit ...