上海电力学院

 

     Shanghai University of Electrical Power


教学计划

教学课件

课程实验

课程作业

课程习题集

课程辅导 

试题库建设

教材参考书

课程设计

教学录像

网上答疑

汇编软件

虚拟实验

第二课堂


《计算机硬件技术》

  

虚拟实验与虚拟实验室建设

 

一、引言

为了更好地服务教学,我们对传统的实验教学进行了改革,探索了采用新的实验教学模式。由于Proteus仿真软件能模拟仿真计算机硬件及其外围器件组成的硬件系统工作情况,能直接在计算机硬件虚拟系统上采用汇编或C语言进行编程,还可在线调试计算机硬件程序,并提供丰富的实验内容,学生不需要硬件支持就能在计算机上模拟计算机硬件实验,它很好地解决了硬件投入、设备维护和设备场地等问题,又给学生自主实验带来极大的方便。因此,我们可将Proteus仿真软件引入计算机硬件实验教学中来辅助传统实验教学,这是实验教学方法的一种重大变革。

       目前,我们已在课内综合性(或设计性)实验、课程设计、课外扩展实验等较复杂硬件系统中采用Proteus仿真软件进行虚拟硬件实验,达到很好的教学效果。Proteus虚拟仿真实验不仅可以帮助学生更决、更好地掌握计算机硬件的基本概念和原理,调动学生的积极性和主动性,也使学生的综合设计能力和创新能力得到提高,这是传统硬件实验教学无法做到的。

 

二、Proteus软件简介

Proteus是英国Labcenter公司开发的电路分析与实物仿真及印制电路板设计软件,它运行于Windows操作系统上,可以仿真、分析各种模拟电路与集成电路。Proteus提供了大量模拟与数字元器件、外部设备和各种虚拟仪器,特别是它具有对常用控制芯片及其外围电路组成的综合系统的交互仿真功能。Proteus主要由ISISARES两部分组成,ISIS的主要功能是原理图设计及与电路图的交互仿真,ARES主要用于印制电路板的设计。

传统的计算机硬件系统开发除了需要购置诸如仿真器、编程器、示波器等价格不菲的电子设备外,开发过程也较繁琐。传统的计算机硬件系统开发如图1所示,用户程序需要在硬件完成的情况下才能进行软、硬件联合调试,如果存调试过程中发现硬件错误须修改硬件,则要重新设计硬件目标板的PCBPrinted Circuit Board,印制电路板)并焊接元器件。因此无论从硬件成本还是从开发周期来看,其高风险、低效率、周期长的弊端显而易见。

                   

1 传统设计开发流程图            2 基于Proteus ISIS设计开发流程图

 

    来自英国Labcenter Electronics公司的Proteus软件很好地诠释了利用现代EDA工具方便快捷开发计算机硬件系统的优势。英国Labcenter Electronics公司推出的Proteus,可以对基于微控制器的设计连同所有的周围电子器件一起仿真,用户甚至可以实时采用诸如LEDLCD、键盘、RS-232终端等动态外设模型来对设计进行交互仿真。Proteus套件目前在计算机硬件的教学过程中,已越来越受到重视,并被提倡应用于计算机硬件数字实验室的构建之中。Proteus支持的微处理芯片( Microprocessors)包括8086系列、8051系列、AVR系列、PIC系列、HC11系到、ARM7/LPC2000系列等,并且其能支持的微处理器芯片在不断增加之中。Proteus集编辑、编译、仿真调试于一体。它的界面简洁友好,可利用该软件提供的数千种数字/模拟仿真元器件以及丰富的仿真设备,使得在程序调试、系统仿真时不仅能观察到程序执行过程中计算机硬件寄存器和存储器等内容变化,还可从工程的角度直观地看到外围电路工作情况,非常接近于实际的工程应用,给予开发人员莫大便利。

2为基于Proteus ISIS仿真软件的计算机硬件系统设计流程,它极大地简化了设计工作,并有效地降低了成本和风险,得到众多计算机硬件工程师的青眯。

在个人电脑PC上安装了Proteus软件后,即可完成计算机硬件系统原理图电路绘制、PCB设计,更加便利的是可以与8086汇编语言编程工具如MASM32EMU8086等工具软件结合进行编程仿真调试。本章以Proteus Professional 7.8 SP2为背景介绍Proteus ISIS在计算机硬件系统设计中的应用。

Proteus 7 Professional软件主要包括ISIS 7 ProfessionalARES 7 Professional,其中ISIS 7 Professional用于绘制原理图并可进行电路仿真(SPICE仿真),而ARES 7 Professional用于印制电路板PCB设计。在本书中仅仅就ISIS 7 Professional原理图设计与程序仿真部分做了详尽的介绍。

 

