專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

pic單片機(jī)閃燈實(shí)驗(yàn)(Hello World)實(shí)驗(yàn)報告

作者:佚名   來源:互聯(lián)網(wǎng)   點(diǎn)擊數(shù):  更新時間:2014年08月14日   【字體:

1.  實(shí)驗(yàn)?zāi)康?/span>

A,學(xué)習(xí)匯編語言編程

B,學(xué)習(xí)使用編程軟件和下載器在單片機(jī)上編程

C,學(xué)習(xí)學(xué)習(xí)嵌入式的方法

2.  任務(wù)要求

用匯編語言編程實(shí)現(xiàn)LED燈閃爍

3.  實(shí)驗(yàn)器材

單片機(jī)PIC16F886一片、LED燈一只、電阻任選、下載器(及相關(guān)的線)一個

4.  實(shí)驗(yàn)方案

 

 

 

圖 1 硬件設(shè)計(jì)圖

 

 

圖 2 軟件流程圖

5.  調(diào)試過程

先使LED燈亮,再寫延時程序,最后實(shí)現(xiàn)閃燈。最后的結(jié)果是可以實(shí)現(xiàn)閃燈,但是閃燈的頻率和亮滅時間比例還不能精確控制。

6.  實(shí)驗(yàn)現(xiàn)象分析

奇怪的現(xiàn)象:(還沒有解決)

1,只寫讓LED燈亮的程序,即

LIST p=16f886

INCLUDE p16f886.inc

ORG 0x00

BANKSEL TRISC

CLRF TRISC

CLRF STATUS

MOVLW B'00001111'

MOVWF PORTC

END

時,在PICKIT 2中選擇5V on ,測得Vdd=4.2V,萬用表直流電壓檔測得PIN RC3 2.7V ,示波器測時發(fā)現(xiàn)RC3引腳是頻率是50Hz,幅值是2.7V的正方波。LED可以一直亮,但是不是預(yù)期的一直置位。還沒有找到原因。

2,如果采用延時、翻轉(zhuǎn)如此循環(huán),即循環(huán)部分分別為

A.loop call delay

comf portc,1

goto loop

B.loop call delay

call delay

call delay

call delay

call delay

comf portc,1

goto loop

C.loop call delay

call delay

call delay

call delay

call delay

call delay

call delay

call delay

call delay

call delay

 

comf portc,1

goto loop

時,測到的實(shí)際頻率都在0.48Hz左右(采用的時候總周期是默認(rèn)的4MHz),然而一個循環(huán)中delay調(diào)用次數(shù)越多,燈亮的時間越短,滅的時間越長。當(dāng)時鐘頻率選擇127kHz,調(diào)用3delay時就已經(jīng)不會亮了。

3,如果采用清零、延時、置位、延時的循環(huán),發(fā)現(xiàn)LED每次亮滅的時間基本相同,但是,每亮滅五次后,會有一次燈滅的時間稍微長一點(diǎn)。改變時鐘頻率后也是這樣。猜測是delay函數(shù)寫得有問題。

 

 

這三個現(xiàn)象計(jì)劃的解決方法是單步調(diào)試和仿真。

 

(寫完這份報告時,杜航同學(xué)提醒說我在delay中用到了decfsz函數(shù),而decfsz函數(shù)的操作范圍只有0~127,而我設(shè)置的卻是0ffh,已超出該范圍。)

之前曹航用127kHz的時鐘,假設(shè)四個時鐘周期是一個指令周期,假設(shè)按照之前以為的2^8*2^8*2*2,周期在8s左右,實(shí)驗(yàn)出來的結(jié)果卻在2s左右。按照杜航的說法,實(shí)際的一個周期內(nèi)指令一共2^7*2^7*2*2,則計(jì)算得到燈的周期為2.06秒,實(shí)驗(yàn)時計(jì)算到的現(xiàn)象是亮燈周期2s左右,比較符合。但是具體是不是這樣還要進(jìn)一步驗(yàn)證。

 

額,剛剛把delay中的0ffh改成07fh發(fā)現(xiàn)燈明顯閃爍快了。所以之前的假設(shè)不成立。

 

 

 

 

 

附:

INCLUDE P16F886.INC
org   000h      
nop             
BANKSEL OSCCON
BCF OSCCON,4
BCF OSCCON,5
BSF OSCCON,6
BANKSEL TRISC
movlw   00h       
movwf   TRISC    
BANKSEL PORTC   
movlw  000h       
movwf  PORTC   
  
loop 
CALL delay
BSF PORTC,3
CALL delay
BCF PORTC,3
goto loop

;-------------------------廷時子程序----------------------------
delay                       ;子程序名,也是子程序入口地址
       movlw   0ffh          ;將外層循環(huán)參數(shù)值FFH經(jīng)過W
       movwf   20h          ;送入用作外循環(huán)變量的20H單元
lp0    movlw   0ffh          ;將內(nèi)層循環(huán)參數(shù)值FFH經(jīng)過W
       movwf   21h           ;送入用作內(nèi)循環(huán)變量的21H單元
lp1    decfsz   21h,1         ;變量21H內(nèi)容遞減,若為0跳躍
           goto     lp1           ;跳轉(zhuǎn)到LP1處
       decfsz    20h,1         ;變量20H內(nèi)容遞減,若為0跳躍
       goto     lp0           ;跳躍到LP0處
return

end

關(guān)閉窗口