概述:上位机(PC机)向MCU发送指令,MCU串口接收指令并根据列表发送响应。
全局变量声明
#include <E51Pro.h>
BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
UINT nAddress;//ROM中地址计数
UINT nTimeOut;//超时计数
ProWork pw;//编程器一般操作
1 定时器延时
1.1 微秒级
void Delay_us(BYTE nUs)//微秒级延时<255us
{
TH0=0;
TL0=0;
TR0=1;
while(TL0<nUs); //利用T0做定时计数器,循环采样,直到达到定时值
TR0=0;
}
分析:
定时器初始值归零,自增1次约1us。
打开定时器中断,BYTE有效值为0~255,因此TL<nUs限定其延时小于255us。
最后关闭定时器中断。
1.2 毫秒级
void Delay_ms(UINT nMs) //毫秒级的延时<65535ms
{
UINT n=0;
TR0=1;
while(n<nMs)利用T0做定时计数器,循环采样,直到达到定时值
{
TH0=0;
TL0=20;
while(TH0<4);
n++;
}
TR0=0;
}
TH自增1,即TL自增255,故TH自增4次约1ms,其他同微秒级。
2 等待上位机命令
BOOL WaitComm() //等待上位机的命令,18字节
{
BYTE n=0;
RI=0;
//*****1******
while(!RI){} //等待第一个字节
ComBuf[n]=SBUF;
RI=0;
n++;
//*****2******
for(n;n<=17;n++)
{
nTimeOut=0;
while(!RI)
{
nTimeOut++;
if(nTimeOut>10000) return 0; //后17个字节都有超时限制
}
ComBuf[n]=SBUF;
RI=0;
}
return 1;
}
**1** 上位机发送第一个字节,接收中断,接收字符存入ComBuf数组;软件置零,继续接收下一字节。
**2** 下一字节要若在超时计数nTimeOut自增超过1W,则返回0,不再接收;未超时,则把剩下17字节依次存入ComBuf数组。
3 等待上位机回应
BOOL WaitResp()//等待上位机回应,1字节,有超时限制
{
nTimeOut=0;
RI=0;
while(!RI)
{
nTimeOut++;<