、目前计算机硬件实验教学存在的问题

     目前在实验教学中主要存在以下几方面的突出问题亟待解决:

       (1) 学生思想上重理论轻实践。传统的实验教学是作为课堂教学的辅助教学形式,实验环节占课程的学时数及成绩的比重很少,师生都对实验教学的重视程度不够,造成学生操作能力不强。因此,应使学生从思想上提高对实验教学的认识。

       (2) 实验教学内容设置不合理。目前计算机硬件实验有三多三少现象,即验证性、认识性的实验多,设计性、综合性、启发性的实验少;经典型实验多,现代型实验少;操作能力培养的实验多,综合能力培养的实验少。这样不利于发挥学生学习的主动性和积极性,也不利于培养学生动手应用能力和创新能力。

       (3) 实验指导书过于详细。实验课一直以教师为中心,学生在规定的时间内,用统一的模式,按照指导书上规定的步骤做相同的实验,实验程序大多由指导书或教师提供给学生,这不利于学生学习的主动性、积极性的发挥,也不利于学生动手应用能力和创新能力的提高。

(4) 实验设备高度集成化。目前计算机硬件实验设备大多为高度集成的实验箱,实验箱的内部硬件资源和结构固定而有限,学生只能依据实验指导书上的项目做一些验证性实验,而且学生每次实验只用到实验箱上很少的模块,其它的辅助电路以及扩展等电路已经分配好,学生做实验时只需连接几根导线,然后输人相关程序,最后等待观看实验结果。此外.由于无法便捷地更改优化试验箱硬件结构、故而无法进行综合性、设计生等拓展实验项目,限制了学生的思维创新能力、动手能力和综合分析能力的培养。因此.实验箱不能很好地提高学生的动手能力和解决问题能力。

(5) 学生实验动手机会少。计算机硬件实验室建立成本高,实验设备不足、落后,很少学校达到学生人手一套实验装置;由于存在场地和时间不足等问题,学生除了上实验课外平时难得有机会实践;个人配备计算机硬件实验开发系统因成本较高很多学生无法承受;在实验箱成品上学生难以参与到细节设中去,学生动手能力很难得到训练与提高。

(6) 实验指导工作量大。随着大学的扩招,各本科院校纷纷扩大实验室的规模。而由于学校的编制等原因,教师人数并没有相应地增加。因此造成学生人数和指导教师比例失调,一个指导教师往往要同时指导几十个学生做实验,再加上计算机硬件实验属于软、硬件结合实验,实验设备较多,实验内容复杂,个教师往往不能满足指导需求,实验效果得不到保证。

(7) 实验设备维护不到位。计算机硬件实验仪器没备种类多,维修工作量较大,对实验室工作人员的素质要求较高。计算机硬件实验一般需要计算机硬件原理与应用实验箱、计算机、示波器、万用表以及其它一些辅助设备等。只要上述设备中有一部分出现问题,整套设备就处于瘫痪状态,给实验教学造成较大的影响。

(8) 实验指导书内容陈旧且过于详细。计算机硬件技术的发展非常迅速,而实验指导书内容不变,不能与时俱进,不利于学生的发展。实验指导书过于详细,使学生过分依赖教师,缺乏对学生独立分析问题、解决问题能力的培养。

由此导致学生不能把理论与实践相结合,学生学完这门课之后只懂得一些基本理论,在做课程改计,毕业设计或实际设计时不能进行系统设计和芯片选择,更不能提出完整的系统设计方案。因此,需要探索新的实验模式,改进计算机硬件实验教学。

 

四、KeilProteus在计算机硬件实验教学中的应用

1.传统计算机硬件实验教学中存在的弊端

目前计算机硬件的实验大多采用硬件方式实现(如在实验箱上),这种方式的主要缺点有:

实验设备经费投入多、损耗大,维护工作量大;

实验装置的硬件结构同定且资源有限,实验内容呆板同定,实验不够灵活;

如果因为方案有误而进行相应的开发设计,会浪费较多的时间和经费;

学生不能更改任何硬件,学生对计算机硬件的系统设计没有概念,无法将所学的知识融会贯通。

2ProteusKeil µVision3的功能及两者联调

      Proteus是一款由英国Labcenter公司开发的、集计算机硬件和SPICE电路分析于一身的仿真软件。它具有模拟电路仿真、数字电路仿真、计算机硬件及其外围电路系统的仿真等功能:提供了大量的仿真元件和设备,包括各种计算机硬件、常用逻辑电路和调试工具;支持大量的存储器和外围芯片;提供软件调试功能,支持第三方的软件编译和调试环境;具有强大的原理图绘制与PCB板制作功能。

      Keil µVision4是美国Keil Software公司开发的,包含8086 CPU8051系列单片机的开发工具。它支持多种计算机硬件芯片,可以用来编译源码、汇编源程序、连接和重定位目标文件和库文件、创建HEX文件、调试目标程序等,是一种集成化的文件管理编译环境。它集成了文件编辑处理、编译连接、项目管理、窗口、工具引用和软件仿真调试等多种功能。

       ProteusKeil在各自的环境下都可以进行一定程度仿真调试,但若把这两者联合起来,可以发挥各自的优势使得在仿真过程中的软件调试和硬件设计更加便捷、高效。首先在Proteus环境下进行硬件设计,绘制硬件电路图;然后在Keil µVision4环境下进行软件设计,编写源代码并调试程序;接着把程序加载到Proteus硬件原理图的计算机硬件中进行ProteusKeil两者间联调,充分利用两者的联合仿真功能,发现并改正硬件电路或程序源码的错误;系统仿真成功后,再采用Proteus制作PCB板图,并在制好的PCB板上焊接硬件电路,加载所设计的程序,观察实物实验结果,并与仿真结果做比较。

3.采用Proteus软件虚拟计算机硬件实验教学的优点

为了更好地服务教学,我们对传统的实验教学进行了改革,探索了采用新的实验教学模式。由于Proteus仿真软件能模拟仿真计算机硬件及其外围器件组成的硬件系统工作情况,能直接在计算机硬件虚拟系统上采用汇编或C语言进行编程,还可在线调试计算机硬件程序,并提供丰富的实验内容,学生不需要硬件支持就能在计算机上模拟计算机硬件实验,它很好地解决了硬件投入、设备维护和设备场地等问题,又给学生自主实验带来极大的方便。因此,我们可将Proteus仿真软件引入计算机硬件实验教学中来辅助传统的硬件平台实验教学,这是实验教学方法的一种重大变革。下图为在Proteus软件仿真平台上采用单片机实现PWM电机控制的仿真结构图。

  由于Proteus软件能模拟仿真计算机硬件及其外围器件组成的硬件系统工作情况,能直接在计算机硬件虚拟系统上采用汇编或C语言进行编程,还可在线调试计算机硬件程序,并提供丰富的实验内容,学生不需要硬件支持就能在计算机上模拟计算机硬件实验,它很好地解决了硬件投入、设备维护和设备场地等问题,又给学生自主实验带来极大的方便。因此,可将Proteus软件引入计算机硬件实验教学中来辅助传统实验教学,这是实验教学方法的一种重大变革。

采用Proteus仿真软件进行虚拟计算机硬件实验,具有比较明显的优势,其主要优势有:

系统资源丰富,实验内容全面;

提供了大量的范例,可供学生借鉴参考;

硬件投入少,经济优势明显;

学生可白行实验,锻炼独立解决实际,工程问题能力;

实验过程中损耗小,基本没有元器件的损耗问题;

与工程实践很接近,可以了解实际问题的解决过程;

仿真过程直观,操作灵活。

       因此,它不仅可以帮助学生更决、更好地掌握计算机硬件的基本概念和原理,调动学生的积极性和主动性,也使学生的综合设计能力和创新能力得到提高,这是传统实验教学无法做到的。

当然,Proteus也存在着软件环境与实际环境之间的偏差、实时性不高等问题。因此,  对于Proteus处理得不太好的实验(如A/DD/A实验等)以及创新性和综合性实验,可以先进行软件仿真再用硬件搭建系统的方法来对其进行补充与修正,这样既克服了虚拟实验环境与真实世界的偏差,又丰富了学生进行软硬件协同开发设计的经验。

 

五、基于Proteus 8086/8088接口实验

1 基本I/O应用—I/O译码

1.1 功能说明

本实例利用8086微处理器和相关外围芯片构造I/O译码电路,并存成部件组,以便以后使用。同时根据读取到的开关岛的状态,控制发光二极管LED0LED7按一定的规律发光。  该电路用到的仿真元件信息见下表1

1  I/O实验电路元件清单

元件名称

所属类

所属子类

功能说明

8086

Microprocessor Ics

i86 Family

微处理器

74LS245

TTL 74LS series

Transceivers

8路同相三态双向总线收发器

74LS373

TTL 74LS series

Flip-Flops & Latches

三态输出的8 D 透明锁存器

74154

TTL 74 series

Decoders

4-16译码器

74273

TTL 74 series

Flip-Flops & Latches

8 D型触发器(带清除端)

74LS02

TTL74LS series

Gate & Inverters

与非门

4078

CMOS 4000 series

Gate & Inverters

8输入与非门

LED-GREEN

Optoelectronics

LEDs

绿色LED发光管

NOT

Simulator Primitives

Gates

非门

RES

Resistors

 

电阻

SWITCH

Switchs & Relays

