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

哪位前輩可以幫我看看 RS232 對8051

答題得分者是:vans007
hanah77h12
一般會員


發表:12
回覆:39
積分:10
註冊:2011-10-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-11-23 00:16:53 IP:1.168.xxx.xxx 訂閱
 各位前輩 我電路照這個接 
http://www.freewebs.com/maheshwankhede/rs232.html
程式照這個打 現在發生一個問題..

他現在不是收不到 就是傳出去 收到一堆亂碼 這是怎麼了 哪位前輩可以幫我解答

#include
#include
//當序列中斷時(即收到RS232傳來的資料),8051會呼叫此函數
void UART_int(void) interrupt 4
{
if(RI==1)
{
RI = 0;
if(SBUF=='1') // 若PC端送來 '1',則回應 "1 ONE" 給PC
puts("ONE!");
else if(SBUF=='2') // 若PC端送來 '2',則回應 "2 TWO" 給PC
puts("2 TWO!");
else if(SBUF=='3') // 若PC端送來 '3',則回應 "3 THREE" 給PC
puts("3 THREE");
else if(SBUF=='4') // 若PC端送來 '4',則回應 "4 FOUR" 給PC
puts("4 FOUR");
else
puts("OTHERS!");
}
}
main()
{
int kbin;
SCON = 0x52; // 8 bit UART (mode 1), 啟動 Timer 1
TMOD = 0x20; // T0 mod 0, T1 mode 1
TH1 = 256-(28800/9600); //baudrate=9600
TL1 = TH1;
RI=0;
TI=0;
TR1 = 1; // 用KEIL C的 puts(), gets() 等來傳送RS232資料
ES = 1; // 開啟序列(RS232)中斷的開關
EA = 1; // 開啟中斷的總開關
while(1) {
kbin = kbscan();
if( kbin != 0xFF )
{
SBUF = kbin; //傳送給 PC
while(TI==0); //若TI=0,表示資料還未傳送完成
TI=0; //清除傳送旗標
}
}
}




ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-11-23 05:59:53 IP:59.115.xxx.xxx 訂閱
不知你是否要做與藍芽的連線?
Rs232的連線有問題時,比一般的硬體較不易察覺,所以你要採取分離法,各個部份分開測試,而且只傳送單一個字,若是能正常傳送時,再增加字數.
1) 8051 RS232部份先與PC的超級終端機做連線測試,超級終端機的使用可以在網路查到.
只先測一字,可以傳送時,再測試多字,測試的字為0~9,A~Z,a~z.
2) 若1)無法連線成功時,先自行寫一小段測試軟體,做8051的自我迴路的測試,這裡可以分為兩部份,
a)不接Max232,只做8051 的Txd,Rxd硬體短路,軟體迴路測試,由Txd送出一個30H~39H之間的值,再由Rxd接收回來,並且把這個值由另外一個Port接8個LED和電阻做偵測顯示用.
b) 接上Max232,把Rs232接頭2,3腳短路,其餘方式與a)相同.
3. 若2成功了,再重做1).
4. 以上都成功了,再繼續你原來的測試.

* 注意 : RS232的通訊是以ASCII的格式傳送,如'0'=30H ASCII=48,'1'=31H ASCII=49,...
------
高壓模組,高壓直流電源供應器(全範圍可調電壓電流),中低壓直流電源供應器,電壓放大器,
電流放大器,帶通濾波器,高精度參考電壓,標準電壓,恆流源(定電流源),恆壓源(定電壓源),
測試LED專用AC LED定電流源,專門接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,
研究單位實驗設備,另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A.
http://hvpower.myweb.hinet.net/
...Scott Wang...
hanah77h12
一般會員


發表:12
回覆:39
積分:10
註冊:2011-10-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-11-23 12:40:37 IP:114.41.xxx.xxx 訂閱
我現在有做測試直接將RS232  TX RX接再一起 用超級終端機  接收  傳送都可以  接到MAX232  再將MAX的輸出  兩個接再一起  也是可以正常傳接 我把MAX232接到8051 他就收不到 不然就是收到都亂碼 也不知道怎麼了= =

kib72377
高階會員


發表:1
回覆:217
積分:238
註冊:2004-11-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-11-23 13:35:24 IP:125.233.xxx.xxx 未訂閱
 鮑率?
