51单片机常用外设(硬件)软仿真

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机常用外设(硬件)软仿真
(陕西师范大学物理学与信息技术学院,杨春江,西安,710062)
摘要:单片机体积小,功能强,具有很强的灵活性,具有逻辑判断,定时计数等多种功能,广泛应用于仪器仪表,家用电器,医用设备的智能化管理和过程控制等领域。

以单片机为核心的嵌入式系统已经成为目前电子设计最活跃的领域之一。

但在嵌入式系统的中,开发板成本高,特别是对于大量的初学者而言,还可能由于设计的错误导致开发板损坏。

然而我们也发现基于51单片机的嵌入式应用几乎都要用到这几种常用外设硬件(51单片机,LED,LCD,RAM,键盘,D/A,A/D)。

Proteus 就是一款功能强大的EDA仿真软件。

它拥有丰富的库元件,尤其是动态外设的仿真极大地补充了其他仿真软件的不足;虚拟工具箱的引入为仿真测试提供了方便。

本文以51单片机为例具体分析了该软件在仿真微处理器及其外设硬件方面的独到之处,protues能有效的仿真51单片机及其常用外设硬件,大幅提高开发效率和降低开发成本。

关键词:51单片机Proteus软仿真常用外设(硬件)
0.引言
单片机应用技术所涉及到的试验实践环节比较多,而且硬件投入比较大。

在具体的工程实践中,如果因为方案有误而进行相应的开发设计,会浪费较多的时间和经费。

所以进行软件的软仿真是非常有用和必要的。

有一点必须先肯定,软件仿真不能替代硬件仿真。

软件仿真只是对硬件的仿真模拟,但是软件仿真仍有必要。

目标系统是千变万化的,需要开发者去实现。

实现可能需要相当长一段时间,甚至完成后不能随意调试,因此有必要对目标系统进行模拟或仿真,以便开发、检测嵌入式软件。

外围设备软件仿真可以快速建立开发目标的模拟系统。

由于各仿真部件是软件,因此只要部件存在,就没有采购、制作电路板的过程。

将各部件按规则布置、用软件连接,就构成了目标模拟系统。

外围设备软件仿真可以使嵌入式的软件设计与硬件设计相对独立。

软件设计者可以先在模拟软件上进行功能和逻辑测试,从而减少了对硬件的依赖。

外围设备仿真软件在一定条件下可以制作为检测硬件功能的工具。

如果仿真部件的连接口可以转化为硬件接口,那么就可以在硬件上用软件仿真部件代替被仿真部件运行。

外围设备软件仿真可以降低开发成本。

过去有时为了配合软件开发,需要在硬件开发初期制作一些测试硬件。

而现在,硬件开发可以按自己的需要按部就班地进行,只要在必要时与软件设计者沟通就可以了。

外围设备软件仿真可以方便单片机程序的调试,在程序涉及外围设备时不必做任何处理直接运行,仿真软件会自动处理对它的访问。

1.Proteus仿真功能简介
作为一款EDA仿真软件,Proteus与同类软件有着很多的相似之处。

相比之下,其主要的特点有两个:一是对动态元件的实时仿真,它对“人机对话”的模拟增强了系统的真实性;二是虚拟工具箱的功能,它能与仿真同时进行,测量方便而准确。

下面着重介绍一下该软件的这两个突出特点。

1.1.实时动态仿真
与多数仿真软件相似,Proteus有着数量庞大的元件库。

Labcenter公司与相关的第三方软件阵容共同开发了6000多个模拟和数字电路中常用的spice模型以及各种动态元件,基本元件如电阻、电容、各种二极管、三极管、MOS 管、555定时器等;74系列TTL 元件和4000系列CMOS元件;存储芯片包括各种常用的ROM, RAM,EEPROM, 还有常见I2C器件等。

在丰富的库元件的支持下,原理布图时只要进行相应的调用和连线,通过对每个元件的属性设置完成绘图,然后即可进行仿真和虚拟测量。

关于原理图的具体绘制方法不是本文讨论的重点,请参考软件提供的帮助教程
1.2虚拟工具箱
Proteus 的虚拟工具箱提供了电路测试中的常用工具和仪器,主要用于在实时仿真同时的电路参数观测,测量结果随仿真动态变化并显示,可以满足精度要求不是很高的测量分析,对于电路特性的定性分析可以起到事半功倍的效果,大大节约了测试时间和开发成本。

