哪位前輩可以幫我看看 RS232 對8051 |
答題得分者是:vans007
|
hanah77h12
一般會員 發表:12 回覆:39 積分:10 註冊:2011-10-01 發送簡訊給我 |
各位前輩 我電路照這個接
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; 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 發送簡訊給我 |
不知你是否要做與藍芽的連線? 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/ |
hanah77h12
一般會員 發表:12 回覆:39 積分:10 註冊:2011-10-01 發送簡訊給我 |
|
kib72377
高階會員 發表:1 回覆:217 積分:238 註冊:2004-11-12 發送簡訊給我 |
|
hanah77h12
一般會員 發表:12 回覆:39 積分:10 註冊:2011-10-01 發送簡訊給我 |
|
vans007
一般會員 發表:9 回覆:11 積分:9 註冊:2008-12-28 發送簡訊給我 |
#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 } 其實從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 |
hanah77h12
一般會員 發表:12 回覆:39 積分:10 註冊:2011-10-01 發送簡訊給我 |
|
dootf
一般會員 發表:3 回覆:10 積分:7 註冊:2011-10-02 發送簡訊給我 |
正巧我也正在學習 8051 與 RS232 的通訊。
vans007 提供的程式,經我的測試,可以完全無誤的傳送接收。 這裡也提供你我自己寫的小小測試,但我是使用 VB 來達成的,你也可以測試看看。 另外,你 PO 上來的程式碼,我覺得改成下面的方式,或許會好一些,提供你參考。 void UART_int(void) interrupt 4 { if(RI==1) // 我是覺得另外設定一個 全域變數(例如 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; } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |