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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3466|回復: 13
打印 上一主題 下一主題
收起左側

一個初學者請教老師傅這個PIC單片機程序為什么不運行?

[復制鏈接]
跳轉到指定樓層
樓主
ID:248656 發(fā)表于 2019-3-23 18:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
tmr0 equ 01h                   ;定義TMR0定時器/計數器的地址
status equ 03h                 ;定義狀態(tài)寄存器地址
portd equ 08h                  ;定義端口D的寄存器的地址
trisd equ 88h                  ;定義端口D的方向控制寄存器的地址
option_reg equ 81h             ;定義選項寄存器的地址
intcon equ 0bh                 ;定義一個中斷端控制寄存器的地址
c equ 0                        ;定義狀態(tài)寄存器進位標志C的指示位
rp0 equ 5h                     ;定義狀態(tài)寄存器頁選位的指示位
w equ 0                        ;定義傳送目標寄存器為W的指示位
f equ 1                        ;定義傳送目標寄存器為F的指示位
z equ 2                        ;定義狀態(tài)寄存器零標志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                ;定義一個顯示緩沖區(qū)
w_temp equ 7fh                 ;定義一個W備份寄存器
tmr0_d equ 0                   ;定義TMR0的初始值
;--------------------------------- 付復位向量------------------------
org 000h                       ;定義程序存放區(qū)域的起始位置
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                   ;點亮,即將緩沖區(qū)內容先傳入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                 ;恢復狀態(tài)寄存器的體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                   ;帶進位標志位循環(huán)右移緩沖區(qū)寄存器
goto l1                        ;跳轉到L1
loop1
movlw 9
movwf m
s2
decfsz m,f
goto k1
goto k2
k1  
rlf portd_b
goto s2
k2                    ;帶進位標志位循環(huán)左移緩沖區(qū)寄存器
goto l1                        ;跳轉到L1                           
;-----------------------延時子程序-----------------------------
delay
movlw 0ffh                     ;將外層循環(huán)變量值送W
movwf dly1                     ;送入用作外循環(huán)變量的DLY1
lp0
movlw 0ffh                     ;將內層循環(huán)變量值送W
movwf dly2                     ;送入用作內循環(huán)變量的DLY2
lp1
decfsz dly2,f                  ;內層變量DLY2內容遞減,若為0跳躍
goto lp1                       ;跳轉到LP1
decfsz dly1,f                  ;外層變量DLY1內容遞減,若為0跳躍
goto lp0                       ;跳躍LP0
return                         ;返回主程序
end                            ;

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:401564 發(fā)表于 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
回復

使用道具 舉報

板凳
ID:248656 發(fā)表于 2019-3-24 07:47 | 只看該作者
我將程序燒到板子上,我設計的是流水燈,但是出來的結果是8個燈全亮常亮
回復

使用道具 舉報

地板
ID:123289 發(fā)表于 2019-3-24 08:04 | 只看該作者
除了時鐘被關閉之外,單片機就沒有不運行時候!
回復

使用道具 舉報

5#
ID:248656 發(fā)表于 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
回復

使用道具 舉報

6#
ID:401564 發(fā)表于 2019-3-28 19:24 | 只看該作者
asd-123 發(fā)表于 2019-3-28 17:32
配置位設置
FOSC=HS OSCILLATOR
WDTE=DISABLE

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

使用道具 舉報

7#
ID:248656 發(fā)表于 2019-3-29 18:15 | 只看該作者
匯編語言能夠設置配置位嗎?在程序里如何編寫?
回復

使用道具 舉報

