全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2774
推到 Plurk!
推到 Facebook!

整合AD0804, AT89C51, HIN232與 PC的問題(關於量測電壓)

答題得分者是:
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-18 18:24:14 IP:140.118.xxx.xxx 未訂閱
各位大大: 我想要量測電壓訊號傳送至電腦上, 其中訊號的流程為 AD0804--> AT89C51 --> HIN232 --> PC 己經測試過AD0804與AT89C51,AT89C51與PC 兩個都可以獨立運作 但我現在有一個問題, 就是兩個合併一起使用時會有問題 無法正常電壓傳送至電腦的動作. 問題出AT89C51的程式, 不知道問題出在那裏, 請各位幫忙.    AT89C51組合語言程式如下所示
;AD CONVERTER --> AT89C51 --> HIN232 --> PC    ORG 00H
JMP RESET
ORG 03H
JMP ExtInt0 
ORG 23H
JMP SERIES_IT
ORG 0BH
JMP TimerInt    RESET:
  MOV SP,#70H
  ;;-----USE TIMER 0 MODE 1,TIMER 1 MODE 2, 4000 us INTERRUPT-------
  MOV TMOD,#00100001B
  MOV SCON,#01010000B
  ;;-----AD CONVERT
  MOV TH0,#>(65536-4000)
  MOV TL0,#<(65536-4000)  
  MOV IE,#10011011B  ;ENABLE TIMER 0, INT0,TIMER 1 AND UART INTERRUPT
  MOV IP,#00000001B  ;choose INT0
  SETB TR0    ;START TIMER 0
  MOVX @R0,A  ;START A/D    
ADLoop:
  JMP ADLoop    ;;-----INT0 INTERRUPT
ExtInt0:
  PUSH A
  PUSH PSW
  SETB RS1     ;SELECT RB2
  CLR RS0
  MOVX A,@R0   ;READ A/D RESULT
  MOV  P1,A    ;AD VALUE SHOW AT P1      SETB TR1     ;START TIMER 1      MOVX @R0,A   ;START NEXT A/D CONVERT
  POP PSW
  POP A
RETI    ;;-----Timer 0 INTERRUPT SERVICE ROUTINE---------
TimerInt:
  MOV TH0,#>(65536-4000)
  MOV TL0,#<(65536-4000) 
RETI    ;;-----UART SERIES
SERIES_IT:
  JNB RI,EMIT_IT
  CLR RI
  MOV SBUF,A  ;;A/D CONVERT TRANSFER TO UART      CLR TR1    ;CLOSE TIMER 1
 
  JMP END_IT
EMIT_IT:  CLR TI
END_IT:   RETI    END    

版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-18 19:30:45 IP:211.22.xxx.xxx 未訂閱
你確定你讀ADC0804的值時都正常嗎? ORG 00H JMP RESET ORG 03H JMP ExtInt0 ORG 23H JMP SERIES_IT ORG 0BH JMP TimerInt ------> ORG 00H JMP RESET ORG 03H JMP ExtInt0 ORG 0BH JMP TimerInt ORG 23H JMP SERIES_IT ORG 30H ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-19 00:39:14 IP:140.118.xxx.xxx 未訂閱
大大,你好: 這個程式我有修改過了, 原本是兩個各別的程式, 我又修改一下合併成一個程式, 現在程式中將UART的部刪除後, 即可正確地轉換AD0804輸入的電壓值, 顯示在P1上, 但加上UART的部份之後就不能轉換電壓了, 這該怎麼辨呢? 請教大大.

版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-19 02:47:27 IP:59.113.xxx.xxx 未訂閱
ORG 00H
        JMP RESET
        ORG 03H
        JMP ExtInt0
        ORG 0BH
        JMP TimerInt 
        ORG 23H
        JMP SERIES_IT
        ORG 50H    RESET:
        MOV SP,#70H
        MOV TMOD,#00100001B
        ORL PCON,#10000000B ;
        MOV TH1,#0FDH       ;19200bps
        MOV SCON,#01010000B
        MOV TH0,#>(65536-4000)
        MOV TL0,#<(65536-4000)
        MOV IP,#00010000B  ;  
        MOV IE,#10010011B  ;ENABLE TIMER 0, INT0,AND UART INTERRUPT
        SETB TR0    ;START TIMER 0
        SETB TR1
        MOVX @R0,A  ;START A/D    
