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

8051串列傳輸的問題

答題得分者是:aki
jung628
一般會員


發表:1
回覆:1
積分:0
註冊:2009-05-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-15 10:52:39 IP:118.169.xxx.xxx 訂閱
我利用2顆89s51串列傳輸,一顆傳送字串"hello!!",另一顆接收並顯示在lcd(繪圖型)上spec如附件~
但都還是收不到~不知道問題出在哪裡~我是剛開始學8051~煩請各位幫忙一下^^~程式如下:

//發射端
#pragma oe db pw(80) SM SB CD
#include
code char mes[]="hello!!" ;
void main()
{
char *s;
SM0=0; SM1=1; //設定成模式1
TMOD=0x20;
TH1=TL1=0xfd; //包率9600
TR1=1; //設定時間模式為1
for(s=mes;*s!='\0';){
SBUF=*s ;
while(TI==0) ;
TI=0 ;
}//for

for(;;);

}//main


//接收端
#pragma oe db pw(80) SM SB CD
#include
#define DBPORT P0
sbit RS=P2^5 ; // LCD致能控制線接腳
sbit RW=P2^6 ; // LCD讀寫控制接腳
sbit E=P2^7 ; // LCD 資料與指令選擇線接腳

char buf[10] ;
char idx ;
void delay1ms(int count); // 時間延遲副程式
void LCD_CMD(char cmd); // 寫入指令暫存器函式原型宣告
void LCD_DATA(char data1); // 寫入資料暫存器函式原型宣告
void LCD_clear(); // LCD初始化
void LCD_SW(); //當接收完畢準備要傳送到LCD上的資料
main()
{
idx=0;
SM0=0; SM1=1; //模式1
TMOD=0x20;
TH1=TL1=0xfd; //鮑率9600
TR1=1;
REN=1;
for(;;){
while(RI==0) ;
RI=0 ;
buf[idx ]=SBUF;
if((idx-1)==6) LCD_SW(); //當字串全都放入buf中時,準備傳送到lcd
}

}//main
//lcd初始化
void LCD_clear()
{
delay1ms(5) ; // 等待 LCD 電源與穩定
LCD_CMD(0x3f) ; // 8位元存取雙列字5×10字型
LCD_CMD(0xe) ; // 顯示器ON/游標顯示的位址
LCD_CMD(0x1) ; // 清除全螢幕
LCD_CMD(0x80) ; // 設定DD RAM位址第一行第一列
}
//時間delay
void delay1ms(int count)
{
int i,j;

for(i=0;i for(j=0;j<122;j );
}

void LCD_CMD(char cmd)
{
char i;
DBPORT =cmd ; // 寫入指令暫存器
RS=0;RW=0;E=1; // 控制線 P1=0x04;

for(i=0 ; i < 40 ;i ) ; // 一個短時間的延遲時序
RS=0;RW=0;E=0; // 控制線 P1=0x00;
}
void LCD_DATA(char data1)
{
char i;

DBPORT=data1; // ASCII字元輸出到資料線
RS=1;RW=0;E=1; // 控制線 寫入資料暫存器
for(i=0 ; i < 40 ;i ) ; // 一個短時間的延遲時序
RS=1;RW=0;E=0;
}

void LCD_SW(){

char code *pp=buf;

LCD_clear();
for(;*pp!=0;){
LCD_DATA(*pp ); // 呼叫顯示字串函式(待機)
}//for(*pp!=0)
for(;;);
}
aki
版主


發表:30
回覆:696
積分:755
註冊:2004-01-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-15 15:16:28 IP:61.229.xxx.xxx 訂閱
你可以安排看怎麼來測試這個程式?
(1) 發射(TX)的那一顆真的有傳出來嘛?
89C51 -> PC 可以作確認!

(2) 接收端有收到嘛?
PC -> 89C51

這樣就可以知道問題在哪裡了?

===================引 用 jung628 文 章===================
我利用2顆89s51串列傳輸,一顆傳送字串"hello!!",另一顆接收並顯示在lcd(繪圖型)上spec如附件~
但都還是收不到~不知道問題出在哪裡~我是剛開始學8051~煩請各位幫忙一下^^~程式如下:

//發射端
#pragma oe db pw(80) SM SB CD
#include
code char mes[]="hello!!" ;
void main()
{
char *s;
SM0=0; SM1=1; //設定成模式1
TMOD=0x20;
TH1=TL1=0xfd; //包率9600
TR1=1; //設定時間模式為1
for(s=mes;*s!='\0';){
SBUF=*s ;
while(TI==0) ;
TI=0 ;
}//for

for(;;);

}//main


//接收端
#pragma oe db pw(80) SM SB CD
#include
#define DBPORT P0
sbit RS=P2^5 ; // LCD致能控制線接腳
sbit RW=P2^6 ; // LCD讀寫控制接腳
sbit E=P2^7 ; // LCD 資料與指令選擇線接腳

char buf[10] ;
char idx ;
void delay1ms(int count); // 時間延遲副程式
void LCD_CMD(char cmd); // 寫入指令暫存器函式原型宣告
void LCD_DATA(char data1); // 寫入資料暫存器函式原型宣告
void LCD_clear(); // LCD初始化
void LCD_SW(); //當接收完畢準備要傳送到LCD上的資料
main()
{
idx=0;
SM0=0; SM1=1; //模式1
TMOD=0x20;
TH1=TL1=0xfd; //鮑率9600
TR1=1;
REN=1;
for(;;){
while(RI==0) ;
RI=0 ;
buf[idx ]=SBUF;
if((idx-1)==6) LCD_SW(); //當字串全都放入buf中時,準備傳送到lcd
}

}//main
//lcd初始化
void LCD_clear()
{
delay1ms(5) ; // 等待 LCD 電源與穩定
LCD_CMD(0x3f) ; // 8位元存取雙列字510字型
LCD_CMD(0xe) ; // 顯示器ON/游標顯示的位址
LCD_CMD(0x1) ; // 清除全螢幕
LCD_CMD(0x80) ; // 設定DD RAM位址第一行第一列
}
//時間delay
void delay1ms(int count)
{
int i,j;

for(i=0;i for(j=0;j<122;j );
}

void LCD_CMD(char cmd)
{
char i;
DBPORT =cmd ; // 寫入指令暫存器
RS=0;RW=0;E=1; // 控制線 P1=0x04;

for(i=0 ; i < 40 ;i ) ; // 一個短時間的延遲時序
RS=0;RW=0;E=0; // 控制線 P1=0x00;
}
void LCD_DATA(char data1)
{
char i;

DBPORT=data1; // ASCII字元輸出到資料線
RS=1;RW=0;E=1; // 控制線 寫入資料暫存器
for(i=0 ; i < 40 ;i ) ; // 一個短時間的延遲時序
RS=1;RW=0;E=0;
}

void LCD_SW(){

char code *pp=buf;

LCD_clear();
for(;*pp!=0;){
LCD_DATA(*pp ); // 呼叫顯示字串函式(待機)
}//for(*pp!=0)
for(;;);
}
jung628
一般會員


發表:1
回覆:1
積分:0
註冊:2009-05-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-18 09:11:02 IP:118.169.xxx.xxx 訂閱
在發射端我有用keil c debug,結果的確有送出字串,但接收端卻好像收不到,我想應該知道問題是出在接收端,我在試試看,
謝謝版主~~~
系統時間:2024-05-06 15:53:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!