耿兴隆,王 丽,高秀艳
(河北软件职业技术学院 河北 保定 071000)
随着嵌入式系统和物联网技术的发展,单片机作为典型的嵌入式微处理器(MCU)在工业控制及人类生活中得到了广泛应用,如手机、电话、各种家用电器等电子产品中都集成有单片机,汽车上一般会集成40多片,工业控制当中甚至会有数百片单片机在同时工作。单片机的应用要远远大于PC机。而在单片机系统中,往往存在多个单片机相互通信、相互协调进行工作的情况。目前,单片机的通信方式主要有I2C、SPI、CAN、UART等串行通信方式,采用的通信协议主要为RS-232协议,RS-232是EIA在1969年制定的通信标准,定义了数据终端识别(ITE)和数据通信设备(DCE)之间的物理接口标准。
Proteus仿真环境是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA软件仿真模拟电路和数字电路的功能,还能仿真以软件为核心的单片机及外围器件。Proteus是目前最好的单片机及外围器件仿真软件,受到单片机爱好者、教师、嵌入式开发工作者的青睐。Proteus实现了从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计,是迄今为止世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持 8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和 MSP430等,2010年增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译环境。
本系统采用总线型主从式单片机双机通信结构,即在双机通信中,一个单片机为主机,负责通信管理;另一个为从机,负责响应主机的控制。任意一个单片机系统可以同时以主机和从机的角色出现。处理器芯片采用AT89C51,串口芯片采用MAX232,编译环境为 Keil C,硬件设计使用protues,程序仿真使之能实现两个单片机之间的通信,甲机控制乙机LED的闪烁,乙机控制甲机数码管0~9数字循环显示。
硬件设计微处理器采用两片AT89C51单片机,分别用甲机、乙机来表示,如图1所示。利用串口芯片MAX232连接单片机串行通信的收发引脚P3.0和P3.1,甲机数码管连接P0口,低电平驱动,注意P0口需加上拉电阻实现,甲机、乙机P1.0和P1.3连接两个LED,低电平驱动,按键K1和K2分别连接在P1.7引脚上,实现控制信号的采集。
图1 硬件结构和仿真效果图
软件设计分为以下几个部分:初始化串口、发送数据、接收数据、键盘输入、数值转换、LED显示或者数码管显示,用Keil C编译。软件设计流程图如图2、图3所示。
图2 甲机程序流程图
图3 乙机程序流程图
甲机程序关键代码:
#define uint unsigned int
#define uchar unsigned char
sbit LED_1=P1^0;
sbit LED_2=P1^3;
sbit KEY_1=P1^7;
uchar Operation_NO=0;
uchar code DSY_CODE[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void putc_to_SerialPort(uchar c)
{
SBUF=c;
while(TI==0);
TI=0;
}
void main()
{
LED_1=LED_2=1;
P0=0x00;
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TH1 =0xfd;
TL1 =0xfd;
TI =0;
RI =0;
TR1 =1;
IE =0x90;
while(1)
{
Delay(100);
if(K1==0)
{
while(KEY_1==0);
Operation_NO=(Operation_NO+1)%4;
switch(Operation_NO)
{
case 0:
putc_to_SerialPort('X');
LED_1=LED_2=1;break;
case 1:
putc_to_SerialPort('A');
LED_1=0;LED_2=1;break;
case 2:
putc_to_SerialPort('B');
LED_2=0;LED_1=1;break;
case 3:
putc_to_SerialPort('C');
LED_1=0;LED_2=0;break;
}
}
}
}
void Serial_INT() interrupt 4
{
if(RI)
{
RI=0;
if(SBUF>=0&&SBUF<=9)
P0=DSY_CODE[SBUF];
else
P0=0x00;
}
}
乙机程序实现关键代码:
#define uint unsigned int
#define uchar unsigned char
sbit LED_1=P1^0;
sbit LED_2=P1^3;
sbit KEY_1=P1^7;
uchar NumX=0xff;
void main()
{
LED_1=LED_2=1;
SCON=0x50;
TMOD=0x20;
PCON=0x00;
TH1 =0xfd;
TL1 =0xfd;
TI =0;
RI =0;
TR1 =1;
IE =0x90;
while(1)
{
Delay(100);
if(KEY_1==0);
{
while(KEY_1==0);
NumX=(NumX+1)%11;
SBUF=NumX;
while(TI==0);
TI=0;
}
}
}
void Serial_INT() interrupt 4
{
if(RI)
{
RI=0;
switch(SBUF)
{
case'X':LED_1=1;LED_2=1;break;
case'A':LED_1=0;LED_2=1;break;
case'B':LED_2=0;LED_1=1;break;
case'C':LED_1=0;LED_2=0;
}
}
}
将以上关键程序利用Keil C编译生成.Hex文件,在Proteus原理图界面双击单片机,在弹出的编辑窗口编辑晶振频率(11.0592MHz),点击“Program File”,选中在Keil C里生成的.Hex文件,确定即可。点击仿真按钮,进行仿真。每按一次K1按键,甲机和乙机的LED分别实现上亮、下亮、全亮;每按一次K2按键,甲机数码管数字从0~9循环显示。仿真效果如图1所示。
文中研究了在嵌入式虚拟实训平台下的AT89C51单片机利用MAX232串口芯片进行双机通信的仿真,软件部分和现实设计中一样采用Keil C编程,仿真结果表明通信成功可靠。与传统硬件仿真器仿真相比,由Proteus+Keil C组成的嵌入式虚拟实验平台便于设计者修改元件参数来优化设计,效率高、成本低、效果好。
利用嵌入式虚拟仿真环境进行嵌入式系统的设计开发具有一定的推广意义。实验证明,该系统具有通用性,可以运用于其他相关型器件与微处理器中,对高等院校教学和社会实际应用具有很高的参考价值。
[1]郑贤标,姜伟,周见行,等.基于Proteus的单片机数据采集系统仿真[J].机电工程,2010.27(1):31-33,37.
[2]丁明亮,唐前辉.51单片机应用设计与仿真——基于Keil C与Proteus[M].北京:北京航空航天大学出版社,2009:90-96.
[3]宁成军,张江霞.基于Proteus和KeilC接口的单片机外围电路仿真[J].现代电子技术,2006,29(18):142-143.
[4]张力,林卫共.Labview及Proteus软件环境下单片机串口通讯的仿真方法[J].电子测量技术,2010,33(4):87-90.