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

89C51ED2 透過RS232與電腦之間資料傳送的問題

缺席
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-18 14:07:15 IP:140.114.xxx.xxx 未訂閱
大家好,我買了益仲出的89C51的實習版,使用上面的指撥開關改變P0的接腳電位高低,用此當作是一筆資料透過RS232傳送給電腦端的BCB程式接收,同樣的,再BCB這邊輸入一數字或字母,傳送給89C51,把此資料顯示再P1上面,P1有接8科LED 藉以顯示其收到的資料的值 以下是程式    電腦端的BCB程式 
 
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hComm;
boolean DTRState;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::openClick(TObject *Sender)
{
char* comno;
DCB dcb;
String temp;
temp="Com" IntToStr(rdCOM->ItemIndex 1);
comno=temp.c_str();
hComm=CreateFile(comno,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hComm==INVALID_HANDLE_VALUE)
{
 MessageBox(0,"Comm error","通訊錯誤",MB_OK);
 return;
}
 GetCommState(hComm,&dcb);
 dcb.BaudRate=CBR_9600;
 dcb.ByteSize=8;
 dcb.Parity=NOPARITY;
 dcb.StopBits=ONESTOPBIT;
 if(!SetCommState(hComm,&dcb))
 {
      MessageBox(0,"Comm error","通訊錯誤",MB_OK);
       CloseHandle(hComm);
       return;
 }
   if(!SetupComm(hComm,2,2))
        {
          MessageBox(0,"Comm error","通訊錯誤",MB_OK);
          CloseHandle(hComm);
          return;           }        EscapeCommFunction(hComm,CLRDTR);       }
   //---------------------------------------------------------------------------
void __fastcall TForm1::sendClick(TObject *Sender)
{
 String temp;     int in;
 unsigned long lrc,BS;
 if(hComm==0)
 return;
 temp= Msend->Text;
 BS=temp.Length();      char *senddata;
  senddata=temp.c_str();
  cbiq->Text=(BS);
  WriteFile(hComm,&buffer,1,&lrc,NULL);
}
//-------------------------------------------------------------------
void __fastcall TForm1::RECIEVEClick(TObject *Sender)
{
      DCB dcb;
         String temp;
char inbuff[496000];
DWORD nBytestRead,dwEvent,dwError;
COMSTAT cs;
ClearCommError(hComm,&dwError,&cs);
GetCommState(hComm,&dcb);    if(cs.cbInQue>sizeof(inbuff))
{
 PurgeComm(hComm,PURGE_RXCLEAR);
 return;
}
 ReadFile(hComm,inbuff,cs.cbInQue,&nBytestRead,NULL);
 inbuff[cs.cbInQue]='\0';
 mrecive->Text=mrecive->Text inbuff;    }
//------------------------------------------------------------------
8051內部的程式是如下
 
