while(RI!=1); RI=0; //等待从机回发地址
if(RB8==1) //如果RB8为1,是地址帧 {
SM2=1;ES=1;goto reback; //SM2置1,开串行中断,跳转到reback }
a=SBUF;
if(a==0x01) //从机接收主机的数据 {
SBUF=0X01; //while(TI!=1); TI=0; //while(RI!=1); RI=0; //if(RB8==1) //{
SM2=1;ES=1; goto reback; //SM2}
rdata=SBUF; //while(RI!=1); RI=0; //SM2=1; ES=1; //SM2}
else {
if(a==0x02) //{
SBUF=0X02; //while(TI!=1); TI=0; //SBUF=tdata;
while(TI!=1); TI=0; //SM2=1; //SM2ES=1; //} else {
SBUF=0X80; //while(TI!=1); TI=0; //SM2=1; //SM2ES=1; //} }
reback:; //发送命令帧0X01,从机准备好接收数据 等待命令发送结束
等待数据接收完成
如果RB8为1,是地址帧 置1,开串行中断,跳转到reback 接收主机发送的数据 等待数据接收完成 置1,开串行中断 如果命令帧是0x02 回发命令帧0X02,从机准备好发送数据 等待命令发送完成 等待数据发送完成
置1,只接收地址帧 开串行中断
命令非法,发状态 等待命令发送结束
置1,只接收地址帧 开串行中断 跳转标号
}
系统从机外部中断INT0中断服务程序流程图如图4.5所示。 开始
保护现场系统从机外部中断INT0中断服务程序:
void ISR0(void) interrupt 0
从机发送的数据tdata+1{
Ntdata<9?tdata++; //要发送的数据加1
Yif(tdata>=9)tdata=0; //如果数据大于8,清零
tdata=0}
恢复现场结束图4.5 外部中断服务程序流程图
4.3本章小结
本章主要完成系统的软件设计,通过对功能的分析,软件流程图的绘制,编写了系统的模块化子程序,多机串行通信的主机和从机程序。用C51编写的程序具有可移植性,直观明了,易于读写和修改的特点,是汇编用语言所无法比拟的。
5.系统仿真与调试
Proteus 软件包括汇编语言编译系统,可以在软件平台上对单片机进行可视化调
试。但是,现在的大部分的单片机开发人员都用C 语言对单片机进行编程控制。应用TCP/IP 协议,Proteus 与Keil 的联调很好地解决了Proteus 自带的编译系统无法对C 语言进行编译的问题[4]。
5.1 生成单片机可执行文件
要进行仿真和调试,还必生成单片机可执行文件.hex文件,.hex文件时是在Keil集成开发环境中生成的,生成过程[7][11]如下:
双击Keil uViosion3图标 ,进入Keil uViosion3集成开发环境,如图5.1所示。
生成工程文件,单击“Project/New uVision Project”,在弹出的对话框中,键入工程名为“串行通信主机程序”,单击保存,如图5.2所示的对话框。选择Atmel公司的AT89C51作为应用和实验对象,弹出启动代码添加提示对话框选择“否”。返回集成开发环境界面,单击“Feil/New”,然后单击“Feil/Save”,在弹出的对话框中输入文件名“ MainShangWeiji.c”(后缀名一定要有,本系统程序用C51语言编写,后缀为.C),单击“保存”将文件存储到“串行通信主机程序”所在的文件夹中。
图5.1 Keil uVision 3集成开发环境
图5.2 工程器件选择对话框
图5.3 文件组快捷菜单
由于本系统用到了LCD1602,所以要用到
LCD1602的驱动程序和头文件,因此要添加LCD1602.c和LCD1602.h文件(此程序在网上可以查到,不必自己编写),为了便于在程序中改换接口,创建一个“hardware.h”文件。在源程序准备好以后,要将这些文件添加到项目中,在左侧“Projece Workspace”栏中右击“Source Group 1”,弹出如图5.3所示的文件快捷键菜单,选择“Add Files to Group‘Source Group 1’”,再在弹出的对话框中,文件类型选择“C Source file(*.c)”,添加“MainShangWeiji.c”和“LCD1602.c”;文件类型选择“Text file(*.txt;*.h;*.inc)”添加“LCD1602.h”和“hardware.h”文件,结果如图5.4所示。
为了编译项目并创建AT89C51单片机可执行文件*hex,则需对Optitions for Target 'Targer '进行相应设置。在左侧“Projece Workspace”栏中右击“Taget1”,选择“Optitions for Target 'Targer '”,在弹出如图5.5所示的对话框中,点击“Output”,在“Create Executable”下面的复选对话框中,单击Create HEX File
图5.5 选中Create HEX File 复选框
前面的复选框,进行选中。单击“确定”返回集成开发界面。
单击build taget图标 ,对目标文件进行编译,如图所示5.6所示。结果显示程序没有错误,有一个警告,可以忽略,并产生一个“串行通信主机程序.hex”文件。
利用同样的方法编译0#、1#和2#机的并生成“串行通信0号从机程序.hex”、“串行通信1号从机程序.hex”和“串行通信2号从机程序.hex”三个单片机可执行文件。
5.2基于Proteus的仿真与调试
本系统的主机程序和个下位机程序均在KEIL集成开发环境中进行编写,经过编译生成了四个单片机可执行文件“串行通信主机程序.hex”、“串行通信0号从机程序.hex”、“串行通信1号从机程序.hex”和“串行通信2号从机程序.hex”。
5.2.1系统仿真
打开在Proteus ISIS已经绘制好的仿真原理图,双击元器件U1弹出如图5.7所示的对话框。点击“Program File”后面的文件夹按钮,弹出文件列表,从中选择目标代码文件“串行通信主机程序.hex”,点击“OK”,即将十六进制单片机可执行成加载到单片机中,同样的方法分别将从机的目标代码文件加载到相应的单片机中,以备仿真。
图5.7 AT89C51单片机属性对话框
单击仿真按钮中最左边的按键 ,则进入全速仿真,出
图5.8 仿真结果