Switchs

开关

 

1.2 Proteus电路设计

(1) 创建子电路

绘制I/O译码的层次电路图3

3  I/O译码电路原理图

2)绘制应用电路

本例采用层次图的形式构造译码部分,因此如果采用将制作好的译码部件组导入的方式,需要先在“Root Sheet”即主电路层绘制好子电路模块,然后切换到器件的“Child Sheet”即子电路层中导入上一步保存的部件组文件。选择菜单File→Import Section命令。

选择前面所保存的部件组文件,在原理图编辑窗口就会自动导入器件。

按图4所示搭建应用电路。

4 基本I/O应用实例电路原理图

1.3 代码设计

  本实例通过读取开关状态来控制LED的闪烁与否。

  根据流程图编写相应代码如下:

    MODEL    SMALL

    .8086

    .code

    .startup

           mov   bl,0fh

    1 mov dx,030h

    in    al,dx

    test   al,1

    jz    N

    not   bl

    N  mov  al,bl

    mov  dx, 030h

    out   dx, al

    jmp  1

    .data

    .stack

END

 

2 定时/计数器8253的应用——波形发生器

2.1 功能说明

本实例是定时/计数器8253的应用。初始振荡频率11932MHz,利用8253输出频率为1Hz的波形,以控制LED的闪烁频率。8253的使能信号由基本I/O电路给定。该电路用到的仿真元件信息见表2

 

2  波形发生器实验电路元件清单

元件名称

所属类

所属子类

功能说明

8086

Microprocessor Ics

i86 Family

微处理器

74LS373

TTL 74LS series

Flip-Flops & Latches

三态输出的8 D 透明锁存器

74154

TTL 74 series

Decoders

4-16译码器

74273

TTL 74 series

Flip-Flops & Latches

8 D型触发器(带清除端)

74LS02

TTL74LS series

Gate & Inverters

与非门

7427

TTL74 series

Gate & Inverters

3输入与非门

LED-GREEN

Optoelectronics

LEDs

绿色LED发光管

NOT

Simulator Primitives

Gates

非门

 

2.2  Proteus电路设计

1)构建译码电路

在本实例中,不采用层次电路图,而是直接在主电路图中搭建译码电路,如图5所示。选用 QUOTE  作为8253的片选地址线、 QUOTE  连接基本I/O电路74LS373芯片,从而可见8253的起始地址为0400H,基本I/O电路地址为0600H

5 译码电路原理图

 

2)绘制应用电路

按图6绘制应用电路。

波形发生器元件电路原理图

 

2.3 代码设计

参考代码如下:

io2 = 400h

io3=600h

code segment 'code' ;定义代码段

       assume cs:code

start:      

       mov al,00110100b

       mov dx,io2+6

       out dx,al

       mov ax,2e9ch

       mov dx,io2

       out dx,al

       mov al,ah

       out dx,al

       mov al,01010110b

       mov dx,io2+6

       out dx,al

       mov ax,100

       mov dx,io2+2

       out dx,al

       mov dx,io3

       mov al,01h

       out dx,al

       mov bx,500

wait1:      mov cx,882

       loop $

       dec bx

       jnz wait1

       mov dx,io3

       mov al,00h

       out dx,al

J1:   jmp J1

exit: ret   ;利用功能调用返回DOS

code ends ;代码段结束

       end start

 

仿真开始后需要及时暂停,方便查看波形。仿真启动后,单击菜单Debug→Digital Oscilloscope命令,即可打开示波器面板。Proteus的数字示波器支持四通道,由于本例电路中仅连接了示波器引脚A,因此在面板中只需将“Channel A”拨至“DC”;同时选周幅值为1V,宽度0.1ms。从图7中可以看到,8253的输出方波频率为1Hz

7 波形发生器仿真结果

 

3 并行接口芯片8255A的应用——键盘与数码管

3.1 功能说明

本例结合8255A的使用,说明翻转法行列式键盘的运用及七段数码管的工作原理。该电路用到的仿真元件信息见表3

 

3 键盘实验电路元件清单

元件名称

所属类

所属子类

功能说明

8086

Microprocessor Ics

i86 Family

微处理器

74LS373

TTL 74LS series

Flip-Flops & Latches

三态输出的8 D 透明锁存器

74154

TTL 74 series

Decoders

4-16译码器

74273

TTL 74 series

Flip-Flops & Latches

8 D型触发器(带清除端)

74LS02

TTL74LS series

Gate & Inverters

与非门

4078

CMOS 4000 series

Gate & Inverters

8输入与非门

LED-GREEN

Optoelectronics

LEDs

绿色LED发光管

NOT

Simulator Primitives

Gates

非门

8255A

Microprocessor ICs

Peripherals

可编程24位接口

Button

