欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 一個初學者請教老師傅這個PIC單片機程序為什么不運行? [打印本頁]

作者: asd-123    時間: 2019-3-23 18:58
標題: 一個初學者請教老師傅這個PIC單片機程序為什么不運行?
tmr0 equ 01h                   ;定義TMR0定時器/計數器的地址
status equ 03h                 ;定義狀態寄存器地址
portd equ 08h                  ;定義端口D的寄存器的地址
trisd equ 88h                  ;定義端口D的方向控制寄存器的地址
option_reg equ 81h             ;定義選項寄存器的地址
intcon equ 0bh                 ;定義一個中斷端控制寄存器的地址
c equ 0                        ;定義狀態寄存器進位標志C的指示位
rp0 equ 5h                     ;定義狀態寄存器頁選位的指示位
w equ 0                        ;定義傳送目標寄存器為W的指示位
f equ 1                        ;定義傳送目標寄存器為F的指示位
z equ 2                        ;定義狀態寄存器零標志Z的指示位
t0if equ 2                     ;定義TMR0的溢出標志位
t0ie equ 5                     ;定義TMR0的使能標志位
flag equ 24h                   ;定義一個亮滅標志位
flag2 equ 25h                  ;定義一個左右移標志
m equ 8                        ;定義一個常數寄存器
dly1 equ 20h                   ;定義一個延時變量寄存器
dly2 equ 21h                   ;定義另一個延時變量寄存器
portd_b equ 23h                ;定義一個顯示緩沖區
w_temp equ 7fh                 ;定義一個W備份寄存器
tmr0_d equ 0                   ;定義TMR0的初始值
;--------------------------------- 付復位向量------------------------
org 000h                       ;定義程序存放區域的起始位置
nop                            ;設置一條ICD必須的空操作指令
goto main                      ;
;----------------------------中斷向量和中斷服務子程序----------------
org 004h                       ;
tmr0serv                        ;中斷服務子程序名稱
movwf w_temp                   ;復制W倒塌的臨時備份寄存器W_TEMP中
bcf intcon,t0if                ;清除TMR0溢出中斷標志位
incf flag,f                    ;亮滅標志位(寄存器末位)翻轉
btfss flag,0                   ;標志位=1?是!跳一步到“熄滅”
goto jump0                     ;否,跳到“點亮”
clrf portd                     ;熄滅
goto jump1                     ;跳過下面的程序
jump0                           ;
movf portd_b                   ;點亮,即將緩沖區內容先傳入W
movwf portd                    ;再由W轉入端口寄存器,送顯
jump1                           ;
movlw tmr0_d                   ;TMR0賦初值
movwf tmr0                     ;并(重新)啟動定時器
movf w_temp,w                  ;恢復現場
retfie                         ;中斷返回
;----------------------------------主程序----------------------------
main
bsf status,rp0                 ;選擇文件寄存器的體1
movlw 00h                      ;將端口D的方向控制碼00H先送W
movwf trisd                    ;端口D得方向控制寄存器,設定為輸出
movlw 07h                      ;將選項寄存器的控制碼07H先送W
movwf option_reg               ;設定分頻比1:256
bcf status,rp0                 ;恢復狀態寄存器的體0
movlw 0a0h                     ;將中斷控制寄存器的控制碼A0H先送W
movwf intcon                   ;開放全局中斷和TMR0中斷
bcf intcon,t0if                ;清除TMR0溢出中斷標志位
movlw tmr0_d                   ;TMR0賦初值
movwf tmr0                     ;啟動定時器
movlw 0feh                     ;顯示驅動碼送入W
movwf portd_b                  ;顯示驅動碼送顯示緩沖寄存器
bsf status,c                   ;   
l1
movlw 01h                      ;
xorwf flag2,f                  ;      
btfss flag2,0                  ;判斷左右移標志=1,左移
goto loop                      ;右移
goto loop1                     ;左移
loop
movlw 0ah
movwf m
m1
decfsz m,f
goto c1
goto m2
c1
rrf portd_b
goto m1
m2                   ;帶進位標志位循環右移緩沖區寄存器
goto l1                        ;跳轉到L1
loop1
movlw 9
movwf m
s2
decfsz m,f
goto k1
goto k2
k1  
rlf portd_b
goto s2
k2                    ;帶進位標志位循環左移緩沖區寄存器
goto l1                        ;跳轉到L1                           
;-----------------------延時子程序-----------------------------
delay
movlw 0ffh                     ;將外層循環變量值送W
movwf dly1                     ;送入用作外循環變量的DLY1
lp0
movlw 0ffh                     ;將內層循環變量值送W
movwf dly2                     ;送入用作內循環變量的DLY2
lp1
decfsz dly2,f                  ;內層變量DLY2內容遞減,若為0跳躍
goto lp1                       ;跳轉到LP1
decfsz dly1,f                  ;外層變量DLY1內容遞減,若為0跳躍
goto lp0                       ;跳躍LP0
return                         ;返回主程序
end                            ;


