1.
A,學習匯編語言編程
B,學習使用編程軟件和下載器在單片機上編程
C,學習學習嵌入式的方法
2. 任務要求
用匯編語言編程實現LED燈閃爍
3. 實驗器材
單片機PIC16F886一片、LED燈一只、電阻任選、下載器(及相關的線)一個
4. 實驗方案
圖
圖
5. 調試過程
先使LED燈亮,再寫延時程序,最后實現閃燈。最后的結果是可以實現閃燈,但是閃燈的頻率和亮滅時間比例還不能精確控制。
6. 實驗現象分析
奇怪的現象:(還沒有解決)
1,只寫讓LED燈亮的程序,即
LIST
INCLUDE
ORG
BANKSEL
CLRF
CLRF
MOVLW
MOVWF
END
時,在PICKIT
2,如果采用延時、翻轉如此循環,即循環部分分別為
A.loop
comf
goto
B.loop
call
call
call
call
comf
goto
C.loop
call
call
call
call
call
call
call
call
call
comf
goto
時,測到的實際頻率都在0.48Hz左右(采用的時候總周期是默認的4MHz),然而一個循環中delay調用次數越多,燈亮的時間越短,滅的時間越長。當時鐘頻率選擇127kHz時,調用3個delay時就已經不會亮了。
3,如果采用清零、延時、置位、延時的循環,發現LED每次亮滅的時間基本相同,但是,每亮滅五次后,會有一次燈滅的時間稍微長一點。改變時鐘頻率后也是這樣。猜測是delay函數寫得有問題。
這三個現象計劃的解決方法是單步調試和仿真。
(寫完這份報告時,杜航同學提醒說我在delay中用到了decfsz函數,而decfsz函數的操作范圍只有0~127,而我設置的卻是0ffh,已超出該范圍。)
之前曹航用127kHz的時鐘,假設四個時鐘周期是一個指令周期,假設按照之前以為的2^8*2^8*2*2,周期在8s左右,實驗出來的結果卻在2s左右。按照杜航的說法,實際的一個周期內指令一共2^7*2^7*2*2,則計算得到燈的周期為2.06秒,實驗時計算到的現象是亮燈周期2s左右,比較符合。但是具體是不是這樣還要進一步驗證。
額,剛剛把delay中的0ffh改成07fh發現燈明顯閃爍快了。所以之前的假設不成立。
附:
INCLUDE
org
nop
BANKSEL
BCF
BCF
BSF
BANKSEL
movlw
movwf
BANKSEL
movlw
movwf
loop
CALL
BSF
CALL
BCF
goto
;-------------------------廷時子程序----------------------------
delay
lp0
lp1
return
end