Switches & Relays

Switch

按钮

7SEG-COM-CATHOD

Optoelectronics

7 Segment Displays

七段红色共阴极数码管

RES

Resistor

 

电阻

 

3.2  Proteus电路设计

1)构建译码电路

本实例中,不采用层次电路图,而是直接在主电路图中搭建译码电路,如图8所示。选用IO3作为8255A的片选地址线,从而可见8255A的起始地址为30H

8 键盘实验译码电路原理图

 

2)应用电路

数码管与键盘实验电路分别如图9和图10所示。

 

9 数码管实验电路原理图            10 键盘实验电路原理图

 

3.3 代码设计

IO0 EQU 00h

IO1 EQU 10h

IO2 EQU 20h

IO3 EQU 30h

IO4 EQU 40h

IO5 EQU 50h

IO6 EQU 60h

IO7 EQU 70h

IO8 EQU 80h

IO9 EQU 90h

IO10 EQU 0A0h

IO11 EQU 0B0h

IO12 EQU 0C0h

IO13 EQU 0D0h

IO14 EQU 0E0h

IO15 EQU 0F0h

 

code segment 'code' ;定义代码段

assume cs:code, ds:code

main  proc far

start:     mov ax,code   ;建立DS段地址

              mov ds,ax

l:            mov al,10000001B

              mov dx,IO3+6

              out dx,al  

              mov dx,IO3+4

              mov al,00              ;高四位送0

              out dx,al

nokey:  in al,dx

              and al,0fH

              cmp al,0fH

              jz nokey

              call delay10

              in al,dx

              mov bl,0

              mov cx,4

LP1:      shr al,1

              jnc LP2

              inc bl

              loop LP1

LP2:      mov al,10001000B

              mov dx,IO3+6

              out dx,al

              mov dx,IO3+4

              mov al,00              ;低四位送0

              out dx,al

              in al,dx

              and al,0f0H

              cmp al,0f0H

              jz l                          ;出错重头来

              mov bh,0

              mov cx,4

LP3:       shl al,1

              jnc LP4

              inc bh

              loop LP3

LP4:       MOV AX,4

              MUL BH

              ADD AL,BL

              mov dx,io3+2

              out dx,al

              mov bx,offset segdata

              xlat

             mov dx,IO3

              out dx,al

              mov cx,0

J1:          loop J1

              jmp l

              RET

 main  endp

 

delay10 proc

             mov cx,882

            loop $

            ret

delay10 endp

 

segdata db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h

code   ends ;代码段结束

end    start

 

4 中断应用8259A芯片的使用

4.1功能说明

本例用以说明8259A的使用,设置8259AIR060H中断,利用按键触发中断,使基本I/O驱动LED灯亮灭。该电路用到的仿真元件信息见表4

 

中断实验电路元件清单

元件名称

所属类

所属子类

功能说明

8086

Microprocessor Ics

i86 Family

微处理器

74LS373

TTL 74LS series

Flip-Flops & Latches

三态输出的8 D 透明锁存器

74154

TTL 74 series

Decoders

4-16译码器

74273

TTL 74 series

Flip-Flops & Latches

8 D型触发器(带清除端)

74LS02

TTL74LS series

Gate & Inverters

与非门

7427

TTL 74 series

Gate & Inverters

3输入与非门

LED-GREEN

Optoelectronics

LEDs

绿色LED发光管

NOT

Simulator Primitives

Gates

非门

8259

Microprocessor ICs

Peripherals

可编程中断控制器

Button

Switches & Relays

Switch

按钮

RES

Resistor

 

电阻

 

4.2 Proteus电路设计

1)译码电路

在本实例中,不采用层次电路图,而是直接在主电路图中搭建译码电路,如图11所示。选用IO2作为8259A的片选地址线、IO3连接基本I/O电路74LS373芯片,从而可见8259A的起始地址为0400H,基本I/O电路地址为0600H

 

11 按键中断实验中的译码电路原理图

 

2)应用电路

应用电路分两部分:基本I/O用于相应中断服务程序中控制LED的亮灭:8259A电路用于接收按钮触发中断。应用电路如图12所示。

 

12  发光二极管接口和按键接口电路图

 

4.3 代码设计

code segment 'code'

assume cs:code,ds:data

main proc far

start: 

       MOV AX,DATA

       MOV DS,AX

       cli

       mov ax,0

       mov es,ax

       mov si,60H*4 ;设置中断向量

       mov ax,offset int0

       mov es:[si],ax

       mov ax,cs       ;seg int0

       mov es:[si+2],ax

       cli    ;初始化8259

       mov al,00010011b

       mov dx,400H

       out dx,al

       mov al,060h

       mov dx,402h

       out dx,al

       mov al,1bh

       out dx,al

        MOV DX,402h

        MOV AL,00H   ;OCW1,八个中断全部开放

        OUT DX,AL

        MOV DX,400h

        MOV AL,60H   ;OCW2,非特殊EOI结束中断

        OUT DX,AL ;完成8259初始化

        mov al,cnt

        mov dx,0600h

        out dx,al

        sti

