利用8051來偵測高電壓低電壓的問題 |
答題得分者是:阿信
|
bigann
一般會員 發表:1 回覆:1 積分:0 註冊:2005-05-04 發送簡訊給我 |
我是想偵測高低電壓 超過2.6V 或低於2.4V 透過RS232可以在電腦上顯示 high voltage 跟 low voltage我是利用可變電組來改變電壓 利用ADC0804來將0~5V轉換成數位訊號 我是用P1來讀取ADC0804的轉換值 用555來驅動ado0804 所以他可以一直轉換0到5v的值 我是用進位旗標寫的 MOV A,P1 然後 CLR C 接下來 SUBB A,#133 然後JNC 副程式 但是就是不會跳到副程式 有人可以教我嗎 以下是我的程式:
;-------------------------------- LF EQU 0AH CR EQU 0DH ;---------------------- ORG 0H JMP START ;主程式起始位址 ;---------------------- START: MOV SCON,#50H MOV TMOD,#20H MOV TH1,#0FDH SETB TR1 SETB TI MOV SP,#60 READ: MOV A,P1 CALL DELAY2 CLR C SUBB A#133 ;大於2.6v JNC LARGE AJMP START LOOP: MOV A,P1 CLR C SUBB A#122 ;小於2.4v JNC SMALL JMP START ;---------------------- LARGE: MOV DPTR,#ATAC3 CALL TX_STR RET ;---------------------- SMALL: MOV DPTR,#ATAC2 CALL TX_STR RET ;----------------------- TX_CHAR: JNB TI,$ CLR TI MOV SBUF, A RET ;----------------------- TX_STR: CLR A MOVC A,@A DPTR CJNE A,#'$', $1 RET $1: CALL TX_CHAR INC DPTR JMP TX_STR RET ;----------------------- DELAY: ;10s MOV R5,#100 S1: MOV R6,#250 S2: MOV R7,#200 S3: DJNZ R7,S3 DJNZ R6,S2 DJNZ R5,S1 RET ;----------------------- DELAY2: ;5s MOV R5,#50 S1: MOV R6,#250 S2: MOV R7,#200 S3: DJNZ R7,S3 DJNZ R6,S2 DJNZ R5,S1 RET ;----------------------- ATAC2: DB "low voltage",'$' ;------------------------------------------ ATAC3: DB "high voltage",'$' ;------------------------------------------ END發表人 - ㊣ 於 2005/05/04 19:32:39 |
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
LF EQU 0AH CR EQU 0DH ;---------------------- ORG 0H JMP START ;主程式起始位址 ;---------------------- START: MOV SCON,#50H MOV TMOD,#20H MOV TH1,#0FDH SETB TR1 SETB TI MOV SP,#60 READ: MOV A,P1 CALL DELAY2 CLR C SUBB A,#133 ;大於2.6V JC LARGE ; <== 註1-1 ;改成"JC"夠減才跳 ; AJMP START ; <== 這行不要 LOOP: MOV A,P1 CLR C SUBB A,#122 ;小於2.4V JNC SMALL ; <== 註1-2 JMP START ;---------------------- LARGE: MOV DPTR,#ATAC3 CALL TX_STR RET ; <== 註1-3 ;---------------------- SMALL: MOV DPTR,#ATAC2 CALL TX_STR RET ; <== 註1-4 ;----------------------- TX_CHAR: JNB TI,$ CLR TI MOV SBUF, A RET ;----------------------- TX_STR: CLR A MOVC A,@A DPTR CJNE A,#'$', $1 RET $1: CALL TX_CHAR INC DPTR JMP TX_STR RET ;----------------------- DELAY: ;10s MOV R5,#100 S1: MOV R6,#250 S2: MOV R7,#200 S3: DJNZ R7,S3 DJNZ R6,S2 DJNZ R5,S1 RET ;----------------------- DELAY2: ;5s MOV R5,#50 S1: MOV R6,#250 S2: MOV R7,#200 S3: DJNZ R7,S3 DJNZ R6,S2 DJNZ R5,S1 RET ;----------------------- ATAC2: DB "low voltage",'$' ;------------------------------------------ ATAC3: DB "high voltage",'$' ;------------------------------------------ END註1:用"JNC"去,然後用RET返回,不對吧! JNC是Jump if Not Carry ,Carry旗標沒設定就跳 RET要改成 JMP START PS.發表文章時 內文上方有格式 有個"#"符號 按一下 會出現 code /code 將程式插入code與/code中間 ------------------- 美好的事物 稍縱即逝 |
bigann
一般會員 發表:1 回覆:1 積分:0 註冊:2005-05-04 發送簡訊給我 |
不好意思版主 我沒有注意看板規就po文 下次我一定會注意的 阿信大大 我已經可以跑了 但是還有一個問題就是 我是用555驅動的 所以他會讓0804固定一直讀值 所以我變成超過2.6v的時候 會一直重複顯示high voltage high voltage....... 而且程式一開始執行就會顯示high voltage..... 我已經事先把電壓調到2.5V 我後來把範圍變大 高於200 低於50 一執行就是hight voltage 可以有辦法 超過200然候只顯示一次hight voltage 等到低於50 只顯示一次 low voltage嗎?
|
阿信
版主 發表:111 回覆:983 積分:813 註冊:2005-03-10 發送簡訊給我 |
先宣告 兩個位元 叫
fg_HighSended
fg_LowSended
ORG 0H JMP START0 ;主程式起始位址 ;---------------------- START0: clr fg_HighSended clr fg_LowSended START: MOV SCON,#50H MOV TMOD,#20H MOV TH1,#0FDH SETB TR1 SETB TI MOV SP,#60 CheckHigh: jb fg_HighSended,CheckHigh_Exit ;如果已顯示過high voltage就不再判斷 MOV A,P1 CALL DELAY2 CLR C SUBB A,#133 ;大於2.6V jnc CheckHigh_Exit ; 沒有大於上限值就離開 clr fg_LowSended set fg_HighSended jmp LARGE CheckHigh_Exit: CheckLow: jb fg_LowSended,CheckLow_Exit ;如果已顯示過low voltage就不再判斷 MOV A,P1 CLR C SUBB A,#122 ;小於2.4V jc CheckLow_Exit ; 沒有小於下限值就離開 clr fg_HighSended set fg_LowSended jmp SMALL CheckLow_Exit: JMP START程式沒有編譯過 可能有一些語法錯誤 但邏輯大致是這樣 ------------------- 美好的事物 稍縱即逝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |