下面程序,可以实现收发。现在我想给单片机发送一个代码,然后要求单片机回复一个我自己定义的字符或者文字。(比如发送:1,单片机回复:完成)
小弟初学单片机,不知道能不能实现?希望各位大侠指教!感激不尽!
/******************************
十六进制发送和接收数据
******************************/
#include
bit Flag;
unsigned int ReData,SenData;
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x00;
TH1 = 0xFD; //baud*2 /* 波特9600、数据位8、停止位1。效验位无 (12M)
TL1 = 0xFD;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
// IE = 0x0;
while(1)
{
if (Flag==1)
{
SBUF=SenData; //SUBF接受/发送缓冲器
while(TI==0);
TI=0;
Flag=0;
}
}
}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
Flag=1;
}
}
单片机通讯问题?(如发送:1,回复:完成)
你自己仿真了没有?提出的问题要清晰明了。
照这样修改一下:
/******************************
十六进制发送和接收数据
/******************************
十六进制发送和接收数据
******************************/
#include
bit Flag;
unsigned char ReData;
unsigned char i,SenData[]="完成";
void main (void)
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x00;
TH1 = 0xFD; //baud*2 /* 波特9600、数据位8、停止位1。效验位无 (12M)
TL1 = 0xFD;
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
// IE = 0x0;
while(1)
{
if (Flag==1 /*& ReData == 1*/) // 可能要根据你接收的字符或数字应加上 & ReData =='1' 或 & ReData == 1
{ // if (Flag==1 & ReData == 1)
ES=0; //关闭串口中断
for(i=0;i<4;i++)
{SBUF=SenData;
while(!TI); //等待发送结束
TI=0; //软件清发送中断标志位
}
// SBUF=SenData; //SUBF接受/发送缓冲器
// while(TI==0);
// TI=0;
Flag=0;
ES = 1; //开串口中断
}
}
}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(TI == 1)
{ TI=0; }
else
{ if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
// SenData=ReData;
Flag=1;
}
}
}
回答于 · 2022-07-31 12:15
回答于 · 2022-07-31 13:47