li:    ;8086模型有问题,它取得的中断号是最后发到总线上的数据,并不是由8259发出的中断号,所以造成了要在这里执行EOI的假相,这三句与下面的指令效果是一样的

        MOV DX,400H

        MOV AL,60h  ;如果改为其它值,将出错,因为只有60H有中断向量

        OUT DX,AL

        jmp li

        ret

        main endp

 

int0 proc

       cli

       mov al,cnt

       rol al,1

       mov cnt,al

       mov dx,0600h

       out dx,al

       MOV DX,400h      ;

       MOV AL,60H        ;

       OUT DX,AL

       sti

       iret

int0 endp

 

code ends

DATA SEGMENT

CNT DB 1

DATA ENDS

end start

 

模数转换ADC0808的使用

5.1功能说明

本例用以说明模数转换器件的应用。利用ADC0808连续检测可变电阻端电压值,并利用电压表和七段数码管观察输出电压值。该电路用到的仿真元件信息见表5

 

5  A/D转换实验电路元件清单

元件名称

所属类

所属子类

功能说明

8086

Microprocessor Ics

i86 Family

微处理器

74LS373

TTL 74LS series

Flip-Flops & Latches

三态输出的8 D 透明锁存器

74154

TTL 74 series

Decoders

4-16译码器

74273

TTL 74 series

Flip-Flops & Latches

8 D型触发器(带清除端)

ADC0808

Component Mode

DATA CONVERTS

AD转换器

POT-HG

Component Mode

Resistors

可调电阻

8255A

Component Mode

Microprocessor ICs

可编程24位接口

Oscilloscope

Virtual Instruments Mode

 

虚拟示波器

AC Voltmeter

Virtual Instruments Mode

 

数字频率发生源

7SEG-MPX4-CC-BLUE

Component Mode

Optoelectronics

4位共阴极数码管

NOR

Component Mode

Simulator Primitives

或非门

 

5.2 Proteus电路设计

1)搭建译码电路

在主电路图中搭建译码电路,如图13所示。选用 QUOTE  作为ADC0808的片选地址线, QUOTE  作为8255A片选地址线。

13 模数转换实验的译码电路原理图

 

2)搭建应用电路

应用电路分A/D转换电路和电压输出显示电路两部分,如图14和图15所示。为仿真简便起见,本实例中ADC0808直接连接了数据总线,通道选择也以固定法来选定通道0;对于8255A控制数码管,则选用PB口送段码,PC4位送位码来实现。

14 模数AD转换部分电路原理图

 

15 电压输出显示部分原理图

 

5.3 代码设计

 

a8255 equ 40h

b8255 equ 42h

c8255 equ 44h

Q8255 equ 46h

adc0808 equ 20h

 

CODE      SEGMENT ;

                ASSUME DS:DATA,CS:CODE

START:  

           MOV AX,DATA

           MOV DS,AX

           mov dx, Q8255

           mov al, 90h

           out dx, al

           mov dx, c8255

           mov al, 0ffh

           out dx, al  

           mov al, 0fh

           out dx, al

            mov al, 0ffh

           out dx, al

           mov si,offset tempdata        

here:   mov dx, adc080 ;启动AD转换

           mov al, 0

           out dx, al

           mov cx,5        ;数码管显示

mon:  mov al,[si]      ;tempdata

           mov ah,0

           mov bl,51

           div bl

           mov bx,offset segdata

           xlat

           or al,80h

           mov dx, b8255

           out dx, al

           mov al,11011111b

           mov dx,c8255

           out dx,al  ;完成首位显示

           call DELAY_1S

            MOV AL,0ffH               ;清屏

            OUT dx,AL

              mov al,ah

              mov ah,0

              mov bl,5

              div bl

              mov bx,offset segdata

              xlat

              mov dx, b8255

              out dx, al

              mov al, 10111111b

              mov dx,c8255

              out dx,al  ;完成次位显示

             call DELAY_1S

              MOV AL,0ffH               ;清屏

              OUT dx,AL

             mov al,01111111b

              out dx,al

              mov al,00011100b

              mov dx,b8255

              out dx,al  ;完成单位显示

             call DELAY_1S

              mov dx,c8255

              MOV AL,0ffH               ;清屏

              OUT dx,AL

              call DELAY_1S

              loop mon

              mov dx, adc0808    ;取AD转换的结果

              in al,dx

              mov [si],al             ;存放到tempdata

              jmp here    