ADLoop:
          JMP ADLoop    ;;-----INT0 INTERRUPT
ExtInt0:
          PUSH A
          PUSH PSW
          SETB RS1     ;SELECT RB2
          CLR RS0
          MOVX A,@R0   ;READ A/D RESULT
          MOV  P1,A    ;AD VALUE SHOW AT P1
        MOV  SBUF,P1
          MOVX @R0,A   ;START NEXT A/D CONVERT
          POP PSW
          POP A
        RETI    ;;-----Timer 0 INTERRUPT SERVICE ROUTINE---------
TimerInt:
          MOV TH0,#>(65536-4000)
          MOV TL0,#<(65536-4000) 
        RETI    ;;-----UART SERIES
SERIES_IT:
          JBC TI,END_IT
          CLR RI
END_IT:
           RETI
         END
請將程式改成上述,試試看. ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-19 12:25:50 IP:140.118.xxx.xxx 未訂閱
大大,你好: 感謝您的指正, 8951的程式我試過了, 可以正確地在P1上顯示輸入的電壓值, 但傳送至電腦的數值與輸入電壓值為何不同呢? 而我電腦接收的程式如下所示. 請再一次您幫幫忙.    附上BCB版本5.0的程式
//---------------------------------------------------------------
#include 
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE handle;
DCB dcb;    //---------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit1->Text="";
Edit2->Text="";    COMMTIMEOUTS TimeOut;
TimeOut.ReadIntervalTimeout = 0;
TimeOut.ReadTotalTimeoutMultiplier = 0;
TimeOut.ReadTotalTimeoutConstant = 500;  //(總讀取 time out 時間 = 0.5 秒)
TimeOut.WriteTotalTimeoutMultiplier = 0;
TimeOut.WriteTotalTimeoutConstant = 500; //(總寫入 time out 時間 = 0.5 秒)    if(BuildCommDCB("9600,n,8,1",&dcb))
  { lbBuildCommDCB->Caption="BuildCommDCB 成功"; }
else
  { lbBuildCommDCB->Caption="BuildCommDCB 失敗"; }    handle=CreateFile("Com1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);    if(SetCommState(handle,&dcb))
  { lbSetCommState->Caption="SetCommState 成功"; }
else
  { lbSetCommState->Caption="SetCommState 失敗"; }    if(SetupComm(handle,1024,1024))
  { lbSetupComm->Caption="SetupComm 成功"; }
else
  { lbSetupComm->Caption="SetupComm 失敗"; }    if(SetCommTimeouts(handle,&TimeOut))
  { lbSetCommTimeouts->Caption="SetCommTimeouts 成功"; }
else
  { lbSetCommTimeouts->Caption="SetCommTimeouts 失敗"; }    }
//----------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
int ReceiveValue;
DWORD dwRead;
ReadFile(handle, &ReceiveValue, 1, &dwRead, NULL);
Form1->Edit2->Text=ReceiveValue;     Form1->Edit1->Text="";
}
//----------------------------------------------------------------    

版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-19 12:35:43 IP:59.113.xxx.xxx 未訂閱
if(BuildCommDCB("9600,n,8,1",&dcb)) 這一行請改為 if(BuildCommDCB("19200,n,8,1",&dcb)) ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-19 12:54:49 IP:140.118.xxx.xxx 未訂閱
為什麼回傳值變化那麼大, 再則其值變化沒有一個規則性, 我若將baudrate改為19200時, 結果是一樣地,為什麼呢? 再跟大大請教,謝謝.