#include           // 將硬體宣告AT89X51.H 包含進來
void delay_1m(unsigned int dly);  // 宣告delay_1m()函數
void UART_int();              // 宣告UART中斷服務程式
void main() {           //  主程式開始
     TMOD=0x20;        // 設定Timer1在Mode2
     PCON=PCON&0x7f;   // 清除SMOD
     TH1=0xFD;         // 設定baud rate=9600,
     TR1=1;            // 啟動Timer1
     SCON=0x50;        // UART Mode1,REN=1
     IP=0x10;          // 設定UART中斷為高優先權,PS=1
     IE=0x90;          // 致能UART中斷,EA=1 & ES=1
    while(1) {            // 無窮迴圈
       SBUF=~P0;       // 將Port0的資料由串列埠傳送出去
       delay_1m(2000); // 延遲2S
     }
}
/***************************************************************************
中斷副程式        : UART_int() interrupt 4
目的                : 定義UART中斷服務程式
****************************************************************************/
void UART_int() interrupt 4
{
    if (RI==1){         // 若RI=1,為接收中斷
          RI=0;           // 清除接收中斷旗標
          P1=~SBUF;      // 將接收到的資料由Port1輸出
    } else
      TI=0;            // 若RI=0,為傳送中斷,清除傳送中斷旗標
}
/***************************************************************************
副程式            :  delay_1m
輸入引數    : 無號16位元整數unsigned int dly
說明        : 此副程式,引數dly為delay的長短控制
            : 1 dly = 1msec
****************************************************************************/
void delay_1m(unsigned int dly)  
{
   int count;    // 宣告count為一個整數變數(大小為16 bits)
                 // 當count=120,
                 // 執行while(count>0) count--; 約為1mS(石英晶體=12MHz)
   while(dly != 0) {
         count=120;
       while(count>0)    
          count--;       
    dly--;
}
}
現在問題是,我再BCB端丟出一個值譬如說A好了,A的ASCII值是65(0x41) 照理說我應該會再8051版子上看到LED燈號是01000001(1亮0滅),但是事實非如此,根本就是亂亮,且我再版子上用指撥開關搬一個組合,譬如說00110001(0x31) 他的ASCII對應到"1" 照理說我應該再BCB端收到"1",但卻是中文的亂碼,不知道為何這樣,我用這一個版子做串列自傳自收,8051顯示的燈號都沒問題, 所以我用是撥器量了一下8051送出的串列資料,發現真的根課本一樣都是10bit start bit 8bit data stop bit沒有錯誤(指波輸入多少就是多少);但是我量一下由電腦端送出的資料時,發現再TXD端的信號都跟8051的不同,且不管送什麼資料,電腦的RS232 TXD波型都一樣,但是我確定我的BCB程式可以兩台互傳字串沒問題,電腦com port在XP作業系統的com1設定為99600 N 8 1 , BCB也是,8051也是都正確,所以想請各位幫小第指點一下 謝謝各位
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-18 15:13:40 IP:220.139.xxx.xxx 未訂閱
請將振盪晶體改成11.0592MHz試試看
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-18 17:19:52 IP:140.114.xxx.xxx 未訂閱
你好..我現在的震盪器就已經是11.0592MHZ了,程式那個注解是她們公司寫的 忘記補充我的電腦端RS232連接到8051之間還有一科max232 IC... 謝謝
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-18 17:25:43 IP:140.114.xxx.xxx 未訂閱
我第一篇文章的最底下應該是包率 9600 打太快多一個9 謝謝
src
高階會員


發表:1
回覆:94
積分:154
註冊:2005-08-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-11-18 20:03:44 IP:220.139.xxx.xxx 未訂閱
問題應該出在PC端的程式,你用的程式我不懂 建議參考http://myweb.hinet.net/home11/macgyvertek/data/Com&PGM51.zip 該程式為AT89S51的燒錄程式及RS232傳送及接收
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-11-19 01:30:20 IP:210.201.xxx.xxx 未訂閱
如果你是用益眾的AT89C51ED2實習板 那恭喜你有30%機會可以解決 如果你用ATMEL FILP程式燒錄AT89C51ED2 那恭喜你有50%機會可以解決 如果你照著說明設定FILP參數 那恭喜你 可以將你PC端的鮑率設成19200.... 因為我也搞在這兩三天 問了好多人才知道調成X2 mode 你的AT89C51ED2可是在TURBO狀態啊:) PS. 我都不知道益眾有附程式 我都去ATMEL抓code... 有SPI跟UART的範例...還不錯用!

