两台单片机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++);
}
}
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |