使用延时法模块串口

描述

使用波特率为9600bpS,晶振频率为11.0592MHz,通过计算可知,串口的每位需延时0.104ms,通过执行96个指令周期可能完成0.104ms的延时。与其相关的程序在结构上可分为:IO口定义、串口发送函数、串口接收函数、延时函数。下面依次介绍各个部分。

1.IO口定义程序等

这部分程序主要包括基本的IO口定义、全局变量定义、头文件包含、函数声明等。为后面程序提供编程基本。其程序代码如下:

sbit  RXD1 = 0x90; 
sbit  TXD1 = 0x91; 
#define  WR_delay     44 //写延时 
#define  RD_delay     43 //读延时

2.串口发送函数

串口发送函数首先发送起始位,再发送数据,根据通信协议选择是否发送校验位。最后发送停止位。延时法模拟串口发送流程如图所示。

函数

其程序代码如下:

#define  Check_bit_switch_on_off    0//不使用校验位
uchar Check_bit;
//往串口写一个字节 
void Send_Byte(uchar input,bit Check_bit) 
{ 
    uchar i=8; 
    TXD=(bit)0; //发送启始位 
    Delay(39); 
    //发送8位数据位 
    while(i--) 
    { 
      TXD=(bit)(input&0x01); //先传低位 
      Delay(36); 
      input=input > >1; 
    } 
    //发送校验位(无) 
    #if Check_bit_switch_on_off
    {
      TXD1=(bit)(Check_bit); //发送校验位
      Delay(36); 
    }
    #else
    Check_bit = Check_bit;
    #endif
    TXD1=(bit)1; //发送结束 位 
    Delay(46); 
}

3.串口接收函数

串口接收函数首先等待起始位,然后接收数据,根据通信协议选择是否需要接收校验位。最后等待停止位。延时法模拟串口接收流程如图所示。

函数

其程序代码如下:

//从串口读一个字节 
uchar Revice_Byte(void) 
{ 
    uchar Output=0; 
    uchar i=8; 
    uchar temp=RD_delay; 
    //发送8位数据位 
    Delay(RD_delay *1.5); //此处注意,等过起始位 
    while(i--) 
    { 
      Output > >=1; 
      if(RXD1) 
        Output |=0x80; //先收低位 
      Delay(35); //(96-26)/2,循环共 
      //占用26个指令周期 
    } 
    //接收校验位
    #if Check_bit_switch_on_off
    (Check_bit)=TXD; //接收校验位
    Delay(35); 
    #endif
    while(--temp) //在指定的 
    //时间内搜寻结束位。
    { 
      Delay(1); 
      if(RXD1)
      break; //收到结束位便退出 
    } 
    return Output; 
}

用延时方式可以模拟多个个串口,但是使用延时方式模拟的串口在接收上存在一定的难度,主要是采样定位要求严格,另外还必须知道每条语句的指令周期数。在调试过程中,读者可以借助编译软件通过反汇编的方式查看编译后的汇编语句,已确定你所使用的C语句的执行时间。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分