51单片机与PC串口通信程序,求指导 ! 具体要求如下:

当接收指令信号为:’go’ , 单片机向PC机发送字符串‘WELCOME TO CHINA!’,
当接收指令信号为:’who’,单片机向PC机发送字符串‘MY NAME IS LIMING’,
当接收指令信号为:’home’,单片机向PC机发送字符串‘YINGYONGKEXUEXUEYUAN’,
这时,串口调试软件就会在窗口显示出相应字符串;如果接送的字符串不正确,单片机不响应。
采用C语言,接收指令信号(单片机接收PC机发来的信号),然后单片机又向PC机发送字符串。(单片机型号:P89V51RD2。)
最新回答
梦有一把锁

2024-05-31 02:17:15

要求用什么语言?
------------------------------
网友“星心晨梦”的回答,是可以满足题目要求的。
我实验了,是成功的,没有任何错误。
楼主应该检查自己的电路、串口设置等等。
------------------------------
网友“星心晨梦”的回答,篇幅稍稍长了一些。
缩减一半就可以正常工作了,可读性更好一些。
建议看看下面的。
------------------------------
#include <AT89X51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//---------------------------------------------------
uchar idata trdata1[] = {
'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0x0a,0x00};
uchar idata trdata2[] = {
'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0x0a,0x00};
uchar idata trdata3[] = {
'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0x0a,0x00};
uchar RxBuf[5], Rx_p, Rx_i, TX_p, Tx_i;
//---------------------------------------------------
void UART_Init(void) //串口初始化
{
PCON = 0x00;
SCON = 0x50; //串口工作方式为1,允许接收.
TMOD = 0x20; // T1 定时方式2
TH1 = 0xfd; //
波特率
9600bps @ fosc = 11.0592MHz
TL1 = 0xfd;
TR1 = 1; //启动T1
ES = 1; //开串口中断.
EA = 1; //开总中断.
}
//---------------------------------------------------
void main()
{
UART_Init();
Rx_p = 0;
Rx_p = 2;
while(1) {
if (Rx_p != 0) {
TX_p = Rx_p;//
字符串
1 2 3
Tx_i = 0; //字符指针.
Rx_p = 0; //清零.
Rx_i = 0;
TI = 1; //启动发送中断.
} }
}
//---------------------------------------------------
void Uart_INT(void) interrupt 4 //串口中断函数
{
uchar Tcv = 0;
if(RI) { //接收?.
RI = 0; //标志位清零.
RxBuf[Rx_i] = SBUF;
if((RxBuf[Rx_i - 1] == 'g') && (RxBuf[Rx_i] == 'o')) Rx_p = 1;
if((RxBuf[Rx_i - 2] == 'w') && (RxBuf[Rx_i - 1] == 'h') && (RxBuf[Rx_i] == 'o')) Rx_p = 2;
if((RxBuf[Rx_i - 3] == 'h') && (RxBuf[Rx_i - 2] == 'o') && (RxBuf[Rx_i - 1] == 'm') && (RxBuf[Rx_i] == 'e')) Rx_p = 3;
P1 = Rx_p; //在P1显示收到的信息.
Rx_i++;
Rx_i %= 5;
}
else {
TI = 0;
if (TX_p == 1) Tcv = trdata1[Tx_i]; //取来待发字符.
if (TX_p == 2) Tcv = trdata2[Tx_i];
if (TX_p == 3) Tcv = trdata3[Tx_i];
if (Tcv != 0) {SBUF = Tcv; Tx_i++;} //不是0就发送.
}
}
//---------------------------------------------------
汤圆

2024-05-31 08:04:25

#include <AT89X51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int

uchar mm,RxBuf[5],Tx;
uchar idata trdata1[]={'W','E','L','C','O','M','E',' ','T','O',' ','C','H','I','N','A','!',0x0d,0x0a,0x00};
uchar idata trdata2[]={'M','Y',' ','N','A','M','E',' ','I','S',' ','L','I','M','I','N','G',0x0d,0x0a,0x00};
uchar idata trdata3[]={'Y','I','N','G','Y','O','N','G','K','E','X','U','E','X','U','E','Y','U','A','N',0x0d,0x0a,0x00};
/***************通过串口向计算机发送数据***************/
void Uart_SendChar(uchar dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}
/***************串口初始化程序***************/
void UART_Init(void)
{
PCON=0x00;
SCON = 0x50; //串口工作方式为1 , 串行允许接收
TMOD = 0x20; //定时器1 工作在方式2
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}

void main()
{
uchar i;
UART_Init();
while(1)
{

if(Tx==1)
{

while(trdata1[i]!=0x00)
{
Uart_SendChar(trdata1[i]);
i++;
}
RxBuf[0]=0x00;
RxBuf[1]=0x00;
RxBuf[2]=0x00;
RxBuf[3]=0x00;
RxBuf[4]=0x00;
i=0;
Tx=0;
mm=0;

}
else if(Tx==2 )
{
while(trdata2[i]!=0x00)
{
Uart_SendChar(trdata2[i]);
i++;
}
RxBuf[0]=0x00;
RxBuf[1]=0x00;
RxBuf[2]=0x00;
RxBuf[3]=0x00;
RxBuf[4]=0x00;
i=0;
Tx=0;
mm=0;
}
else if(Tx==3 )
{
while(trdata3[i]!=0x00)
{
Uart_SendChar(trdata3[i]);
i++;
}
RxBuf[0]=0x00;
RxBuf[1]=0x00;
RxBuf[2]=0x00;
RxBuf[3]=0x00;
RxBuf[4]=0x00;
Tx=0;
i=0;
mm=0;
}

}
}
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
uchar Rcv = 0;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
Rcv = SBUF;
RxBuf[mm]=Rcv;
if(RxBuf[0]=='g')
{
mm=1;
if(RxBuf[1]=='o')
{
Tx=1;
mm=2;
}

}
else if(RxBuf[0]=='w')
{
mm=1;
if(RxBuf[1]=='h')
{
mm=2;
if(RxBuf[2]=='o')
{
mm=3;
Tx=2;
}
}
}
else if(RxBuf[0]=='h')
{
mm=1;
if(RxBuf[1]=='o')
{
mm=2;
if(RxBuf[2]=='m')
{
mm=3;
if(RxBuf[3]=='e')
{
Tx=3;
mm=4;
}
}
}
}
else
Tx=0;
}

}
追问
不符合要求啊!
追答
我用的是STC的,51系列应该可以的话啊,如果不行,那还是另请高人啦。
泪了

2024-05-31 08:06:28

功能如下:
1、程序烧进去,串口接收显示一个菜单!《如图》A、B、……分别代表一定的功能
例如:A项,代表修改ds1302的时间的数组
2、按照菜单的提示,如:发送A就进入了修改ds1302的时间函数,串口接收界面显
示 A,像图片那种,并显示修改ds1302的操作方法,如从串口发送界面发送
0162115347就表示10年10月16日21时15分34秒星期7,
3、正如第二所说,马上输入1010162115347,就成功的修改了ds1302相关数据,
并返回change success!到串口界面!
4、设置一个功能就是返回主菜单界面。然后又可以就行第二、三步的操作!
5、通过串口,读取单片机里面相关的数据,如时钟的数据
6、说明:可以不要ds1320相关的程序,可以用发光二极管亮来代表修改功能!
昔望

2024-05-31 01:45:45

为什么不自己动手写程序呢?不是很简单么?