软件提供的虚拟工具和仪器如图1.1所示。

*图1.1 虚拟工具箱
下面我们以示波器为例来说明虚拟工具箱的应用。

图1.2
图中的电路非常简单,单片机AT89C52中写入的是一个输出驱动直流电机的PWM方波的程序。

我们把输出管脚连接到示波器的CH1通道,运行仿真,用鼠标调节虚拟示波器的Y轴幅度和X轴扫描频率,整个调节步骤同真实的示波器完全一样。

当波形稳定时可以观测到一个占空比可调的PWM方波,如图所示。

2.Proteus在单片机仿真中的应用
基于VSM的理论,Proteus可以仿真很多常用的微处理器。

具体来讲,它支持PIC, 8051, A VR, HC11, ARM7/LPC2000等系列多种型号的微处理器、微控制器,仿真时只需在设定元件属性时指定下载程序的路径即可进行实时动态仿真。

2.1.Proteus对51单片机的仿真
就Atmel公司的51系列单片机而言,Proteus支持的型号非常全
面,从低端ATtiny10到高端的ATmega128均有可以直接调用的库元
件。

下面以AT89c52为例介绍Proteus支持的仿真功能。

图2.1是Proteus中的AT89c52库元件,其管脚上的标识与该芯片
的Datasheet 是基本一致的,唯一的不同是隐去了GND和VCC管
脚,在绘制原理图的时候可以不用对其进行连接,系统默认的设
置就是将它们分别连到地和5V电源上。

具体可以仿真的功能有:
支持所有的I/O操作,内部的定时器、计数器的模拟(包括输入捕
获、输出比较、PWM模式),看门狗定时器,串行UART接口,主、
从模式串*SPI接口,支持内置数模转换ADC,支持Atmel的TWI
(Two*Wire nterface)通信方式,存贮器方面支持外部SRAM扩展以及内置EEPRO 的模拟,支持多个微控制器的协同工作仿真等等。

仿真时,首先绘制原理图,然后将任何A VR源程序编译器(WinA VR等)生成的下载文件(*.hex格式)路径指定给原理图中的芯片,就可以观察程序的运行。

另外值得一提的是,实时仿真运行的过程中,每个管脚的旁边会出现一个小正方形的指示,红色代表高电平,蓝色带表低电平,从这个小正方形我们可以不用虚拟工具的测量很直观的看到每个管脚的电平变化,对程序的运行做出最基本的判断,对于简单的分析可以节省很多的时间。

在本文图1.2和图2.2的例子中,AT89c52的19管脚输出的是方波,所以旁边可以看到一个红蓝交替、以一定频率闪烁的小正方形。

2.2.Proteus与其他单片机仿真软件的比较
51系列单片机可以可用很多的软件进行仿真。

常用的有A VR Studio和Vmlab。

A VR Studio、Vmlab和Proteus都属于代码级的仿真软件,与芯片级仿真
不同,代码级仿真完全在计算机上完成,不需要硬件的参与,主要用于查看代码的执行过程和参数变化。

在具体功能上,这三款软件各有千秋。

A VR Studio是一款完全免费的A VR单片机集成开发环境,包括A VR Assembler编译器和A VR Studio 调试功能,A VR Prog串行、并行下载功能和Jtag ICE仿真功能。

它最主要的功能是观察代码执行过程中单片机内部各个寄存器值的变化,尤其是一些寄存器关键位的置位、复位操作与代码的关系。

利用单步调试功能可以更细致的检查代码的执行过程。

对于内部的定时中断也可以较好的仿真,使实验者清楚了解中断对于整个程序流程的影响。

但是对于外部中断和输入捕获等需要动态外设配合的功能,A VR Studio就显得无能为力了。

同时该软件使用黑色、白色的方块来表示1和0,用以反映寄存器值的变化,当需要观察某些波形时,这样的仿真结果显得很不直观。

Vmlab在这方面要做得好一些。

VMLAB的全称为:Visual Micro Lab。

它针对于A VR以及ST62系列单片机设计,是一个单片机的虚拟原型框架。

它具有强大的多窗口、多文件的编辑器,微控制器的集成开发环境,拥有一系列的集成开发工具,图形界面调试器,混合模式的模拟-数字电路仿真器,代码质量检查器等等。

硬件和应用软件能进行并发仿真。

