1
前面一课讲述了串行口通信的技术原理,本课通过安装虚拟串口,用proteus和keil实现串口通信仿真。
编写仿真程序之前,需要安装VSPD,VSPD是虚拟串口工具,通过VSPD虚拟出两个串口用于通信。大家可以通过搜索引擎找到VSPD安装方式。
VSPD安装完成后,运行VSPD,并虚拟出两个串口COM1和COM2。具体过程如下:
(1)启动VSPD
(2)虚拟一对串口
单击【Create】按钮,确认创建当前设定的一对虚拟串口。
(3)启动串口助手
随VSPD安装包附带的一般会有串口助手程序,可以使用串口助手测试串口的数据发送和数据接收。
启动串口助手打开COM1口,另外再启动一个串口助手,打开COM2口。在打开COM1的串口助手发送窗口输入“abc”或“123”,单击发送按钮发送数据。观察打开COM2串口的串口助手窗口,发送的数据会出现在数据接收窗口。
51单片机串行口结构是一个可编程全双工的通信接口,能同时进行数据的发送和接收,它由两个独立的串行数据缓冲寄存器SBUF(一个发送缓冲寄存器,一个接收缓冲寄存器)和发送控制、接收控制器及控制电路构成。
51单片机通过SBUF对串行接收或串行发送寄存器进行访问,SBUF的地址是99H。SCON寄存器是串行口控制寄存器,它用来设定串行口的工作方式、接收发送控制以及设置状态标志等。SCON寄存器的地址为98H,可进行位寻址,各位的定义如下表所示。
SM0和SM1共同确定串行口的工作方式,SM0为0,SM1为1时,串行口工作方式为异步通信口,这也是串口最常用的一种工作方式,TXD(P3.1)为数据发送引脚,RXD(P3.0)为数据接收引脚。
REN为允许串行口接收位,REN=1:允许串行口接收数据,REN=0:禁止串行口接收数据。
在操作串行口之前,需要设置产生波特率的定时器T1、串行口控制和中断控制。
定时器设置:确定T1的工作方式,计算T1的初值,装载TH1和TL1。设置串行口工作方式:SM0=0,SM1=1。允许串行口接收数据:REN=1。RI为接收中断标志位,当串行数据接收完成后,向CPU发出中断申请,在处理程序中,将该位清零,取消此中断申请。TI为发送中断标志位,当串行口发送数据结束后,向CPU发出中断申请,在处理程序中,将该位清零,取消此中断申请。
实验要求:通过串口控制发光二极管的状态。
在proteus仿真电子元器件库搜索“COMPIM”,添加串口器件到电路模型元器件库,添加一个串口器件到电路模型,Physical port设置为COM1,并设置Physical Baud rate为9600。
Physical Baud rate为波特率,波特率通常单位是bit/s,即每秒传输的二进制位数。
实验电路如下图所示:
实验电路非常简单,器件P1为串口器件,串口器件的TXD引脚接单片机的TXD引脚,串口器件的RXD引脚接单片机的RXD引脚,串口器件的其它引脚可以悬空。
单片机内运行的完整C程序如下:
#include
void init();
void main(){
unsigned char temp=0xff;
init();
while(1){
if(RI){
RI=0;
temp=SBUF;
}else{
P1=temp;
}
}
}
void init(){
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
}
函数init()用来设置单片机串行口工作方式、定时器、中断等控制项,TMOD=0x20设置定时器为计数器方式并设置初值,TR1=1启动T1定时器,SM0=0和 SM1=1设置串口工作方式为异步通信方式,REN=1允许串行口接收数据。
main()函数应用while循环结构监测串行口,判断SCON寄存器的RI中断标志位是否为1,若为1,说明串口已接收到数据,数据存储在SBUF缓冲寄存器,RI中断标志位清零,SBUF赋值给temp变量,若RI中断标志位为0,将temp变量的值赋值给P1口。
实验过程:
在proteus启动实验电路,启动虚拟串口和串口助手,串口助手设置为COM2,打开COM2串口,选择16进制发送,在发送窗口输入00,单击发送,实验电路的二极管点亮,再次发送ff可熄灭二极管。
全部0条评论
快来发表一下你的评论吧 !