DELAY_1S proc

              PUSH BX

              PUSH CX

              MOV BX, 1

LP2:       MOV CX, 10

LP1:       LOOP LP1

              DEC BX

              JNZ LP2  

              POP CX

              POP BX

              RET   

DELAY_1S endp

CODE      ENDS

DATA      SEGMENT

segdata   db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h

tempdata db 0

DATA       ENDS

              END START

 

六、基于ProteusKeil C的单片机实验

初学者在熟练掌握MCS-51单片机的基本硬件结构和软件资源的基础上,进一步熟悉了用C语言开发单片机程序必须参考和重点掌握的技术内容,了解了用C语言开发单片系统的特点。同时,还熟悉了Proteus的基本操作,ProteusKeil uVision的联合调试技术等,这些都为在Proteus虚拟环境下实现C语言程序设计与开发奠定了良好的准备。

 

1. LED模拟交通灯

1.1设计任务

本例中的l2LED分成东西向和南北向两组,各组指示灯均有相向的2只红色、2 只黄色与2只绿色的LED,本例中对相应的LED单独进行定义,程序运行时模拟了十字路口交通信号灯的切换过程和显示效果。

1.2电路原理图

16  LED模拟交通信号灯电路

 

1.3  C语言源程序

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit RED_A=P0^0;

sbit YELLOW_A=P0^1;

sbit GREEN_A=P0^2;

sbit RED_B=P0^3;

sbit YELLOW_B=P0^4;

sbit GREEN_B=P0^5;

uchar Flash_Count = 0; Operation_Type = 1;//闪烁次数及操作类型变量

void DelayMS(uint x)

{     uchar t;

       while(x--)       {          for(t=120;t>0;t--);  }

}

void Traffic_light()

{

      switch(Operation_Type)

       {

             case 1:            //东西方向绿灯与南北方向红灯点亮

                     RED_A=1;YELLOW_A=1;GREEN_A=0;

                     RED_B=0;YELLOW_B=1;GREEN_B=1;

                     DelayMS(2000);

                     Operation_Type = 2;

                     break;

              case 2:            //东西方向黄灯闪烁提醒,同时,东西方向绿灯关闭

                     DelayMS(200);

                     YELLOW_A=~YELLOW_A;

                     if(++Flash_Count !=10)

                            return;

                     Flash_Count=0;

                     Operation_Type = 3;

                     break;

              case 3:            //东西方向红灯与南北方向绿灯点亮

                     RED_A=0;YELLOW_A=1;GREEN_A=1;

                     RED_B=1;YELLOW_B=1;GREEN_B=0;

                     DelayMS(2000);

                     Operation_Type = 4;

                     break;    

              case 4:            //南北方向黄灯闪烁提醒,同时,南北方向绿灯关闭

                     DelayMS(200);

                     YELLOW_B=~YELLOW_B;

                     if(++Flash_Count !=10)

                            return;

                     Flash_Count=0;

                     Operation_Type = 1;

                     break;    

       }

}

 

void main()

{     while(1)

       {          Traffic_light();       }

}

 

2. 1602字符液晶滚动显示程序

2.1设计任务

本例使用基于HD44780控制芯片的1602液晶显示屏滚动显示一段字符,将通用的LCD显示控制代码独立地编写在LCD1602.C中,这样设计便于以后将它移植到其他案例中。

2.2电路原理图

17 1602字符液晶滚动显示电路

 

2.3 C语言源程序

#include <reg52.h>

#include <string.h>

#define uchar unsigned char

#define uint unsigned int

void Initialize_LCD();

void ShowString(uchar,uchar,uchar *);

sbit K1 = P3^0;

sbit K2 = P3^1;

sbit K3 = P3^2;

uchar code Prompt[]="PRESS K1--K4 TO START DEMO PROG";

uchar const Line_Count = 6;

uchar code Msg[][80]=

{     " ISIS has been created with this in mind.",

       " It has evolved over twelve years ",

       " research and development and has ",

       " been proven by thousands of ",

       "users worldwide.",

       "Meanwhile, ISIS retains a host of ",

       "features aimed at the PCB designer."

};

uchar Disp_Buffer[32];

void Delayxms(uint ms)

{     uchar i;

       while(ms--)

       {          for(i=0;i<120;i++);       }

}

 

void V_Scroll_Display()