51的震盪晶體頻率多少?
一般要接來和PC通訊的通常會選11.059MHz喔,
這樣鮑率誤差比較小.
hanah77h12
一般會員


發表:12
回覆:39
積分:10
註冊:2011-10-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-11-23 15:06:35 IP:114.41.xxx.xxx 訂閱
 鮑率9600 

石英震盪晶體12M 11.059M都用過
vans007
一般會員


發表:9
回覆:11
積分:9
註冊:2008-12-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-11-23 16:41:13 IP:114.34.xxx.xxx 訂閱
#include<reg52.h>
#include
/////////11.0592Mhz//////////////
void delay1ms(int count);
main()
{
delay1ms(2) ; // 時間延遲
/* 初始化RS232 通訊介面*/
/* 通訊協定: <9600 N 8 1> */
SCON=0x50; /* 設定串列介面工作於模式1,接收資料致能*/
TMOD=0x20; /* 設定計時器1 工作於模式2 */
TH1 =0xFD; /* 設定鮑率為9600 BPS */
TR1=1; /* 啟動計時器1 開始計數*/
TI=1; /* 設定串列傳送中斷產生旗號*/
////////////////////////////////////////
while(1)
{
printf("test");
delay1ms(1000);
printf("%2X",P1);
}
////////////////////////////////////////
}
void delay1ms(int count)
{
int i,j;
for(i=0;i for(j=0;j<122;j );
}


其實從KEIL C的DEBUG中就可以模擬了
http://photo.xuite.net/chip_8051/5303600/1.jpg
http://photo.xuite.net/chip_8051/5303600/2.jpg
http://photo.xuite.net/chip_8051/5303600/3.jpg




編輯記錄
vans007 重新編輯於 2011-11-23 01:42:01, 註解 無‧
vans007 重新編輯於 2011-11-23 01:47:54, 註解 無‧
hanah77h12
一般會員


發表:12
回覆:39
積分:10
註冊:2011-10-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-11-23 20:01:11 IP:114.41.xxx.xxx 訂閱
 謝謝前輩...我剛剛燒你的程式進去 他會回傳TEST FF  然後我燒自己的還是不行..


dootf
一般會員


發表:3
回覆:10
積分:7
註冊:2011-10-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-11-27 17:22:24 IP:123.193.xxx.xxx 未訂閱
正巧我也正在學習 8051 與 RS232 的通訊。

vans007 提供的程式,經我的測試,可以完全無誤的傳送接收。

這裡也提供你我自己寫的小小測試,但我是使用 VB 來達成的,你也可以測試看看。

另外,你 PO 上來的程式碼,我覺得改成下面的方式,或許會好一些,提供你參考。

void UART_int(void) interrupt 4
{
if(RI==1) // 這裡的 if 可以不需要,進入串列中斷程式的必要條件就是,硬體設定 RI = 1的時候
{
RI = 0;
if(SBUF=='1') // 若PC端送來 '1',則回應 "1 ONE" 給PC
puts("ONE!");
else if(SBUF=='2') // 若PC端送來 '2',則回應 "2 TWO" 給PC
puts("2 TWO!");
else if(SBUF=='3') // 若PC端送來 '3',則回應 "3 THREE" 給PC
puts("3 THREE");
else if(SBUF=='4') // 若PC端送來 '4',則回應 "4 FOUR" 給PC
puts("4 FOUR");
else
puts("OTHERS!"); // 我是覺得另外設定一個 全域變數(例如 char a),然後中斷副程式中直接寫 a = SBUF 即可
} // 條件判斷則寫到其他的副程式或者主程式中,應該就可以達到你要的效果了。
}

// 如下是我的程式碼,已測試成功,若你需要 VB 的程式,以便做測試,給我 mail 再寄給你(不知要如何貼上檔案)
#include

unsigned char chknum;
void delay(int kk);
void uart(void);

//---------------
void main(void)
{
IE = 0x90;
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xfd;
TR1 = 1;
TI = 1;
RI = 0;
P1 = 0xff;
while (1)
{
if (chknum=='A')
{
P1 = ~P1;
delay(3000);
}
else
{
P1 = 0xff;
}
}
}

//---------------
void delay(int kk)
{
while(kk-->0);
}

//---------------
void uart(void) interrupt 4
{
chknum = SBUF;
RI = 0;
}

系統時間:2017-10-23 8:58:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!