当前位置:首页 > > 充电吧
[导读]用普通 I/O 口也可以模拟标准 UART 串行口,进行串行通信。帧UART 通信规范是以 8 位二进制数为一帧,低位在前,逐位的传输。为了区分各个帧,在每一帧之前,要有一个 0 作为起始标记,之后,

用普通 I/O 口也可以模拟标准 UART 串行口,进行串行通信。



UART 通信规范是以 8 位二进制数为一帧,低位在前,逐位的传输。


为了区分各个帧,在每一帧之前,要有一个 0 作为起始标记,之后,有一个 1,作为结束符。


在结束符之前,还可选发一个“校验位”,但是,目前多数的应用都不选择这个位。


那么,每次的串行通信,就是传送一个字节,加上前后的标记,共 10 位二进制数。


空闲时,发送的都是 1;一旦出现了 0,就说明开始传输数据了。


波特率


串行通信的一个重要指标就是传输速度,就是每秒传送了多少位二进制数。


这个速度称为波特率,单位是 bps,中文就是“位/秒”。


时间设定


当以 9600bps 来传送数据时,每一位数的持续时间是 (1/9600)s,这也就是间隔时间。


如果选用晶振频率是 11059200Hz,一个机器周期T的时间就是 (12/11059200)s


那么,一位数的持续时间 (1/9600)s,是多少个机器周期T呢 ?


这是很容易算的,就是下面的这个算式:


    X = (1/9600) / (12/11059200) = 11059200 / 12 / 9600 = 96T


为了精确定时,可以利用定时器来定时,每当 96T 时间到了,就发送出去一位二进制数,这就行了。


实验程序


用 IO 口模拟串口输出的程序如下:


#include


sbit TXD1 = P2^0;     //用IO口模拟串口发送端

sbit RXD1 = P2^1;     //用IO口模拟串口接收端


bit T96;              //位变量

//----------------------------------------

void Wait96(void)     //延时,控制波特率

{

    while(T96);       //等待出现0

    T96 = 1;          //清标志

}

//----------------------------------------

void WByte(char x)    //发送一帧数据

{

    char i;


    TL0 = 160;        //初值=256-96=160

    TXD1 = 0;         //发送起始位0

    TR0 = 1;          //启动定时器

    Wait96();         //等待96T

   

    for (i = 0; i < 8; i++)  { //8位数

      TXD1 = x & 1;   //先传低位

      x >>= 1;

      Wait96();       //等待96T

    }

   

    TXD1 = 1;         //发送结束位1

    Wait96();         //等待96T

    TR0 = 0;          //关闭定时器

}

//----------------------------------------

void main()

{

    char  i;

    TMOD = 0x02;      //T0定时方式2

    TH0 = 160;        //初值=256-96=160

    IE = 0x82;

    T96 = 1;          //清标志

    while(1)   {

      for (i = 0x41; i < 0x5b; i++) //A~Z

        WByte(i);

      WByte(0x0D);

      WByte(0x0A);

    }

}

//----------------------------------------

void inttime0() interrupt 1 //T0中断

{

    T96 = 0;          //设置标志

}

//----------------------------------------



仿真截图


见下图:


由图可见,并没有使用单片机本身的串行口,而是把虚拟终端接到了 P2 口。


此时,虚拟终端也收到了字符 A~Z,以及回车换行。


后记


用 IO 口模拟串口输入也是可行的。


但是,这种模拟方法,编程的工作量,可以说相当的大;CPU 的工作时间,也被大量占用;


而且,还占用了定时器,那么在硬件资源方面,也浪费很多。


如果讨论模拟串口的接收问题,那还得搭上一个外部中断。


这种笨方法,当初,不知道是被谁想出来的 !真的远远比不上做而论道在前一篇博文中所介绍的用三态门扩充串口的方法。


费了这么大的劲,仅仅换来一个串口,可谓得不偿失。


做而论道是不会使用这样的方法的,写这篇博文,只不过是回答网上提出的问题而已。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