作者: Y_G_G    時間: 2019-3-24 04:48
什么叫不運行呢?你從哪里看出來不運行了?
你的程序估計沒幾個看得明白,PIC沒有像8051那樣明顯的標號,你就應該搞什么虛線之類的分開,好讓人找到GOTO指令跳轉到哪里了
估計你這是仿真的吧
代碼的開頭沒有配置單片機的晶振,復位電壓之類的
像這樣:#include <p16f877a.inc>        ;包含了PIC16F877A的寄存器聲稱文件
    __CONFIG _FOSC_HS & _WDTE_OFF & _PWRTE_OFF & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
作者: asd-123    時間: 2019-3-24 07:47
我將程序燒到板子上,我設計的是流水燈,但是出來的結果是8個燈全亮常亮

作者: yzwzfyz    時間: 2019-3-24 08:04
除了時鐘被關閉之外,單片機就沒有不運行時候!
作者: asd-123    時間: 2019-3-28 17:32
配置位設置
FOSC=HS OSCILLATOR
WDTE=DISABLE
PWRTE=DISABLE
BORETN=DISABLE
LVP=HV ON MCLR MUST BE USED
CPD=OFF
WRT=OFF
CP=OFF
作者: Y_G_G    時間: 2019-3-28 19:24
asd-123 發表于 2019-3-28 17:32
配置位設置
FOSC=HS OSCILLATOR
WDTE=DISABLE

配置位應該是在代碼里面的,而且還得開關就是的,我用過PIC16F877A,就是這樣的