与Proteus最为相似的一点是它可以以单片机为核心仿真出包括模拟元器件在内的一些动态外设(按键,LED,液晶显示器等),具有图形显示和波形显示的功能。

如果就单片机及一些简单的动态外设而言,Vmlab和Proteus有着很大的相似,最多只是软件本身的操作方法有着很大的不同。

但是Proteus不仅仅是一个51系列单片机的仿真软件,它所支持的大量常用芯片模型为单片机和其他芯片协同仿真复杂的完整系统提供了极大的方便。

请看下面的例子,如图2.2所示
3.Proteus仿真实例分析
单片机、矩阵键盘、RAM扩展和字符型液晶或LED数码管的组合是单片机实验中最常用的简单系统之一,是很多最小系统板的核心部分。

在开发实际的单片机系统时,“人机对话”部分主要靠这个系统来实现。

在编写这部分程序时要进行频繁的测试从而更改一些参数使系统达到良好的工作状态,常见的问题有:显示界面的布局、菜单层次的设置、按键灵敏度和防抖的参数等。

有了下面介绍的Proteus仿真,这些测试和一些经验值的调整就可以不需要进行频繁的硬件测试了,而只需要改动源程序中的一些函数调用。

这个系统可以稍加改动轻松应用于其他各类系统的输入和输出部分,具有普遍意义。

3.1.1602字符型液晶简介
该显示模块由字符型液晶显示屏(LCD),控制驱动主电路HD44780及其扩展驱动电路HD44100,少量阻、容元件,结构件等装配在PCB板上而成。

液晶显示屏是以若干个5×8或5×11点阵块组成的显示字符群。

每个点阵块为一个字符位,字符间距和行距都为一个点的宽度。

该字符型LCD具有字符发生器ROM可显示192种字符(160个5×7点阵字符和32个5×10点阵字符)具有64个字节的自定义字符RAM,可自定义8个5×8点阵字符或四个5×11点阵字符。

且具有80个字节的RAM。

可以分两行、每一行显示16个ASCII字符,足以应付简单用户界面(主要由数字和英文字母组成)的开发和系统参数的显示。

3.2.4*4矩阵键盘
4*4矩阵键盘有4行4列,键盘上有4*4=16个按键,而它只需要占用4+4=8个I/O 口,这样的设计大大节省了单片机宝贵的I/O口资源[2]。

单片机提供一定频率的扫描信号并对用户的按键值进行分析和处理,达到正确判断16个按键的目的。

对于一般的单片机系统,16个按键足以满足多应用的需求。

因此,它可以作为很多系统的按键输入工具。

3.3RAM扩展
因为51系列单片机片内部RAM一般只有256字节,所以在一些应用中往往不够用,那么就需要扩展外部RAM。

6116是2K*8 static RAM,已经完全够用。

3.4.系统综合分析
根据以上的分析,以及各器件的工作原理,绘制系统原理图3.1。

图3.1LED和键盘综合应用
图3.2液晶和键盘综合应用
图3.3RAM扩展
单片机 AT89C52是这三个系统的核心,下载的程序是液晶和键盘的驱动。

其中P20-P22分别连接液晶的三个控制使能端,通过它们的译码组合来实现液晶读写指令和数据的控制。

P00-P07连接液晶的八位数据端,负责控制命令和读写字符的数据传输。

P10-P13是输出端,连接键盘的4列,输出列扫描信号;P14-P17是输入端,连接键盘的4行,捕捉用户的按键作为行信号,通过行列信号的组合可以唯一确定16个按键之一,从而供单片机处理。

图中模拟的情况是,LED数码管显示的是按键的值(0-F),液晶的第一行显示预置的字符串信息“THE 1602LCD Test”,。

当鼠标按下其他的健时,液晶的显示会同步更新,这就是Proteus实时动态仿真的神奇之所在!
3.5关键程序如下:
1602lcd:
/********************************************************************** THE 1602 CHAR LCD LIB
COPYRIGHT (c) 2008 BY YCHJ.
-- ALL RIGHTS RESERVED --
File Name: LCD.h
Author: Yang Chunjiang
Created: 2008/5/1
Modified: NO
Revision: 1.0
****************************************************************** #ifndef LCD_CHAR_1602_2005_4_9
#define LCD_CHAR_1602_2005_4_9
#include <intrins.h>
//Port
Definitions********************************************************** sbit LcdRs = P2^0;
sbit LcdRw = P2^1;
sbit LcdEn = P2^2;
sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数********************************************************************** unsigned char LCD_Wait(void)
{
LcdRs=0;
LcdRw=1; _nop_();
LcdEn=1; _nop_();
//while(DBPort&0x80);//在用Proteus仿真时,注意用屏蔽此语句,在调用GotoXY()时,会进入死循环,
//可能在写该控制字时,该模块没有返回写入完备命令,即DBPort&0x80==0x80
//实际硬件时打开此语句
LcdEn=0;
return DBPort;
}
//向LCD写入命令或数据************************************************************ #define LCD_COMMAND 0 // Command
#define LCD_DATA 1 // Data
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
void LCD_Write(bit style, unsigned char input)
{
LcdEn=0;
LcdRs=style;
LcdRw=0; _nop_();
DBPort=input; _nop_();//注意顺序
LcdEn=1; _nop_();//注意顺序
LcdEn=0; _nop_();
LCD_Wait();
}
//设置显示模式************************************************************ #define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
void LCD_SetDisplay(unsigned char DisplayMode)
{
LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
}
//设置输入模式************************************************************ #define LCD_AC_UP 0x02
#define LCD_AC_DOWN 0x00 // default
#define LCD_MOVE 0x01 // 画面可平移
#define LCD_NO_MOVE 0x00 //default
void LCD_SetInput(unsigned char InputMode)
{
LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
//移动光标或屏幕************************************************************ /*
#define LCD_CURSOR 0x02
#define LCD_SCREEN 0x08
#define LCD_LEFT 0x00
#define LCD_RIGHT 0x04
void LCD_Move(unsigned char object, unsigned char direction)
{
if(object==LCD_CURSOR)
LCD_Write(LCD_COMMAND,0x10|direction);
if(object==LCD_SCREEN)
LCD_Write(LCD_COMMAND,0x18|direction);
}
//初始化LCD************************************************************ void LCD_Initial()
{
LcdEn=0;
LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
LCD_Write(LCD_COMMAND,0x38);
LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
}
//***************************************************************** void GotoXY(unsigned char x, unsigned char y)
{
if(y==0)
LCD_Write(LCD_COMMAND,0x80|x);
if(y==1)
LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
void Print(unsigned char *str)
{
while(*str!='\0')
{
LCD_Write(LCD_DATA,*str);
str++;
}
}
/*
void LCD_LoadChar(unsigned char user[8], unsigned char place)
{
unsigned char i;
LCD_Write(LCD_COMMAND,0x40|(place*8));
for(i=0; i<8; i++)
LCD_Write(LCD_DATA,user[i]);
}
//***************************************************************** #endif
键盘扫描:
unsigned char hang = 4,lie = 4, keyvalue;
unsigned char code guanxian[4][4]={ {0x3f,0x06,0x5b,0x4f},
{0x66,0x6d,0x7d,0x07},
{0x7f,0x6f,0x77,0x7c},
{0x39,0x5e,0x79,0x71} };
unsigned char keyscan() //键盘扫描
{
unsigned char key;
P1 = 0x0f;
switch(P1)
{
case 0x0e:lie=0;break;
case 0x0d:lie=1;break;
case 0x0b:lie=2;break;
case 0x07:lie=3;break;
default:break;
}
P1=0xf0;
switch(P1)
{
case 0xe0:hang=0;break;
case 0xd0:hang=1;break;
case 0xb0:hang=2;break;
case 0x70:hang=3;break;
default:break;
}
if(hang + lie < 8)
key = guanxian[lie][hang];
else
key = 0x71;
return (key);
3.6用Proteus软件进行基于51单片机应用的软仿真的优点
采用Proteus 仿真软件进行单片机及其外设(硬件)的软仿真,具有比较明显的优势,如涉及到的应用系统内容全面、硬件投入少、学生可自行仿真实验、实验过程中损耗小、与工程实践最为接近等。

当然其存在的缺点也是有的。

(1)内容全面
内容全面包括其能实验的内容包括软件部分的汇编、C51等语言的调试过程,也包括硬件接口电路中的大部分类型。

对同一类功能的接口电路,可以采用不同的硬件来搭建完成,因此采用Protues仿真软件进行仿真实验,克服了用单片机实验板中硬件电路固定、用户不能更改、实验内容固定等方面的局限性,可以扩展学生的思路和提高学生的学习兴趣。

(2)硬件投入少,经济优势明显
对于传统的采用单片机实验板的实验,由于硬件电路的固定,也就将单片机的CPU和具体的接口电路固定了下来。

在单片机的实际应用中,如果要涉及到51系列,也要涉及到PIC16系列,那么为了应用必然要投入两种单片机的实验板;同时在开发应用过程中所涉及到的接口电路,也需要有较大的投入和储备,以利于开发的进行和在实验过程中元件损毁后的更换。

Protues所提供的元件库中,大部分可以直接用于接口电路的搭建,同时该软件所提供的仪表,不管在质量还是数量上,都是可靠和经济的。

如果在实验开发阶段投入这样的真实的仪器仪表,仅仪表的维护来讲,其工作量也是比较大的。

因此采用软件的方式软仿真试验开发,其经济优势是比较明显的。

(3)初学用户或学生可自行实验,锻炼解决实际工程问题的能力
实验能力和实验设计能力的培养,是工科学生解决实际工程问题能力中较为重要的。

传统的实验教学中,忽视了学生实验能力的培养,对于实验设计能力的培养,则很少涉及到。

因此学生学习了理论,要想将其应用到实际的工程实践中,其难度是比较大的。

还有,学生毕业后想对单片机控制技术或智能仪表等有较深的研究和学习,如果采用传统的实验教学方法,则学生需要购置的设备比较多,增加了他们学习和研究的投入。

采用仿真软件后,学习的投入变得比较的小,而实际工程问题的研究,也可以先在软件环境中模拟通过,再进行硬件的投入,这样处理,不仅省时省力,也可以节省因方案不正确所造成的硬件投入的浪费。

(4)实验过程中损耗小,基本没有元器件的损耗问题
在传统的实验开发过程中,都涉及到因操作不当而造成的元器件和仪器仪表的损毁,也涉及到仪器仪表等工作时所造成的能源消耗。

采用Protues仿真软件进行的实验开发,则不存在上述的问题,其在实验的过程中是比较安全的。

(5)与工程实践最为接近,可以了解实际问题的解决过程在进行课程设计或进行大实验的时候,可以具体的在Protues中做一个工程项目,并将其最后移植到一
个具体的硬件电路中,让学生了解将仿真软件和具体的工程实践如何结合起来,利于学生对工程实践过程的了解和学习。

4.结语
本文所介绍的是应用Proteus对51单片机及其外设(硬件)进行软仿真的初步介绍。

这只是protues强大功能中的一部分。

Proteus还具有环境模拟、图表分析、噪声分析等高级应用。

读者通过自学可以进一步了解该软件在EDA设计的各个领域的综合应用。

同时,Proteus的出现也为单片机实验开发工作和单片机及其外设(硬件)的软仿真提供了一条方便、快捷、节约成本的新思路。

相信随着越来越多的人对Proteus的了解和使用,它会对我们的学习、科研和工作带来越来越多的帮助。

(指导教师:陈森林)
参考文献
[1] 张靖武,周灵彬,《单片机系统的PROTEUS设计与仿真》,电子工业出版社2007
[2] 黄任,《A VR 单片机与CPLD/FPGA 综合应用入门》,北京航空航天大学出版社2004
[3]
51MCU common peripherals(hardware) soft Simulation
(Shaanxi Normal University Institute of Physics and Information Technology,
YangChunjiang,Xi'an, 710062)
Abstract:MCU has small size, strong function, with strong flexibility and a logical judgement, timing counts, and other functions.It is widely used instruments, household appliances, medical equipment intelligent management and process control, and other fields. MCU embedded systems at the core of the current electronic design has become one of the areas most active. But in the embedded system, the development board has a high cost, especially for the large number of beginners, may also be due to design errors led to the development board damage. However, we also found that 51 MCU-based embedded applications using these types of almost all commonly used hardware peripherals (51 SCM, LED, LCD, RAM, keyboard, D / A, A / D). Proteus is a powerful EDA simulation software. It has a wealth of the components, in particular, the dynamic simulation peripherals greatly add to the lack of other simulation software, virtual toolbox for the introduction of simulation tests to provide a convenience. 51 MCU as an example to this specific analysis of the simulation software in the microprocessor and the unique hardware peripherals, protues effective simulation of the 51 MCU and its common external hardware to substantially increase development efficiency and lower development Cost.
Key words: 51 MCU Proteus soft simulation commonly used peripherals (hardware)。

相关文档
最新文档