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

8051 串列接收

答題得分者是:src
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-29 14:02:56 IP:121.254.xxx.xxx 訂閱


我已經在電腦端寫好了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]

請各位大大幫我看是硬體錯還是軟體寫錯好嗎...
謝謝各位大大
編輯記錄
saiki 重新編輯於 2008-12-29 16:37:22, 註解 無‧
saiki 重新編輯於 2008-12-29 16:37:55, 註解 無‧
saiki 重新編輯於 2008-12-29 16:39:27, 註解 無‧
saiki 重新編輯於 2008-12-29 22:46:35, 註解 無‧
saiki 重新編輯於 2008-12-29 22:48:21, 註解 無‧
vans007
一般會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-29 23:27:19 IP:219.84.xxx.xxx 訂閱
其實pc與8051的串列傳輸只要 PC<---->RS232<---->8051
不需要再透過max232
只要把RS232的RX TX GND接到8051的TX RX GND
當然要對應好每支腳
  1. main(void)
  2. {
  3. init_rs232();
  4. while (1)
  5. {
  6. delay(100);
  7. SBUF = c;
  8. TI = 0;
  9. while (TI == 0);
  10. }
  11. }
而你這一段程式 在delay之後 SBUF=c;
這個地方是傳送給電腦端的程式
你的程式已經寫成中斷的方式
所以主程式只要
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-29 23:46:58 IP:121.254.xxx.xxx 訂閱
可是我照你這樣說的打下去
還是不行耶
可以直接連接嗎

電位不是不一樣嗎@@?
這樣接會爆吧@@?

還是沒有反應耶
用終端機也一樣 = =


===================引 用 vans007 文 章===================
其實pc與8051的串列傳輸只要 PC<---->RS232<---->8051
不需要再透過max232
只要把RS232的RX TX GND接到8051的TX RX GND
當然要對應好每支腳
編輯記錄
saiki 重新編輯於 2008-12-30 00:20:54, 註解 無‧
vans007
一般會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-30 08:24:26 IP:61.230.xxx.xxx 訂閱
這樣接是沒錯的不會爆的
因為RS232的TX RX的電位並不是 15 -15V
我貼給你的網址有看到嗎
照著弄應該是沒錯的

有可能是你的振盪器
改用11.059MHZ試看看吧,應該是可以的
編輯記錄
vans007 重新編輯於 2008-12-30 08:36:17, 註解 無‧
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-30 20:09:19 IP:121.254.xxx.xxx 訂閱

我又寫了新的程式去燒了
不過還是不行耶

可以幫我檢查一下嗎


[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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-30 21:01:39 IP:61.216.xxx.xxx 訂閱
以下程式是測試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;
}
[/code]
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-31 23:35:54 IP:121.254.xxx.xxx 訂閱
請問可以給我一個用中斷寫的例子嗎@@?
我是要用中斷寫
市面上的書籍都寫的不清楚 = =


===================引 用 src 文 章===================

以下程式是測試OK的請參考
石英振盪11.0592MHZ傳輸速率9600
該程式功能為:當收到PC的一個字立即回傳
編輯記錄
saiki 重新編輯於 2008-12-31 23:55:43, 註解 無‧
saiki 重新編輯於 2008-12-31 23:59:26, 註解 無‧
saiki 重新編輯於 2009-01-01 00:30:48, 註解 無‧
src
高階會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-01-01 08:13:11 IP:59.115.xxx.xxx 訂閱

[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;
}
[/code]

===================引 用 saiki 文 章===================
請問可以給我一個用中斷寫的例子嗎@@?
我是要用中斷寫
市面上的書籍都寫的不清楚 = =


===================引 用 src 文 章===================

以下程式是測試OK的請參考
石英振盪11.0592MHZ傳輸速率9600
該程式功能為:當收到PC的一個字立即回傳
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-01-01 11:08:43 IP:121.254.xxx.xxx 訂閱
請問
rx_flag;
tx_flag;

是在做什麼的
看不懂@@?
src
高階會員


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-01-01 11:38:01 IP:59.117.xxx.xxx 訂閱
rx_flag為接收旗標,當收到PC的一個字進入中斷將rx_flag旗標設為1,主程式的迴路只要判斷rx_flag=1就知道收到。
tx_flag為傳送旗標,當傳送前先判斷tx_flag=1才允許傳送,傳送前先將tx_flag=0,傳送完畢進入中斷會將tx_flag旗標設為1,
如此就不會未傳完又傳下一個。

===================引 用 saiki 文 章===================
請問
rx_flag;
tx_flag;

是在做什麼的
看不懂@@?
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-01-01 12:16:57 IP:121.254.xxx.xxx 訂閱