作者: asd-123    時間: 2019-3-29 18:15
匯編語言能夠設置配置位嗎?在程序里如何編寫?
作者: asd-123    時間: 2019-3-29 18:42
tmr0 equ 01h                ;定義定時器和計數器0寄存器地址
pcl equ 02h                 ;定義程序計數器低字節寄存器地址
status equ 03h              ;定義狀態寄存器地址
option_reg equ 81h          ;定義選項寄存器地址
intcon equ 0bh              ;定義中斷寄存器地址
portd equ 08h               ;定義端口D的數據寄存器的地址
trisd equ 88h               ;定義端口D的方向控制寄存器地址
dly equ 20h                 ;定義一個外循環延時變量
dly1 equ 21h                ;定義一個內循環變量延時變量
flag1 equ 22h               ;定義一個左右移標志
flag2 equ 23h               ;定義一個亮滅標志
w_temp equ 24h              ;定義一個臨時備份寄存器
portd_b equ 25h             ;定義一個顯示緩沖區寄存器
m equ 26h                   ;定義一個計數器變量
w equ 0                     ;定義傳送目標寄存器為W的指示位
f equ 1                     ;定義傳輸目標寄存器為RAM的指示位
tmr0_b equ 0                ;定數器初始值
rp0 equ 5                   ;在狀態寄存器中的頁選位0
t0if equ 2                  ;定義TMR0的中斷標志位
;-------------------------------復位向量-------------------------------------
org 000h                   ;設置復位矢量
nop                        ;放置一條ICD必須的空操作
goto main                  ;跳轉到主程序
;-----------------------中斷向量和中斷服務程序-------------------------------
org 004h                  ;
tmr0serv                    ;中斷服務子程序
movwf w_temp               ;復制W到他的臨時備份寄存器W—temp中
bcf intcon,t0if            ;清除TMR0溢出中斷標志位
incf flag2,f               ;亮滅標志位(寄存器)反轉
btfss flag2,0               ;標志位=1?是!跳一步到熄滅“
goto jump                  ;否!跳到”點亮“
goto jump1                 ;熄滅
;----------------------------熄滅-------------------------------------------
jump                        ;
movlw portd_b              ;點亮,即將緩沖區先送入W
movwf portd                ;再由W轉入端口D寄存器,送顯
;-----------------------------點亮----------------------------------------------
jump1                       ;
movlw 0ffh                 ;將立即數0FFH先送到W
movlw portd                ;熄滅
movlw tmr0_b               ;TMR0賦初值
movwf tmr0                 ;啟動定時器
movf w_temp,w              ;恢復現場
retfie                     ;中斷返回
;-------------------------------主程序---------------------------------------
main                        
bcf status,rp0             ;設置文件寄存器的體1
movlw 00h                  ;將端口D的方向控制碼00H先送到W
movwf trisd                ;轉送到方向寄存器,端口D設為輸出
movlw 07h                  ;設定選項寄存器內容,分頻器給TMR0
movwf option_reg           ;分頻比為1:256
bcf status,rp0             ;恢復狀態寄存器的體0
movlw 0a0h                 ;將中端控制碼先送W
movwf intcon               ;開放全局中斷和定時器0中斷
bcf intcon,t0if            ;清除TMR0溢出中斷標志位
movlw tmr0_b               ;TMR0賦初值
movwf tmr0                 ;啟動TMR0定時計數器
movlw 0feh                 ;將驅動碼送入W
movwf portd_b              ;將驅動碼送入顯示緩沖區
call delay                 ;延時子程序
clrf flag1                 ;清零標志位
;-----------------------------------------------------------------------------
l1
movlw 01h                  ;將立即數01H先送W
xorwf flag1,f              ;和FLAG2相或,標志位取反
btfss flag1,0              ;測試標志位=1,是跳到左移。否!跳到右移
goto loop                  ;否!右移
goto loop1                 ;是!跳到左移
;---------------------------右移子程序-----------------------------------------
loop
movlw 09                   ;將計數初值送W
movwf m                    ;再轉送到M
;------------------------------------------------------------------------------
m1
decfsz m,f                 ;計數器減一,為0,跳一步。不為0,右移
goto c1                    ;跳到C1(右移)
goto c2                    ;計數器為0返回,循環檢測
;----------------------------------右移-------------------------------------------
c1
rrf portd_b,f                ;帶進位循環右移指令
goto m1                    ;返回計數器
;----------------------------------返回計數器--------------------------------------------
c2
goto l1                    ;返回檢測左右移標志位
;----------------------------左移子程序----------------------------------------
loop1
movlw 9                    ;將計數器初值先送W
movwf m                    ;轉送到M
;------------------------------------------------------------------------------
s2
decfsz m,f                 ;計數器減一,為0,跳一步,否,順序執行
goto k1                    ;跳到左移
goto k2                    ;計數器為0返回,循環檢測
;------------------------------------------------------------------------------
k1
rlf portd_b,f                ;帶進位循環左移
goto s2                    ;返回計數器
;------------------------------------------------------------------------------
k2
goto l1                    ;跳回檢測左右移標志
;-----------------------------延時子程序----------------------------------------
delay
movlw 0ffh                 ;將外層循環參數0FF先送W
movwf dly                  ;再轉送到DLY
;-------------------------------------------------------------------------------
lp0
movlw 0ffh                 ;將內層循環參數0FFH先送W
movwf dly1                 ;再轉送到DLY1
;-------------------------------------------------------------------------------
lp1
decfsz dly1,f              ;內層循環參數DLY1自減一,若為0,跳一步
goto lp1                   ;返回循環自減LP1
decf dly,f                 ;外層循環參數DLY自減一,若為0,跳一步
goto lp0                   ;跳回循環自減LP0
return                     ;返回主程序
end                        ;源程序結束
我從寫了一下
配置位設置
FOSC=HS OSCILLATOR
WDTE=DISABLE
PWRTE=DISABLE
BORETN=DISABLE
LVP=HV ON MCLR MUST BE USED
CPD=OFF
WRT=OFF
CP=OFF
機子就是不運行,怎么回事?????????
作者: taotie    時間: 2019-3-29 19:13
沒問題~pic16f577可以運行。
作者: taotie    時間: 2019-3-29 19:27
仿真可以運行

捕獲.PNG (46.81 KB, 下載次數: 71)

捕獲.PNG

作者: Y_G_G    時間: 2019-3-29 22:04
asd-123 發表于 2019-3-29 18:42
tmr0 equ 01h                ;定義定時器和計數器0寄存器地址
pcl equ 02h                 ;定義程序計 ...

在代碼的第一行呀!注釋不算,配置位在所有代碼的前面
但我不知道你用的是什么版本的IDE,我用mplab x ide就是這樣子的,在配置位設定那設定好配置位,然后再生成代碼,再粘貼到代碼的開始
這是一個我用PIC16F877A寫的一個ADC程序,已經在開發板上驗證成功過的了 PIC16F877A_ADC.rar (1.77 KB, 下載次數: 10)
用PICKIT直接下載就可以運行看到效果了
你可以參考一下

作者: asd-123    時間: 2019-3-30 07:35
我也是頭一個遇到,試了好幾遍,不行我用的芯片PIC877A
作者: Y_G_G    時間: 2019-3-30 11:44
asd-123 發表于 2019-3-30 07:35
我也是頭一個遇到,試了好幾遍,不行我用的芯片PIC877A

你試了我給你的程序沒有?
不要仿真,要在實際的PCB板上運行的,不一定要完全的接上顯示,至少是輸出和ADC端口隨便接一下,也不一定要數碼管,LED接上幾個也行,只要是能確定程序已經在運行就可以了
你用的IC和我用的是一樣的,代碼是可以兼容的
作者: asd-123    時間: 2019-4-7 20:30
老師,我試了。謝謝,能多給接例子好讓我學習進步老師能把電話給我嗎?我要多請教




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1