版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-19 13:57:25 IP:59.113.xxx.xxx 未訂閱
引言: 為什麼回傳值變化那麼大, 再則其值變化沒有一個規則性, 我若將baudrate改為19200時, 結果是一樣地,為什麼呢? 再跟大大請教,謝謝.
51的振蕩器有用11.0592MHz的嗎? 它才能產生正確的baudrate ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-19 21:15:20 IP:140.118.xxx.xxx 未訂閱
我也是用11.0592MHz的振盪器, 而BCB在讀取資料的Timer設為1sec或0.5sec, 或者其他時間所得的結果都是一樣地, 有時還會不能產生不能接到傳送的訊號, 現在我該如何做才能獲得正確地資料嗎? 是BCB程式的問題呢? 或者是8051程式的問題呢? 再煩請您協助,謝謝.

版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-19 21:57:20 IP:59.113.xxx.xxx 未訂閱
引言: 我也是用11.0592MHz的振盪器, 而BCB在讀取資料的Timer設為1sec或0.5sec, 或者其他時間所得的結果都是一樣地, 有時還會不能產生不能接到傳送的訊號, 現在我該如何做才能獲得正確地資料嗎? 是BCB程式的問題呢? 或者是8051程式的問題呢? 再煩請您協助,謝謝.
應該是BCB的問題. 改由中斷寫看看吧.當com1上有傳送要求,就去讀取. ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?

版主


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-19 22:32:04 IP:59.113.xxx.xxx 未訂閱
可以先確定一下是那邊的問題. 51的串列埠部分,傳輸值改為固定,看看BCB收到的值是否正確,以及能否接收到. MOV SBUF,P1---->MOV SBUF,#0FH ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-19 23:04:53 IP:140.118.xxx.xxx 未訂閱
若將MOV SBUF,P1此改MOV SBUF,#0FH BCB不能接收數值, 而按下8051的RESET開關時 可以接收255的數值, 我想應該是BCB的問題吧,    Timer中的程式為
int ReceiveValue;
DWORD dwRead;
ReadFile(handle, &ReceiveValue, 1, &dwRead, NULL);
if(dwRead==0)
  { Form1->lbStatus->Caption="傳輸錯誤!"; }
else
  {
  Form1->Edit2->Text=ReceiveValue;
  Form1->Edit1->Text="";
  Form1->lbStatus->Caption="傳輸成功!";
  }

版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-20 02:57:24 IP:59.113.xxx.xxx 未訂閱
你的BCB部分大概有問題.這裡有BCB RS-232相關使用方式,參考一下吧! http://myweb.hinet.net/home5/finetech/TecDoc/Doc2/AcceRS232.htm ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-02-20 13:03:08 IP:140.118.xxx.xxx 未訂閱
我之前就是參考這篇文章做BCB的RS232傳輸, 而8051程式將大大的修改的部份, 與本篇8051程式將所要的功能整合在一起, 最後略作修改後,即可傳輸電壓訊號, 但還有一個問題,就是傳輸同一個電壓中, 在數次中就會得到一個錯誤的數據33, 怎麼會這樣嗎? 再一次請您賜教,謝謝.

版主


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-02-20 14:21:30 IP:59.113.xxx.xxx 未訂閱
引言: 我之前就是參考這篇文章做BCB的RS232傳輸, 而8051程式將大大的修改的部份, 與本篇8051程式將所要的功能整合在一起, 最後略作修改後,即可傳輸電壓訊號, 但還有一個問題,就是傳輸同一個電壓中, 在數次中就會得到一個錯誤的數據33, 怎麼會這樣嗎? 再一次請您賜教,謝謝.
是幾次會出現一次?都固定是33嗎? 若為固定,baudrate改為9200試試 51部分將這一行 ORL PCON,#10000000B 改為 ANL PCON,#01111111B ------------------------------------ 生命的目的,在幻化出多采多姿的組合。 生活的意義,在捕捉住稍縱即逝的感動。 ------------------------------------
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
TsannTay
一般會員


發表:20
回覆:34
積分:10
註冊:2003-04-10

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-02-20 15:17:21 IP:140.118.xxx.xxx 未訂閱
都是固定值33 而我去查了ASCII表 十進位33代表字元! 就是我在接收訊號之前, 先送一個字元!給51的, 然後再接收電壓訊號回來電腦, 所以才會有此問題產生. 我在想想看, 謝謝大大.
系統時間:2024-07-03 10:09:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!