C51单片机串口通信之上位机交互

概述:上位机(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++;<

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值