一、实验目的与任务
实验目的:
1.运行Keil开发环境,完成串行口通信软件编程;
2.利用单片机串行口方式1与主机通信,建立Proteus仿真模型。
3.完成系统仿真与调试。。
任务:
1.根据要求编写程序,并写出原理性注释;
2. 将检查程序运行的结果,分析一下是否正确;
3. 完成所建工程的仿真及调试;
4. 将设计程序下载至开发板验证实验结果。
二、实验内容
设计AT89S51单片机的串行口通过RS232通信接口与PC机进行通信,让单片机把接收到的每一帧数据(即PC机发送给单片机的每一帧数据)直接再发送给PC机,收到的字符通过串口在PC 机的串口调试工具上显示出来。(串行口波特率设定为9600Bit/s,晶振11.0592MHz,使用方式1)。
注意:Proteus仿真中,需要利用仿真图中按键SW1,每按下按键一次就会在两个虚拟终端分别显示单片机上发送的一个字符“01”。
三、实验内容
(1)软件实现:
实验步骤:
1.运行Keil uVision5开发环境,按照“模块化单片机教学实验平台配套的实验指导书1.2.3 节”介绍的方法建立程esimlab7. uvproj,CPU 为AT89S51,包含启动文件STARTUP.A51。
2.输入源程序,在Keil uVision5 开发环境中,建立源程序esimlab7.c,将上述程序加入该程序文件。并将该文件加入工程esimlab7.uvproj。
3.设置工程esimlab7. uvproj 属性,将其晶振频率设置为11.0592MHz,选择输出可执行文件(HEX 文件),仿真方式为“Use Simulator”。
4.构造(Build)工程esimlab7.uvproj。如果输入有误进行修改,直至调试正确,生成可执行程序 esimlab7.hex 为止。
图1 串口通信流程图
(2)Proteus仿真:
实验步骤:
1.运行Proteus 开发环境,建立工程,新建原理图设计文件esimlab7.pdsprj,参考图一。
图一 串口通信仿真图(传输字符用按键SW1输入)
2.设置单片机属性,将其晶振频率设置为11.0592MHz,载入KEIL生成的文件esimlab7.hex。
3.启动Proteus仿真,debug菜单选择两个虚拟终端(见图二),鼠标右键单击虚拟终端1,弹出的虚拟终端窗口选中“HEX DISPLAY MODE”(见图三),虚拟终端2设置同前,每次按下按键SW1,就会在两个虚拟终端分别显示单片机上发送的一个字符“01”,运行仿真并观察结果。
图二 虚拟终端VT1和VT2(传输字符用按键SW1输入)
图三 选中“HEX DISPLAY MODE”
(3)开发板实验验证:(本次实验条件所限,此步骤可忽略)
实验步骤:
1.关掉实验箱电源。将CPU板插接在JK1、JK2 上,注意CPU板的插接方向。使用串口线连接PC机和DB9 接口。按照下表连接关系将硬件连接好。
杜邦线连接关系 | ||||
线序号 | 线端A插接位置 | 线端B插接位置 | ||
开发板 | 端子 | 开发板 | 端子 | |
S1 | MAIN_BOARD | J57/J59:TXD | CPU_51 | P2:P3.1 |
S2 | MAIN_BOARD | J57/J59:RXD | CPU_51 | P2:P3.0 |
2.在仿真器断电情况下将仿真器插在 CPU 板的 CPU 插座上。将仿真器与开发 PC 机的 USB 通信口连接好,母板上电。
3.通过PROGISP 烧写软件,利用ISP 下载线(见“模块化单片机教学实验平台配套的实验指导书1.3 节”)把HEX (esimlab7.hex)文件下载到单片机中。
4.运行程序,在通信接收端用串口调试工具观察通信数据。观察结果是否符合程序要求,若不符合,分析出错原因,至结果正确。
四、实验报告
main.c
#include <REGX51.H>
sbit SW1 = P3^5;
void Delay(unsigned int t)//延时函数
{
unsigned char i, j;
while(t){
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
t--;
}
}
void send(unsigned char dat){
SBUF = dat;//待发送数据写入发送缓冲寄存器
while(TI == 0);//串口未发生完,等待
;
TI = 0;//1个字节发送完毕,等待
}
void main(){
unsigned char i = 01;
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
PCON = 0x00; //波特率不倍速
SCON = 0x40; //8位数据,可变波特率
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
TR1 = 1; //启动定时器1
while(1){
if(SW1 == 0){
send(i);
Delay(200);
}
}
}
通过本次实验,练习了串口通信编程,熟练掌握了方式1的使用,同时锻炼了Keil仿真调试的能力。
串口以方式1输出时,数据位由TXD端输出,发送一帧信息为10位,包括一位起始位0,8位数据位,1位停止位1,当CPU执行写数据到发送缓冲器SBUF的命令后,就启动发送。
在工业现场的测控系统中,常使用单片机进行监测点的数据采集,然后单片机通过串口与PC通信,把采集的数据串行传送到PC上,再在PC上进行数据处理。PC配置的都是RS-232标准串口,为“D”型9针插座,输入/输出为RS-232电平。由于两者电平不匹配,因此必须把单片机输出的TTL电平转换为RS-232电平。