接下来是程序设计部分
全局变量
bit RxOK = 0; //接收完成标志
uchar Rx[RX_MAX];
//串口初始化
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率,不使用多机通信,允许接收
PCON = 0; //波特率不加倍
TMOD |= 0x20; //定时器1工作在八位自动重载模式下
TH1 = 0xFD; //设定定时初值
TL1 = 0xFD; //设定定时初值
TR1 = 1; //启动R1
ES = 1;
for(i = 0; i < RX_MAX; i++)
{
Rx[i] = '\0';
}
}
void UartHandle() interrupt 4
{
if( RI )
{
//只要是进入RI说明一次数据的接收开始了(注意是一次性全部接收完)
//首先初始化要用到的变量
//数组索引i、一个字节之前用到的定时UartCnt,以及超时标志UartCntOK
uchar i;uint UartCnt = 0;bit UartCntOK = 0;
//首先进入for循环来接收数据
for( i = 0; i < RX_MAX; i++ ) //R_MAX是接收数组的最大值.
{
//将RI置零,以告诉串口发送端,我即将接收你发来的一个字节!
RI = 0;
Rx[i] = SBUF;//将数据接收
while( !RI ) //当RI为零的时候,表示没有数据发来,在while循环中等待数据发来,并开始计时
{
UartCnt++; //在里面等待的时候一直计时
//如果计时等于3000(注:这里的3000可以灵活更改)
//计算3000表示的计时时间大致为:3000*( 1(自加程序需要一个周期) + 2(判断程序需要两个周期) )*( 1/11.0592M )
//大概为:3000*3*1/(11.0592*1000000)秒 ------- 换算为us为813us
//(这个时间根据波特率更改,如果波特率高,则时间可以减少,如果波特率低,则时间可以增加)
if( UartCnt == 5000 )
{
UartCntOK = 1; //如果超时,则置位超时标志,退出while循环
break;
}
}
if( UartCntOK )
{
RxOK= 1; //如果是超时的话,则退出For循环,并置位接收完成标志
break;
}
}
}
if(TI)
{
TI = 0;
}
}
|