8051 串列接收 |
答題得分者是:src
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
我已經在電腦端寫好了VB 也有在DB9那裡短接TX,RX了 不過 傳送到8051後資料怎麼都傳不回來 我是接 pc -> rs232 -> max232 -> 8051 12M bps 9600 拜託各位大大幫我看那裡有寫錯了... [code c#] #include char c = 0; void delay(unsigned int time); void init_rs232() ; void interr_s (void) interrupt 4 { if (RI) { RI = 0; c = SBUF; } else TI = 0; } main(void) { init_rs232(); while (1) { delay(100); SBUF = c; TI = 0; while (TI == 0); } } void init_rs232() { SCON = 0x70; //0111 0000 TMOD = 0x20; //0010 0000 TH1 = 0xFD; //9600 bps TR1 = 1; //timer1 start TI = 1; ES = 1; //serial interrupt EA = 1; // interrupt all } void delay(unsigned int time) { int n; while (time > 0) { n = 120; while (n > 0) n--; time--; } } [/code] 請各位大大幫我看是硬體錯還是軟體寫錯好嗎... 謝謝各位大大 |
vans007
一般會員 發表:9 回覆:11 積分:9 註冊:2008-12-28 發送簡訊給我 |
其實pc與8051的串列傳輸只要 PC<---->RS232<---->8051 不需要再透過max232 只要把RS232的RX TX GND接到8051的TX RX GND 當然要對應好每支腳
這個地方是傳送給電腦端的程式 你的程式已經寫成中斷的方式 所以主程式只要 main() { while(1) { printf("%c",c);///只要有資料輸入就會印出 因為SBUF資料會送給c } } 若有問題請和我聯絡shiming73@gmail.com 更多資料 http://seelectron.phpbb.net/viewtopic.php?f=13&t=8 |
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
|
vans007
一般會員 發表:9 回覆:11 積分:9 註冊:2008-12-28 發送簡訊給我 |
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
我又寫了新的程式去燒了 不過還是不行耶 可以幫我檢查一下嗎 [code c#] #include unsigned char delay(unsigned char time); void init_rs232 (void); char ch; main (void) { init_rs232(); TI = 1; while (1) { delay(100); if (RI) { ch = SBUF; RI = 0; } else { TI = 0; SBUF = ch; while (TI == 0); } } } unsigned char delay(unsigned char time) { int n; while (time > 0) { n = 120; while (n > 0) n--; time --; } } void init_rs232 (void) { SCON = 0x50; TMOD = 0x20; TH1 = 230; TL1 = 230; TR1 = 1; } [/code] ===================引 用 vans007 文 章=================== 這樣接是沒錯的不會爆的 因為RS232的TX RX的電位並不是 15 -15V 我貼給你的網址有看到嗎 照著弄應該是沒錯的 有可能是你的振盪器 改用11.059MHZ試看看吧,應該是可以的
編輯記錄
saiki 重新編輯於 2008-12-30 20:09:52, 註解 無‧
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
以下程式是測試OK的請參考
石英振盪11.0592MHZ傳輸速率9600 該程式功能為:當收到PC的一個字立即回傳 [code delphi] #include unsigned char delay(unsigned char time); void init_rs232 (void); char ch; main (void) { init_rs232(); while (1) { if (RI) { RI = 0; ch = SBUF; TI = 0; SBUF = ch; while (TI == 0); } } } void init_rs232 (void) { SCON = 0x50; TMOD = 0x20; TH1 = 0xfd; TR1 = 1; } |
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
請問可以給我一個用中斷寫的例子嗎@@?
我是要用中斷寫 市面上的書籍都寫的不清楚 = = ===================引 用 src 文 章=================== 以下程式是測試OK的請參考 石英振盪11.0592MHZ傳輸速率9600 該程式功能為:當收到PC的一個字立即回傳 |
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
[code delphi] #include bit rx_flag; bit tx_flag; void init_rs232 (void); char ch; main (void) { init_rs232(); while (1) { if (rx_flag == 1) { rx_flag = 0; while (tx_flag == 0); tx_flag = 0; SBUF = ch; } } } void interr_s (void) interrupt 4 { if (RI) { RI = 0; rx_flag = 1; ch = SBUF; } else { TI = 0; tx_flag = 1; } } void init_rs232 (void) { SCON = 0x50; TMOD = 0x20; TH1 = 0xfd; TR1 = 1; IE = 0X90; tx_flag = 1; } ===================引 用 saiki 文 章=================== 請問可以給我一個用中斷寫的例子嗎@@? 我是要用中斷寫 市面上的書籍都寫的不清楚 = = ===================引 用 src 文 章=================== 以下程式是測試OK的請參考 石英振盪11.0592MHZ傳輸速率9600 該程式功能為:當收到PC的一個字立即回傳 |
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
可以再問一個問題嗎@@? 我是要做接收的電子鐘 為什麼我改一改後 怎麼我的七段都閃一下就沒了 串列的中斷會和timer0的中斷相衝嗎@@? 可以幫我看看嗎@@? [code c#] #include unsigned char ascii[4] = {0}; short pc_count = 0; unsigned char int0 = 0; unsigned char secclk = 0; unsigned char time[4] = {0}; //time[3] = min, time[2] = Min,time[1] = hour, time[0] = Hour unsigned char table[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 0~9; bit rx_flag; bit tx_flag; void init_rs232(void); unsigned char decoder(unsigned char time); //void delay(unsigned int time); void int_s (void) interrupt 4 { if (RI) { pc_count = pc_count 1; if (pc_count == 4) { pc_count = 0; } ascii[pc_count] = SBUF; RI = 0; rx_flag = 1; time[pc_count] = ascii[pc_count] - 0x30; //ascii to integer } } void time0_int(void) interrupt 1 { TH0 = (65536-50000)/256; TL0 = (65536-50000)%6; int0 ; //50ms; = 0.05sec; if (int0 == 20) //1sec; { int0 = 0; secclk ; } if (secclk == 60) //60sec = 1 min { secclk = 0; time[3] ; if (time[3] == 10) //min = 10, Min { time[3] = 0; time[2] ; if (time[2] == 6 && time[3] == 0) //Min = 6, min = 10,hour ; { time[2] = 0; time[3] = 0; time[1] ; if (time[1] == 10) //hour = 10 , Hour { time[1] = 0; time[0] ; if (time[0] == 2 && time[1] == 4) //hour = 4,Hour = 2, { time[0] = 0; time[1] = 0; } } } } } } main(void) { init_rs232(); while (1) { unsigned char i; unsigned char com; com = 0x01; if (rx_flag == 1) rx_flag = 0; for (i = 3;i >= 0;i--) { P0 = ~com; //output to P0 (scan) P1 = decoder(time[i]); com = com << 1; } } } void init_rs232(void) { TMOD = 0x21; //time1 mod 2, time0 mod 1 SCON = 0x50; // SM1 = 1, mod 1, REN = 1 ET0 = 1; //interrupt time start ES = 1; //serial interrupt start EA = 1; //inetrrupt start PS = 1; //serial interrupt is first TI = 0; TH0 = (65536-50000)/256; //time0 0.05s TL0 = (65536-50000)%6; TR0 = 1; //time0 start TH1 = 243; //bps 9600 TL1 = 243; //bps 9600 TR1 = 1; //time1 start } unsigned char decoder(unsigned char time) //decoder to 7-seg { switch (time) { case 0 : return table[0]; break; case 1 : return table[1]; break; case 2 : return table[2]; break; case 3 : return table[3]; break; case 4 : return table[4]; break; case 5 : return table[5]; break; case 6 : return table[6]; break; case 7 : return table[7]; break; case 8 : return table[8]; break; case 9 : return table[9]; break; } } /*void delay(unsigned int time) //delay 1ms { unsigned int n; while (time > 0) { n = 120; while (n>0) n--; time--; } }*/ [/code] ===================引 用 src 文 章=================== rx_flag為接收旗標,當收到PC的一個字進入中斷將rx_flag旗標設為1,主程式的迴路只要判斷rx_flag=1就知道收到。 tx_flag為傳送旗標,當傳送前先判斷tx_flag=1才允許傳送,傳送前先將tx_flag=0,傳送完畢進入中斷會將tx_flag旗標設為1, 如此就不會未傳完又傳下一個。
編輯記錄
saiki 重新編輯於 2009-01-01 12:17:58, 註解 無‧
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
===================引 用 saiki 文 章=================== 沒有用阿 還是閃一下就沒了 我燒入沒有加人接收功能的可以用耶 = = ===================引 用 src 文 章=================== 顯示問題是:變數宣告 unsigned char i; 改成 char i; ?
編輯記錄
src 重新編輯於 2009-01-01 15:58:56, 註解 無‧
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
問題好像不在那裡喔(for 回圈不是 i >= 0時 i--嗎@@?)
大大你可能記錯嚕 因為用Keil c去模擬有出來我要的結果耶 ===================引 用 src 文 章===================
編輯記錄
saiki 重新編輯於 2009-01-01 16:11:37, 註解 無‧
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
我測試的結果確實如此
===================引 用 saiki 文 章=================== 問題好像不在那裡喔(for 回圈不是 i >= 0時 i--嗎@@?) 大大你可能記錯嚕 因為用Keil c去模擬有出來我要的結果耶 ===================引 用 src 文 章===================
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
|
src
高階會員 發表:1 回覆:94 積分:154 註冊:2005-08-23 發送簡訊給我 |
|
saiki
一般會員 發表:3 回覆:26 積分:5 註冊:2008-09-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |