8051串列傳輸的問題 |
答題得分者是:aki
|
jung628
一般會員 發表:1 回覆:1 積分:0 註冊:2009-05-15 發送簡訊給我 |
我利用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 } 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 發送簡訊給我 |
你可以安排看怎麼來測試這個程式?
(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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |