本节将基于Proteus仿真软件实现在Proteus中显示“HELLO WORLD”。
在驱动USART之前,先来了解一下USART的初始化配置(要想驱动USART,首先需要对其进行初始化):
(1) 给对应的I/O设置好方向及电平的高低;
(2) 设置USART的波特率;
(3) 设置数据的字符长度;
(4) 设置是否使能收发,是否中断。
对于上述4个步骤,后3个没有固定的先后顺序。
注意:编写程序时,应尽量使用通用的定义,这样有利于代码的移植;而且代码书写应使用标准风格,以方便代码的维护。
打开AVR Studio 4,首先新建一个工程,命名为USART(该工程的设置与前面介绍的流水灯工程的设置一致),然后在HAL_usart.h中添加以下代码:
接着在HAL_usart.c中添加以下代码:
驱动USART时,除了需要编写初始化函数外,还需要编写发送与接收函数,后面的4.2.3节将详细介绍双机通信。
main.c中的main()代码如下:
仿真电路如图4.5所示,图中使用了虚拟设备中的串口终端,这样在仿真的过程中可以显示USART发送过来的数据。在本仿真电路中,MCU的设置与前述电路相同,不同的是代码编译文件。
图4.5 仿真电路
单击“运行”按钮,可以在弹出的提示界面中看到“Hello World!usart test!”等字符,如图4.6所示。
图4.6 虚拟示波器显示的实验结果1
双机通信是指在两个设备之间通过某种协议或关系进行信息传输、交换等操作。
由于我们刚刚接触单片机,所以在这里先做一个简单的实验:主机通过串口发字符到从机后,从机通过串口将其发送到虚拟终端。
主机的代码可以延用4.2.2节中工程的代码。由于从机只有在接收到主机发送过来的字符后才向虚拟终端发送字符,所以这里需要使用到串口中断。AVR提供了很多外设中断,其使用没有什么特殊的,只是需要注意中断的触发条件是什么。
从机HAL_usart.c的代码如下:
在main.h中添加以下几条语句:
在DEVICE_init()函数中添加以上语句后,除了需要开启对应的外设中断位外,还需要打开全局中断,否则中断是不运行的或无效的。这个读者可以自己尝试一下。
而从机的main()函数除了初始化设备外,只需要再添加一个while(1);语句,等着主机发送字符即可。
打开Proteus软件,建立双机调试工程,其仿真电路如图4.7所示。
图4.7 双机通信的仿真电路
按照要求分别对主/从机添加HEX文件,然后单击“运行”按钮,结果如图4.8所示。
图4.8 虚拟示波器显示的实验结果2
本实验的效果是:主机向从机发送“Hello World!”,从机接收到后将其转发到虚拟终端进行显示。
这里只给出简单的双机通信,想要更复杂的,读者可以自己去发挥、实践。
本章完成了HELLO WORLD的经典重现及双机通信,但是USART的运用远不只于此,如在前面提到的485总线及一些通信上的应用等。在一些开发过程中,当不存在显示设备或指示设备,但是需要查看数据时,也可以使用USART。由于在实际工程中不可能进行仿真,所以需要使用一些小技巧来解决问题,如使用USART将数据发送到界面上显示,或是在需要的观察点附近做上标记,输出设定字符,查看是否运行到此或输出该字符等——这是USART在程序调试中的应用。
另外,USART可以制定出一套属于自己的通信协议来,如485协议就是一个很广泛的应用。