接下来是程序设计部分
-
-
-
- 全局变量
- 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;
- }
- }
|