版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-11-19 10:32:12 IP:203.203.xxx.xxx 未訂閱
1> 用超級終端機收看看就知道是不是你 BCB 的問題了. 2> max232 的旁路 C 你用多少? 3> PC 端送"A" 51 P1 端的燈號有可能是 "01000001", 也有可能是 "10111110". 看你電路怎麼接. 個人認為如 src 兄所說, 問題應該在你的BCB程式.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-11-19 13:50:12 IP:140.114.xxx.xxx 未訂閱
謝謝大家的回應...    to killop : 如果你是用益眾的AT89C51ED2實習板 那恭喜你有30%機會可以解決 如果你用ATMEL FILP程式燒錄AT89C51ED2 那恭喜你有50%機會可以解決 如果你照著說明設定FILP參數 那恭喜你 可以將你PC端的鮑率設成19200.... 因為我也搞在這兩三天 問了好多人才知道調成X2 mode 你的AT89C51ED2可是在TURBO狀態啊:) PS. 我都不知道益眾有附程式 我都去ATMEL抓code... 有SPI跟UART的範例...還不錯用! ============================================================= 請問你說的30% 50%的機會可以解決是為什麼呢??? 為何要調成X2 mode ??? 你說我的8051是在turbo狀態..是指說我目前的模式可以將震盪器加至最大上限60MHZ嗎(data sheet 的首頁說明),這樣除了速度變快之外有什麼差別呢?? 我的flip 是ATMEL的沒錯,編譯C的編譯器是 Keil公司網頁上的 uVesion2 C51 編譯軟體. 謝謝 to ㊣ 1> 用超級終端機收看看就知道是不是你 BCB 的問題了. 2> max232 的旁路 C 你用多少? 3> PC 端送"A" 51 P1 端的燈號有可能是 "01000001", 也有可能是 "10111110". 看你電路怎麼接. max232的電容是 22uF/25V . 我再PC端送"A" 傳給8051..8051再透過port腳位輸出給8科LED燈號,結果燈號完全不正確,同樣的8051傳給電腦BCB端,收到的顯示出來也是中文亂碼,但是8051的串列輸出波型很正確,而BCB端電腦的RS232TXD送出的波型,我不管怎麼送,波型都一樣,我不知道為何,最奇怪的就是這一點了,既然電腦端送出的串列波型都一樣,那為何我兩台電腦之間的字元傳送都是正常的呢....且用示波器量了一下發現似乎電腦送的資料寬度和週期似乎都跟8051送出來的不同,但是我兩邊的通訊協定都是一樣的, 是不是兩邊的通訊協定都一樣 8051送一個資料是10bit , start bit 8bit data stop bit,電腦端也是如此...兩邊送出資料時的串列波型應該要一至吧 謝謝
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-11-19 14:29:54 IP:140.117.xxx.xxx 未訂閱
30% 50% 是說你的問題跟我遇到問題的相似度啦:) 如果你跟我ㄧ樣都是用 1). 益眾的AT89C51ED2實習板 編號:A12-0012 功能與特色: 1.AT89C51ED2為8位元微控制器,內部程式記憶體為64Mbytes,SRAM有1792 bytes,工作頻率可達60MHz,適合用來設計容量龐大的程式。 2.不需要透過燒錄器,由RS-232串列埠(COM埠)接收電腦傳送的執行檔。 2). 使用ATMEL的FLIP燒錄程式 3). 依照光碟的FLIP使用說明設定參數 (他送的文件裡面有說要勾選X2) 因為我寫UART程式也遇到PC端跟8051傳送RS232訊號不正確 如此需要設Baudrate為19200 如果你燒錄時沒有勾選X2 那你Baudrate 9600就應該可以動 普通8051一週期是12個CLOCK 但在X2 modeㄧ週期是6個CLOCK 所以他的Baudrate 9600x2 你前文說你用實習板 所以你的線路應該都是正確的 你將接收的程式baudrate設成19200收收看 再PO情況上來吧:) PS. 電腦的終端機程式 記得將流量控制設成"無" 發表人 - killop 於 2005/11/19 14:32:41
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-11-19 15:04:38 IP:140.117.xxx.xxx 未訂閱
另外 不知道你有沒有注意到 益眾的AT89C51ED2實習版上有個jump 如果你要用RS232時 你的JUMP都要調到89C51那端 也就是兩個jump(1,2)要往下搬     X2是在CKCON0 Register中 (AT89C51RD2/ED2的datasheet P.19) Set to select 6 clock periods per mechine cycle (X2 mode)
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-11-19 15:04:45 IP:140.114.xxx.xxx 未訂閱
TO Killop     30% 50% 是說你的問題跟我遇到問題的相似度啦:) 如果你跟我ㄧ樣都是用 1). 益眾的AT89C51ED2實習板 編號:A12-0012 功能與特色: 1.AT89C51ED2為8位元微控制器,內部程式記憶體為64Mbytes,SRAM有1792 bytes,工作頻率可達60MHz,適合用來設計容量龐大的程式。 2.不需要透過燒錄器,由RS-232串列埠(COM埠)接收電腦傳送的執行檔。 2). 使用ATMEL的FLIP燒錄程式 3). 依照光碟的FLIP使用說明設定參數 (他送的文件裡面有說要勾選X2) 因為我寫UART程式也遇到PC端跟8051傳送RS232訊號不正確 如此需要設Baudrate為19200 如果你燒錄時沒有勾選X2 那你Baudrate 9600就應該可以動 普通8051一週期是12個CLOCK 但在X2 modeㄧ週期是6個CLOCK 所以他的Baudrate 9600x2 你前文說你用實習板 所以你的線路應該都是正確的 你將接收的程式baudrate設成19200收收看 再PO情況上來吧:) PS. 電腦的終端機程式 記得將流量控制設成"無" 你好...我不太董你的意思..Flip的燒錄程式中 我確實有勾選X2,但是他的目的是否是將我原本8051程式中所設定的傳輸包率給乘以兩倍,那如果真的是這樣的話我8051程式中 TMOD=0x20; // 設定Timer1在Mode2 PCON=PCON&0x7f; // 清除SMOD TH1=0xFD; // 設定baud rate=9600, TR1=1; // 啟動Timer1 SCON=0x50; // UART Mode1,REN=1 所設定的9600實際上再傳輸時後是以乘以兩倍的速度在送,那麼以後我不管程式設定多少包率....我在電腦端不論是用超級終端機或是BCB的RS232程式,所設定的包率值不就都要乘以2了媽??? 他的X2書上沒說明.他的X2意思是這樣嗎..因為現在硬體不在我這所以也只好先用討論的看看.. 請問你已經可以成功接收了嗎??? 謝謝
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-11-19 15:06:29 IP:140.114.xxx.xxx 未訂閱
有的,我每次要用RS232功能時,都會先關掉電源,再把你圖中的jump往下搬 再恢復電源
killop
一般會員


