兄弟们,麻烦你们看一下这个问题,我真的有太多的疑惑!
刚刚开始学习单片机的C51编程,老师跟我出了一个串口编程的题目:把PC键盘上输入的字符通过串口传给单片机去处理,处理的方式很简单,就是把你原先输入的顺序倒过来,把它的逆序通过串口再传给PC。
我做了几个程序,用keil uvision2 编译仿真后都出现同样的结果(能够逆序输出、但是之后又不停的输出其它字符),百思不得其解,希望广大同仁能助我一臂之力,下面我把我写的两个程序贴出来,麻烦大家帮我分析一下错误,谢谢大家!
(1)
#include <reg51.h>
unsigned char xdata i=0,j=0;
unsigned char xdata input[50]; //把输入的字符存在这个数组里
bit read_flag=0; //为了控制输出的次数
serial() interrupt 4 using 1
{
if (RI)
{
while (RI==0) ;
RI=0;
input[i]=SBUF;
if (input[i]==0x20) //遇到空格键就开始向PC发送输入字符的逆 序
{
j=i-1; //发送的时候不把最后输入的那个字符算在内
i=0;
read_flag=1;
}
else
{
i++;
}
}
}
void send(unsigned char *tserial,unsigned int number)
{
unsigned int n;
for (n=number;n> =0;n--)
{
SBUF=*(tserial+n);
while (TI==0) ;
TI=0;
}
}
void main(void)
{
SCON=0xd8;
TMOD=0x20;
TH1=0xfd;
IE=0x90;
TR1=1;
TI=1;
while (1)
{
if (read_flag)
{
read_flag=0;
send(&input,j);
}
}
}
(2)
#include <reg51.h>
unsigned int xdata i=0,j=0,k=0;
unsigned char xdata input[50];
serial() interrupt 4 using 1
{
if (RI)
{
while (RI==0) ;
RI=0;
input[i]=SBUF;
if (input[i]==0x20)
{
j=i-1;
k=j;
i=0;
}
else
{
i++;
}
}
if (TI)
{
if ((j!=0)&&(input[j+1]==0x20)&&(k> =0))
{
for (k=j;k> =0;k--)
{
while (TI==0) ;
TI=0;
SBUF=input[k];
}
}
}
}
void main(void)
{
SCON=0xd8;
TMOD=0x20;
TH1=0xfd;
IE=0x90;
TR1=1;
TI=1;
for (;;) {}
}
发表时间:2005年1月10日16:26:57