8#
ID:248656 發(fā)表于 2019-3-29 18:42 | 只看該作者
tmr0 equ 01h                ;定義定時器和計數器0寄存器地址
pcl equ 02h                 ;定義程序計數器低字節(jié)寄存器地址
status equ 03h              ;定義狀態(tài)寄存器地址
option_reg equ 81h          ;定義選項寄存器地址
intcon equ 0bh              ;定義中斷寄存器地址
portd equ 08h               ;定義端口D的數據寄存器的地址
trisd equ 88h               ;定義端口D的方向控制寄存器地址
dly equ 20h                 ;定義一個外循環(huán)延時變量
dly1 equ 21h                ;定義一個內循環(huán)變量延時變量
flag1 equ 22h               ;定義一個左右移標志
flag2 equ 23h               ;定義一個亮滅標志
w_temp equ 24h              ;定義一個臨時備份寄存器
portd_b equ 25h             ;定義一個顯示緩沖區(qū)寄存器
m equ 26h                   ;定義一個計數器變量
w equ 0                     ;定義傳送目標寄存器為W的指示位
f equ 1                     ;定義傳輸目標寄存器為RAM的指示位
tmr0_b equ 0                ;定數器初始值
rp0 equ 5                   ;在狀態(tài)寄存器中的頁選位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              ;點亮,即將緩沖區(qū)先送入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             ;恢復狀態(tài)寄存器的體0
movlw 0a0h                 ;將中端控制碼先送W
movwf intcon               ;開放全局中斷和定時器0中斷
bcf intcon,t0if            ;清除TMR0溢出中斷標志位
movlw tmr0_b               ;TMR0賦初值
movwf tmr0                 ;啟動TMR0定時計數器
movlw 0feh                 ;將驅動碼送入W
movwf portd_b              ;將驅動碼送入顯示緩沖區(qū)
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返回,循環(huán)檢測
;----------------------------------右移-------------------------------------------
c1
rrf portd_b,f                ;帶進位循環(huán)右移指令
goto m1                    ;返回計數器
;----------------------------------返回計數器--------------------------------------------
c2
goto l1                    ;返回檢測左右移標志位
;----------------------------左移子程序----------------------------------------
loop1
movlw 9                    ;將計數器初值先送W
movwf m                    ;轉送到M
;------------------------------------------------------------------------------
s2
decfsz m,f                 ;計數器減一,為0,跳一步,否,順序執(zhí)行
goto k1                    ;跳到左移
goto k2                    ;計數器為0返回,循環(huán)檢測
;------------------------------------------------------------------------------
k1
rlf portd_b,f                ;帶進位循環(huán)左移
goto s2                    ;返回計數器
;------------------------------------------------------------------------------
k2
goto l1                    ;跳回檢測左右移標志
;-----------------------------延時子程序----------------------------------------
delay
movlw 0ffh                 ;將外層循環(huán)參數0FF先送W
movwf dly                  ;再轉送到DLY
;-------------------------------------------------------------------------------
lp0
movlw 0ffh                 ;將內層循環(huán)參數0FFH先送W
movwf dly1                 ;再轉送到DLY1
;-------------------------------------------------------------------------------
lp1
decfsz dly1,f              ;內層循環(huán)參數DLY1自減一,若為0,跳一步
goto lp1                   ;返回循環(huán)自減LP1
decf dly,f                 ;外層循環(huán)參數DLY自減一,若為0,跳一步
goto lp0                   ;跳回循環(huán)自減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
機子就是不運行,怎么回事?????????
回復

使用道具 舉報

9#
ID:342822 發(fā)表于 2019-3-29 19:13 | 只看該作者
沒問題~pic16f577可以運行。
回復

使用道具 舉報

10#
ID:342822 發(fā)表于 2019-3-29 19:27 | 只看該作者
仿真可以運行

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

捕獲.PNG
回復

使用道具 舉報

11#
ID:401564 發(fā)表于 2019-3-29 22:04 | 只看該作者
asd-123 發(fā)表于 2019-3-29 18:42
tmr0 equ 01h                ;定義定時器和計數器0寄存器地址
pcl equ 02h                 ;定義程序計 ...

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

使用道具 舉報

12#
ID:248656 發(fā)表于 2019-3-30 07:35 | 只看該作者
我也是頭一個遇到,試了好幾遍,不行我用的芯片PIC877A
回復

使用道具 舉報

13#
無效樓層,該帖已經被刪除
14#
ID:401564 發(fā)表于 2019-3-30 11:44 | 只看該作者
asd-123 發(fā)表于 2019-3-30 07:35
我也是頭一個遇到,試了好幾遍,不行我用的芯片PIC877A

你試了我給你的程序沒有?
不要仿真,要在實際的PCB板上運行的,不一定要完全的接上顯示,至少是輸出和ADC端口隨便接一下,也不一定要數碼管,LED接上幾個也行,只要是能確定程序已經在運行就可以了
你用的IC和我用的是一樣的,代碼是可以兼容的
回復

使用道具 舉報

15#
ID:248656 發(fā)表于 2019-4-7 20:30 | 只看該作者
老師,我試了。謝謝,能多給接例子好讓我學習進步老師能把電話給我嗎?我要多請教
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表