發表:14
回覆:17
積分:11
註冊:2003-09-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-11-19 15:33:20 IP:140.117.xxx.xxx 未訂閱
你可以在這個網頁下載C51 UART Code Examples http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3420 這些範例是可以用的 我測試過 用Keilc打開project編譯就可以下載到AT89C51ED2了 因為震盪器的脈波是固定的 普通8051一機械週期是12個 但是89c51ed2裡的X2 mode讓它變成6個 所以感覺上像是變成2倍 建議你把X2選項取消 所以我現在也是不用X2...鮑率就是9600 等到比較熟悉了再來玩玩X2 mode...我現在功力還不夠 還不需要用到 另外不管89c51ed2程式設成9600 or 其他鮑率 只要在X2 mode下 你就要在RS232另外一端(例如電腦的終端機)的鮑率設成2倍 發表人 - killop 於 2005/11/19 15:37:41
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-11-22 20:16:20 IP:140.114.xxx.xxx 未訂閱
謝謝你 它可以正常動作了
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-11-29 14:18:02 IP:140.114.xxx.xxx 未訂閱
您好.因為您跟我一樣是使用益仲的89C51ED2實習版子 所以想再跟您請教一下問題.. 就是若是你的一個程式中,程式只有 while(1) P2=0x0F;(隨便一個值) 燒進去後用示波器量P2接腳,你的輸出電位是正確的嗎??我的都是low 不知道為何這樣,但是我一跟一跟接腳直接定址 while(1) { P2_0=1; . . P2_7=1; } 結果就正確 若是輸入 while(1) { P2=0x0F (隨便一個值) P3=0x01 (隨便一個值) } P2結果就正確 你的也會這樣嗎
系統時間:2024-03-28 20:15:18
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!