两台单片机p89c51用ptr2000通信不了,但两台单片机用导线连接时就可通过串口通信,谁能帮我看看程序哪里出问题? #include<reg51.h> //包含常用头文件 #include<stdio.h> #include<intrins.h> #include<absacc.h> #define uchar unsigned char //定义常用数据类型 //int cnt; void LCD_INIT(void); //LCD的初始化函数 void LCD_DISPLAY_STR(uchar x,uchar y,char *DATA);//在指定的位置显示字符串 void LCD_CLR(uchar y); //清除LCD指定的行 void LCD_SEND_COMMAND(uchar COMMAND); //向LCD发送命令 void LCD_SEND_DATA(uchar DATA); //向LCD发送数据 void LCD_WAIT(void); //检查LCD空闲 void init(void); //初始化 void DELAY(int t); //延时 void KEY_SCAN(void); //按键扫描 uchar LCD_GET_FLAG(void); //检查LCD状态 /*定义所要显示的数据*/ uchar code TranData[]="MaoMing Xue Yuan"; uchar code SendFlag[]="Sending... "; uchar code ReceiveFlag[]="Receiving... "; uchar code WaitingRT[]="Waiting........."; uchar Recevie[16];//接收数据缓冲器 uchar KEY; int Error=1,cnt=0; /*定义LCD控制字*/ #define LCD_MODE 0x3C /* 接口数据8位,显示2行,字体为1号 */ #define LCD_NO_FLASH 0x0C /* 屏幕显示开,无光标 */ #define LCD_HIDE 0x08 /* 屏幕显示关 */ #define LCD_FLASH 0x0D /* 屏幕显示开,并打开闪烁光标 */ #define LCD_SHIFT 0x07 /* 模块数据输入为增量方式,显示内容移动 */ #define LCD_NO_SHIFT 0x06 /* 模块数据输入为增量方式,显示光标移动 */ #define LCD_SH 0x14 /* 移动光标及整体显示 */ #define LCD_LINE1 0x80 /*第一行DDRAM起始地址*/ #define LCD_LINE2 0xc0 /*第二行DDRAM起始地址*/ #define SEND_IN XBYTE[0xff00] /*定义LCD的实际地址*/ sbit LCD_RS=P3^4; //定义LCD的RS控制位 sbit LCD_RW=P3^5; //定义LCD的RW控制位 sbit RT_flag=P1^1;//1:发送.0:接收 bit R_T;//0:发送.1:接收 //************************************************* //LCD显示字符串的主程序 //利用中断间隔循环显示 // //************************************************* main() { int i=0; LCD_INIT(); init(); while(1) { KEY_SCAN(); if(R_T==0)//发送标志 { EA=0; RT_flag=1; LCD_DISPLAY_STR(1,1,SendFlag); //在第一行显示"Sending..." LCD_DISPLAY_STR(1,2,TranData); //在第二行显示"MaoMing Xue Yuan" // SBUF=TranData[0];while(!TI);TI=0; while(TranData!='\0'){SBUF=TranData;while(!TI);DELAY(1000);TI=0;i++;}//发送数据 i=0; Error=1; } if(R_T==1)//接收标志 { RT_flag=0; if(Error) //接收出错 { LCD_DISPLAY_STR(1,1,ReceiveFlag); //在第一行显示"Receiving..." LCD_DISPLAY_STR(1,2,WaitingRT); //在第二行显示"Waiting........." RI=0; EA=1; } } } } void serial_serve(void) interrupt 4 { RI=0; EA=0; if(R_T==1)//接收标志 { Error=0; Recevie[cnt]=SBUF; cnt++; if(cnt==16)cnt=0; // if(cnt==16) // { // cnt=0; LCD_DISPLAY_STR(1,1,ReceiveFlag); //在第一行显示"Receiving..." LCD_DISPLAY_STR(1,2,Recevie); //在第二行显示接收到的数据 // } } EA=1; } void init(void)//初始化 { R_T=0; TMOD=0x20; // TH1=0xff; // TL1=0xff;" TH1=0xfd; TL1=0xfd; SCON=0x50; // PCON=0x80; TR1=1; ES=1; EA=1; } void KEY_SCAN(void) //按键扫描(发送/接收) { KEY=(~P1)&0X04; if(KEY!=0) { DELAY(100); KEY=0; if(((~P1)&0X04)!=0) { KEY=(~P1)&0X04; // while(((~P1)&0X04)!=0) // ; R_T=~R_T; } } } void DELAY(int t)//延时 { int i,j; for(i=0;i<t;i++) for(j=0;j<120;j++) ; } //************************************************* //函数功能CD初始化 //输入变量:无 //输出变量:无 //调用模块CD_SEND_COMMAND(),LCD_CLR() //************************************************* void LCD_INIT(void) { LCD_SEND_COMMAND(LCD_MODE); //设置工作方式 LCD_SEND_COMMAND(LCD_NO_FLASH); //设置显示方式 LCD_SEND_COMMAND(LCD_NO_SHIFT); //设置光标画面滚动方式 LCD_SEND_COMMAND(LCD_SH); //设置输入方式 LCD_CLR(1); //清除LCD第一行 LCD_CLR(2); //清除LCD第二行 } //************************************************* //函数功能:清除LCD指定行 //输入变量:y //输出变量:无 //调用模块CD_SEND_COMMAND(),LCD_SEND_DATA() //************************************************* void LCD_CLR(uchar y) { uchar i; i=0; if(y==1) { LCD_SEND_COMMAND(LCD_LINE1); //发送命令使LCD指向第一行 i=16; } if(y==2) { LCD_SEND_COMMAND(LCD_LINE2); //发送命令使LCD指向第二行 i=16; } if(i!=0) { do { LCD_SEND_DATA(' '); //让LCD的相应位置显示空格 }while(--i!=0); } } //************************************************* //函数功能:向LCD发送命令 //输入变量:COMMAND //输出变量:无 //调用模块CD_WAIT() //************************************************* void LCD_SEND_COMMAND(uchar COMMAND) { LCD_WAIT(); //等待空闲 LCD_RS=0; //命令方式 LCD_RW=0; //写方式 SEND_IN=COMMAND;//写实际的命令到LCD } //************************************************* //函数功能:向LCD发送数据 //输入变量ATA //输出变量:无 //调用模块CD_WAIT() //************************************************* void LCD_SEND_DATA(uchar DATA) { LCD_WAIT(); //等待空闲 LCD_RS=1; //数据方式 LCD_RW=0; //写方式 SEND_IN=DATA;//写实际的数据到LCD } //************************************************* //函数功能:等待LCD空闲 //输入变量:无 //输出变量:无 //调用模块CD_GET_FLAG() //************************************************* void LCD_WAIT(void) { uchar i; i=1000; //定义等待时间,可以防止由于LCD损坏而使程序死循环 do { if((LCD_GET_FLAG()&0x80)==0) //判断BF是否为0 { break; } }while(--i!=0); } //************************************************* //函数功能:检查LCD状态 //输入变量:无 //输出变量CD显示的当前状态 //调用模块:无 //************************************************* uchar LCD_GET_FLAG(void) { LCD_RS=0; LCD_RW=1; return(SEND_IN); } //************************************************* //函数功能:检查LCD状态 //输入变量:无 //输出变量CD显示的当前状态 //调用模块:无 //************************************************* void LCD_DISPLAY_STR(uchar x,uchar y,char *DATA) { if(y==1) { if(x<(16+1)) //判断显示位置是否超出第一行 { LCD_SEND_COMMAND(LCD_LINE1-1+x);//发送显示位置命令 for(;x<(16+1)&&*DATA!='\0';x++) { LCD_SEND_DATA(*DATA++); //发送数据 } if(*DATA!='\0') //判断是否发送完毕 { x=1; y=2; //未完毕转到第二行显示 } } } if(y==2) { LCD_SEND_COMMAND(LCD_LINE2-1+x); for(;x<(16+1)&&*DATA!='\0';x++) { LCD_SEND_DATA(*DATA++); } } } |