小弟我的财富值只有28分所以只能给20分了,如果哪位大侠给小弟解决了这个问题小弟感激不尽!硬件 STC89C52RC+MAX232设计要求:在PC机上使用串口调试软件,向单片机发送字符串,当接收指令信号为:’go’ , 单片机向PC机发送字符串‘WELCOME TO CHINA!’,当接收指令信号为:’who’,单片机向PC机发送字符串‘MY NAME IS LIMING’,当接收指令信号为:’home’,单片机向PC机发送字符串‘YINGYONGKEXUEXUEYUAN’,这时,串口调试软件就会在窗口显示出相应字符串;如果接送的字符串不正确,单片机不响应。
程序如下:
#include "reg52.h"
#include <string.h>
#include <stdio.h>
#define uchar unsigned char
sbit LED=P1^0;
uchar Rcv[],bur[];
uchar f[17] = "WELCOME TO CHINA!" ;
uchar g[17] = "MY NAME IS LIMING" ;
uchar h[22] = "YINGYONGKEXUEXUEYUAN" ;
uchar buf1[5] = "go", buf2[5] = "who", buf3[5]= "home" ;
int c,d,e,i;
void delay(void)
{
unsigned char a,b;
for(b=200;b>0;b--)
for(a=50;a>0;a--);
}
/**************************************************************************
*函数:void UART_Init(void) *
*功能:串口初始化函数,在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s *
*说明:串口接收中断允许,发送中断禁止 *
***************************************************************************/
void UART_Init(void)
{
SCON = 0x50 ; //UART 工作模式1,REN=1
TMOD |= 0x20 ; //timer 1, 工作于模式 2
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFA ; //波特9600 晶振为11.0592MHz
ES=1;
TR1 = 1 ; // 启动 timer 1
EA=1;
}
void Uart_SendData(uchar dat)
{
SBUF=dat; //写SBUF,开始发送
while(TI==0); //等待发送
TI=0; //清发送标志位
}
//主函数
void main(void)
{
UART_Init(); //串口初始化
while(1)
{
}
}
/*******************************************************
*函数:INT_UartRcv() *
*功能:串口接收中断函数 *
*说明:中断号为 4 *
********************************************************/
void INT_UartRcv(void) interrupt 4
{
if(RI)
{
for (i=0; i<4; i++)
{
while (!RI);
bur[i] = SBUF;
RI = 0;
}
}
c=strncmp(bur,buf1,2 );
d=strncmp(bur,buf2,3 );
e=strncmp(bur,buf3,4 );
for (c=0;c<17;c++)
{ Rcv[17]= f[c] ;
LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[17]);}
for (d=0;d<17;d++)
{ Rcv[17]= g[d] ; LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[17]);}
for (e=0;e<22;e++)
{ Rcv[22]= h[e] ;
LED=0;
delay();
LED=1; i=0;
Uart_SendData(Rcv[22]);
}
}
调试结果是:用串口调试助手输入两个字符(如gg)时串口不向pc及发送任何数据,而且再输入任何数据不工作,纵有再关闭一次串口调试助手,再输入任何大于两字符长度的字符串(如ggg)串口调试助手显示WELCOME TO CHINA!MY NAME IS LIMINGYINGYONGKEXUEXUEYUAN