可以再問一個問題嗎@@?
我是要做接收的電子鐘
為什麼我改一改後
怎麼我的七段都閃一下就沒了
串列的中斷會和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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-01-01 13:08:08 IP:61.216.xxx.xxx 訂閱
顯示問題是:變數宣告
unsigned char i;
改成 char i;
===================引 用 saiki 文 章===================

可以再問一個問題嗎@@?
我是要做接收的電子鐘
為什麼我改一改後
怎麼我的七段都閃一下就沒了
串列的中斷會和timer0的中斷相衝嗎@@?
可以幫我看看嗎@@?
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-01-01 14:18:01 IP:121.254.xxx.xxx 訂閱

沒有用阿
還是閃一下就沒了
我燒入沒有加人接收功能的可以用耶 = =

===================引 用 src 文 章===================
顯示問題是:變數宣告
unsigned char i;
改成 char i;

src
高階會員


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-01-01 15:58:02 IP:61.216.xxx.xxx 訂閱
  1. 下面是你寫程式主程式的部份:
    變數宣告:unsigned char i; 為沒有符號
    七斷掃描:
    for (i = 3;i >= 0;i--) // i 變數永遠會 >= 0 永遠不會離開回圈只會閃一下就沒了,所以 變數宣告改成 char i;
  2. {
  3. P0 = ~com; //output to P0 (scan)
  4. P1 = decoder(time[i]);
  5. com = com << 1;
  6. }


===================引 用 saiki 文 章===================

沒有用阿
還是閃一下就沒了
我燒入沒有加人接收功能的可以用耶 = =

===================引 用 src 文 章===================
顯示問題是:變數宣告
unsigned char i;
改成 char i;
?
編輯記錄
src 重新編輯於 2009-01-01 15:58:56, 註解 無‧
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-01-01 16:08:27 IP:121.254.xxx.xxx 訂閱
問題好像不在那裡喔(for 回圈不是 i >= 0時 i--嗎@@?)
大大你可能記錯嚕
因為用Keil c去模擬有出來我要的結果耶


===================引 用 src 文 章===================
  1. 下面是你寫程式主程式的部份:
    變數宣告:unsigned char i; 為沒有符號
    七斷掃描:
    for (i = 3;i >= 0;i--) // i 變數永遠會 >= 0 永遠不會離開回圈只會閃一下就沒了,所以 變數宣告改成 char i;
  2. {
  3. P0 = ~com; //output to P0 (scan)
  4. P1 = decoder(time[i]);
  5. com = com << 1;
  6. }
編輯記錄
saiki 重新編輯於 2009-01-01 16:11:37, 註解 無‧
src
高階會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-01-01 16:15:29 IP:61.216.xxx.xxx 訂閱
我測試的結果確實如此
===================引 用 saiki 文 章===================
問題好像不在那裡喔(for 回圈不是 i >= 0時 i--嗎@@?)
大大你可能記錯嚕
因為用Keil c去模擬有出來我要的結果耶


===================引 用 src 文 章===================
  1. 下面是你寫程式主程式的部份:
    變數宣告:unsigned char i; 為沒有符號
    七斷掃描:
    for (i = 3;i >= 0;i--) // i 變數永遠會 >= 0 永遠不會離開回圈只會閃一下就沒了,所以 變數宣告改成 char i;
  2. {
  3. P0 = ~com; //output to P0 (scan)
  4. P1 = decoder(time[i]);
  5. com = com << 1;
  6. }
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-01-01 16:21:36 IP:121.254.xxx.xxx 訂閱

所以應該是我的硬體出錯嚕

===================引 用 src 文 章===================
我測試的結果確實如此
編輯記錄
saiki 重新編輯於 2009-01-01 16:21:55, 註解 無‧
src
高階會員


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-01-01 16:27:51 IP:61.216.xxx.xxx 訂閱
你之前貼的程式確實如我說的,變數宣告問題,不是硬體問題,用軟體模擬就知道了。
===================引 用 saiki 文 章===================

所以應該是我的硬體出錯嚕

===================引 用 src 文 章===================
我測試的結果確實如此
saiki
一般會員


發表:3
回覆:26
積分:5
註冊:2008-09-23

發送簡訊給我
#19 引用回覆 回覆 發表時間:2009-01-01 16:33:34 IP:121.254.xxx.xxx 訂閱
但是我用模擬的 用unsigned char i;也可以出來耶
還有我燒入完接到電路上還是一樣閃一下就沒了 = =a

看來應該是電路的問題了
謝謝大大嚕
我在試試看電路
年關難過 連晶片也出問題 = =

===================引 用 src 文 章===================
你之前貼的程式確實如我說的,變數宣告問題,不是硬體問題,用軟體模擬就知道了。
編輯記錄
saiki 重新編輯於 2009-01-01 23:26:28, 註解 無‧
系統時間:2024-04-24 6:15:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!