線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1204
推到 Plurk!
推到 Facebook!

8051AD轉換的問題??

缺席
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-15 11:45:09 IP:163.13.xxx.xxx 未訂閱
我現在要做一個8051AD電路,我把adc0804接在p0,led接在p1。 我是接可變電阻,來改變輸入adc的電壓,在讀到p0的訊號後, 做一個簡單的運算處理,使p1的led只會亮四種方式。 下面是我的程式,可是我不管怎麼調led都不會亮, 請問我程式那裡有問題~~
;=====================================
;建立暫存器
B             EQU     32H
;==============設定初始位址===========
        .ORG     00H
        LJMP        MAIN
        .ORG        03H
        LJMP        INDATA
;=====================================
MAIN:
        MOV        P1,#0
        CLR        P2.0
        MOVX        A,@R1
        SETB        P2.0
        CLR        TCON.0
        MOV        IE,#10000001B
AGAIN:
        CLR        P2.0
        MOVX        @R1,A
        SETB        P2.0
        SETB        F0
        JB        F0,$
        SJMP        AGAIN
;=====================================
INDATA:
        CLR        P2.0
        MOVX        A,@R1
         MOV      B,#04H
         DIV      AB
         MOV      A,B
         MOV         DPTR,#300H
        MOVC         A,@A DPTR
        MOV        P1,A
        SETB        P2.0
        CLR        F0
        RETI
;============300H=========================
        .ORG 300H
        .DB     00010001B 
        .DB     00100010B
        .DB     01000100B
        .DB     10001000B
        .END        
            
發表人 - ㊣ 於 2005/06/15 19:05:42
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-15 12:11:47 IP:163.13.xxx.xxx 未訂閱
抱歉,按得太快,打的不清楚 我是覺得這段比較有問題,DIV的語法是第一次用,不知有沒有錯 INDATA: CLR P2.0 MOVX A,@R1 MOV B,#04H DIV AB MOV A,B MOV DPTR,#300H MOVC A,@A DPTR MOV P1,A SETB P2.0 CLR F0 RETI

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-15 19:09:08 IP:211.22.xxx.xxx 未訂閱
首先,B為51內建的一個暫存器.你又定義一個B在32H,當然會有問題. 這邊先改過,再試試看吧!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-16 20:57:07 IP:163.13.xxx.xxx 未訂閱
我把B的暫存器刪掉,led是會亮,但怎麼跟我想的不一樣, 我原本想要的是將左邊的adc輸出值,改成右邊的值,由p1輸出, 00000000 00010001 00000001 00100010 00000010 01000100 00000011 10001000 00000100 00010001 00000101 00100010 00000110 01000100 00000111 10001000 . . . . . . 11111111 10001000 但是我燒程式去跑時,led亮得方式變成下面這樣, 0~64 00010001 65~128 00100010 129~192 01000100 193~256 10001000 是那邊有問題??

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-16 23:57:28 IP:220.134.xxx.xxx 未訂閱
1>F0是什麼? 2>請將你修改後的code po上來
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-17 00:29:53 IP:163.13.xxx.xxx 未訂閱
;==============設定初始位址=========== .ORG 00H LJMP MAIN .ORG 03H LJMP INDATA ;==============主程式================== MAIN: MOV P1,#0 CLR P2.0 ;/CS=0,P2接在adc0804上 MOVX A,@R1 SETB P2.0 CLR TCON.0 ;設定外部中斷0為低準位觸發 MOV IE,#10000001B ;至能外部中斷0 AGAIN: CLR P2.0 MOVX @R1,A SETB P2.0 SETB F0 ;F0=1表等待中斷 JB F0,$ ;等待中斷 SJMP AGAIN ;==========中斷服務副程式=============== INDATA: CLR P2.0 MOVX A,@R1 MOV B,#04H DIV AB MOV A,B MOV DPTR,#300H MOVC A,@A DPTR MOV P1,A SETB P2.0 CLR F0 RETI ;============300H========================= .ORG 300H .DB 00010001B .DB 00100010B .DB 01000100B .DB 10001000B .END F0為中斷旗標,F0=1表示AD轉換尚未完成, F0=0則表示AD轉換完成。

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-17 00:44:21 IP:220.134.xxx.xxx 未訂閱
PO程式碼請縮排,不知道如何做,請參考版規. 煩請修改配合,謝謝!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-20 12:10:22 IP:163.13.xxx.xxx 未訂閱
MOVX A,@R1 MOV B,#04H DIV AB MOV A,B MOV DPTR,#300H MOVC A,@A DPTR MOV P1,A .ORG 300H .DB 00010001B .DB 00100010B .DB 01000100B .DB 10001000B ============================================ 我原本想要的是將左邊的ADC0804輸出值,改成右邊的值,由p1輸出, 00000000------- 00010001 00000001------- 00100010 00000010------- 01000100 00000011------- 10001000 00000100------- 00010001 00000101------- 00100010 00000110------- 01000100 00000111------- 10001000 . . . . . . 11111111------- 10001000 但是我燒程式去跑時,P1的輸出值卻變成下面這樣, 0~64 ----00010001 65~128 ----00100010 129~192 ----01000100 193~256 ----10001000 是那邊有問題??

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-20 19:29:21 IP:211.22.xxx.xxx 未訂閱
我看不懂你在寫什麼....... 請問你怎麼將A/D的值讀進去?
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-20 22:12:37 IP:163.13.xxx.xxx 未訂閱
;===主程式=== : CLR P2.0 MOVX A,@R1;A/D開始轉換 SETB P2.0 : A/D轉換完後/INTR會輸出低電位,使8051產生外部中斷 ;===中斷副程式=== : CLR P2.0 MOVX A,@R1;讀入A/D的值 SETB P2.0 : 利用外部中斷讀入A/D的值。 我現在的問題是,我在讀入A/D的值後,利用DIV AB這個指令, MOVX A,@R1 MOV B,#04H DIV AB MOV A,B MOV DPTR,#300H MOVC A,@A+DPTR MOV P1,A 計算讀入的值後,再由P1輸出,可是輸出的值有問題, 請問我上面那段程式是那裡出錯??

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-20 22:34:37 IP:220.134.xxx.xxx 未訂閱
MOVX A,@R1 把上面這一行改為這樣試試: MOV A,P0
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
tku_telent
一般會員


發表:23
回覆:21
積分:8
註冊:2004-03-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-21 13:33:59 IP:163.13.xxx.xxx 未訂閱
我把程式改成MOV A,P0後,P1變成完全沒有值輸出。 還有我P0是直接,接在ADC0804上,中間沒有接提昇電阻, 我記得是只能用MOOVX這個指令,可以用MOV這個指令嗎? 請問還有沒有其他方法? 還是我要把電路改一改??
addn
高階會員


發表:64
回覆:221
積分:202
註冊:2005-03-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-21 20:47:21 IP:218.171.xxx.xxx 未訂閱
引言: MOVX A,@R1 MOV B,#04H DIV AB MOV A,B MOV DPTR,#300H MOVC A,@A DPTR MOV P1,A .ORG 300H .DB 00010001B .DB 00100010B .DB 01000100B .DB 10001000B ============================================ 我原本想要的是將左邊的ADC0804輸出值,改成右邊的值,由p1輸出, 00000000------- 00010001 00000001------- 00100010 00000010------- 01000100 00000011------- 10001000 00000100------- 00010001 00000101------- 00100010 00000110------- 01000100 00000111------- 10001000 . . . . . . 11111111------- 10001000 但是我燒程式去跑時,P1的輸出值卻變成下面這樣, 0~64 ----00010001 65~128 ----00100010 129~192 ----01000100 193~256 ----10001000 是那邊有問題??
你修改過以後的程式看起來沒問題啊 可以先試試將AD轉換後的資料直接 給P1,先確定這一部份有無問題(測試時將VR轉動看看 LED反映正不正確),如果這部分正確把程式加上/4取餘數 指令試試,這樣一步一步試著找出問題

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-21 22:32:44 IP:220.134.xxx.xxx 未訂閱
MOV P1,#0 這一行後面加入 MOV P0,#FFH 試試,若一樣有問題.就照addn兄說的,一步步try,找出原因吧.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
系統時間:2024-05-21 11:31:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!