{     uchar i,j,k = 0;

       uchar *p = Msg[0];

       uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);

       while(p<q)

       {     for(i=0;(i<16)&&(p<q);i++)

              {

                    if(((i==0)||(i==15))&& *p == ' ')

                            p++;

                     if(*p != '\0')

                     {          Disp_Buffer[i] = *p++;  }

                     else

                     {     if(++k>Line_Count)

                            break;

                            p = Msg[k];

                            Disp_Buffer[i] = *p++;  }

              }

              for(j=i;j<16;j++)

                     Disp_Buffer[j]=' ';

              while(F0)

                     Delayxms(5);

              ShowString(0,0,"      ");

              Delayxms(150);

              while(F0)

                     Delayxms(5);

              ShowString(0,1,Disp_Buffer);

              Delayxms(150);

              while(F0)

                     Delayxms(5);

              ShowString(0,0,Disp_Buffer);

              ShowString(0,1,"      ");

              Delayxms(150);    

       }

       ShowString(0,0,"         ");

       ShowString(0,1,"         ");

}

 

void H_Scroll_Display()

{     uchar m,n,t = 0,L=0;

       uchar *p = Msg[0];

       uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);

       for(m=0;m<16;m++)

                     Disp_Buffer[m]=' ';      

       while(p<q)

       {          if((m=16||m==31)&& *p == ' ')

                     p++;

              for(m=16;m<32&&p<q;m++)

              {     if(*p != '\0')

                     {     Disp_Buffer[m] = *p++;      }

                     else

                     {     if(++t>Line_Count)

                            break;

                            p = Msg[t];

                            Disp_Buffer[m] = *p++;       }

              }

              for(n=m;n<32;n++)

                     Disp_Buffer[n]=' ';

              for(m=0;m<=16;m++)

              {     while(F0)

                    Delayxms(5);

                   ShowString(0,L,Disp_Buffer+1);

                   while(F0)

                           Delayxms(5);

                     Delayxms(20);       }

              L = (L==0)? 1:0;

              Delayxms(200);

       }

       if(L==1)

              ShowString(0,1,"      ");  

}

 

void EX_INT0() interrupt 0

{     F0 = !F0;}

 

void main()

{     uint Count = 0;

       IE = 0x81;

       IT0 = 1;

       F0  = 0;

       Initialize_LCD();

       ShowString(0,0,Prompt);

       ShowString(0,1,Prompt+16);

       while(1)

       {     if(K1 == 0)

              {     V_Scroll_Display();

                     Delayxms(200);  !E !ont>

              else if(K2 == 0)

              {     H_Scroll_Display();

                     Delayxms(200);     }

       }

}

 

3. INT0INT1的中断计数

3.1设计任务

本例同时允许INT0INT1中断,连接P3.2K1按键)和P3.3K2按键)的两个按键触发中断时,对应的中断程序会分别进行计数,两组计数值将分别显示在左右各三只数码管上,另外两个按键分别用于两组计数的清零操作,对它们的判断使用查询法。

3.2电路原理图

18 INT0INT1中断计数电路

 

3.3 C语言源程序

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit k3 = P3^4;

sbit k4 = P3^5;

uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};

uchar code Scan_BITs[]={0x20,0x10,0x08,0x04,0x02,0x01};

uchar data Buffer_Counts[]={0,0,0,0,0,0};

uint Count_A=0;

uint Count_B=0;

void DelayMS(uint x)

{     uchar t;

       while(x--)

       {     for(t=0;t<120;t++);       }

}

 void Show_Counts()

{

      uint i;

       Buffer_Counts[2] = Count_A / 100;

       Buffer_Counts[1] = Count_A % 100 /10;

       Buffer_Counts[0] = Count_A % 10;    

       if(Buffer_Counts[2]==0)

       {     Buffer_Counts[2] = 0x0a;

              if(Buffer_Counts[1]==0)

              {     Buffer_Counts[1]=0x0a;       }

       }

 

       Buffer_Counts[5] = Count_B / 100;

       Buffer_Counts[4] = Count_B % 100 /10;

       Buffer_Counts[3] = Count_B % 10;    

       if(Buffer_Counts[5]==0)

       {     Buffer_Counts[5] = 0x0a;

              if(Buffer_Counts[4]==0)

              {     Buffer_Counts[4]=0x0a;       }

       }

       for(i=0;i<6;i++)

       {     P2 = Scan_BITs[i];

              P1 = DSY_CODE[Buffer_Counts[i]];

              DelayMS(1);

       }

}

 void main()

{     IT0 = 1;

       IT1 = 1;

       PX0 = 1;

       IE  = 0x85;

       while(1)

       {     if(k3 == 0) Count_A = 0;

              if(k4 == 0) Count_B = 0;

              Show_Counts();     }

}

 void EX_INT0() interrupt 0

{     Count_A++;   } 

void EX_INT1() interrupt 2

{     Count_B++;    }

 


计算机硬件技术    


Copyright © 2012 All rights reserved

版权所有:上海电力学院 自动化工程学院  计算机控制教研室(200090)

联系人:  程启明

联系电话:13371896979

Email:chengqiming@sina.com