微机原理课程设计 玩具遥控汽车

合肥学院

计算机科学与技术系微机原理与接口技术

课程设计报告

2011~2012 学年第一学期

课程微机原理与接口技术

课程设计名称电动玩具车控制器设计

学生姓名方名

学号0904013027

专业班级09级计本(3)班

指导教师张向东老师李新路老师

2011年12月

电动玩具车控制器设计

1、题意分析及解决方案

1.1课程设计的名称及内容

本次课程设计的名称是电动玩具车控制器设计,电动玩具车的动力来自于电机旋转,由电机旋转实现车体运动,通过电机调速可实现玩具车速度控制,玩具车转向可用电机微动力实现转向的控制,用实现STAR ES598PCI 单板开发机和接口芯片设计一个电动玩具车控制器,能实现熟读可调,并能实现左转右转,转向同时转向灯提示。

设计要求如下:设计出争取的接口电路原理图,要求绘制出电路图,并注明期间的名称和管脚。正确运用所给器件布线,搭建硬件电路。选用汇编语言编写主程序和子程序。调试并排错,包括硬件电路和软件编程部分的错误。写出完整的课程设计总结报告,并按时提交。

1.2题意需求分析

根据本设计给定的内容和要求,可以得出一些结论:本设计中需要用的主要是控制输入的芯片来带动小车的旋转电机,实现小车转向及速度的控制。其中最核心的是电机如何工作旋转控制小车的速度和转向,如果电机旋转的快那么小车的速度就快,反之则慢。而小车的转向控制需要通过两个电机共同旋转来模拟实现。假设电机1和电机2分别代表小车的左车轮和右车轮,那么只要使电机1的转速慢电机2的转速快,这样就可以实现小车向左转,同法也可以实现小车向右转。但是由于实现箱中只有一个直流的电机和一个步进电机,这两个电机是不同类的,所以我们不可以直接这样模拟。经分析我们可以有以下两种方案来模拟实现电动玩具车控制器的设计。一是使用两个电机来模拟实现,用直流电机的转动来表示小车做直线运动。初始设定小车的一个转速值为r0,将其视为一个参考点,如果我们想给小车加速只需调高转速即可,(减速也是同法只要减小转速)。而小车的转向问题,可以用步进电机的正转来表示小车向左转同时打亮小车的左转灯,用步进电机的反转来表示小车的右转同时点亮小车的右转灯。

二是只使用一个电机来模拟电动玩具车的控制器,小车直线运动的时候我们可以给电机一个固定电压,使其转速保持为固定的值设为R。我们规定电机转速加快大于R时,表示小车向右转同时小车右转灯亮;小于R时,表示小车向左转同时小车左转灯亮。这样就可以模拟实现设计要求的功能。根据实际情况分析,方案一更符合实际,我们选择方案一。

所以本设计中需要用到可编程接口芯片,用来控制步进电机的转向、直流电机速度控制信号及控制LED发光管亮灭进行输入和输出操作。经分析可知我们可以通过小键盘或逻辑开关来实现电机的速度、转向控制。在逻辑开关(或小键盘)上设计几个按键:1.直流电机加速键2.直流电动机减速键3.步进电机的正转键5.电机的反转键。其功能是实现每按一次键,直流电动机的转速按约定的速率改变,步进电机的转向按指定的方向转动。综上分析,我们可以总结出本次课程设计解决解决的几点问题:控制信号输入输出的实现。实现电机的旋转。直流电机

的加速、减速实现。步进电机的正反转。指示灯的显示。按键或逻辑开关的控制。数模转换原理。如何选择芯片。

1.3解决问题的思路及方法

在STAR ES598PCI单板开发机种,接口可以使用8255A或8279。动力通过电机旋转实现。步进电机通过8255的C口经过不同的相序实现左右转,而直接点击通过DAC0832来实现数字量到模拟的电压量转化来完成对直接点击转速的控制来模拟对小车速度的控制。

1.3.1硬件部分

在本实验中,要实现电机的控制,及相关功能的控制我们要用到小键盘或逻辑开关,而针对本实验采用逻辑开关要比较简单容易。虽然小键盘比较直观,而且是常用的输入设备,但是使用的过程比较烦,而且本实验中也不需要很多的按键就可以实现,所以我们采用逻辑开关就可以满足实验的要求,简单方便。

根据实验分析可知,我们可以用8255A芯片或8279A芯片,本实验不需要实现键盘/显示器的自动扫描,所以使用8255A即可。若使用8279A反而显复杂麻烦,而且8255A本身的接口就可以支持输入、输出的操作,8255A是可编程并行接口,具有传输速度快效率高等优点,既可以节约芯片的使用,又具有较好的性能,因此选用。小车的转向灯显示通过LED发光管实现。小车的转向及速度变化是通过电机实现的(速度直流电机、转向步进电机)。

综上分析,我们可以确定实现本次课程设计需要用到的部件有:8255A可编程并行芯片,逻辑开关,LED发光管,DAC0832数模转化芯片。8255是作为基本输入、输出接口使用的。

1.1软件部分

8255A是一种可编程并行I/O接口芯片,可由程序来改变其功能,通用性强,使用灵活,通过8255,CPU可直接与外设相连接。对8255进行初始化,将8255的工作方式,设定为方式0,即PA、PB、PC三个口都能够进行输入输出操作。PB口作为输入口,与逻辑开关相连,逻辑开关表示要输入的数值或要控制的相关状态,PA口与PC口均作为输出口,其中PC口控制步进电机,PA口输出接发光管,控制其发光。这样就可以达到我们预期的功能,成为很好的输入输出之间的桥梁,并利用星研提供的软中断来实现实验所需的延时,同时结合逻辑开关,对其功能进行相应的控制。逻辑开关的测试,控制电机的转速与转向。通过程序控制发光管的点亮与否并将其初始化。DAC0832的初始化与直流电机相接,将数字信号转化为模拟量,控制直流电机的转动。

2.硬件设计

2.1可编程并行接口芯片8255A

2.1.1 8255A的作用

作为输入/输出接口芯片,本实验中8255A主要用来控制接收逻辑开关送来的状态量,并送出输出信号点亮指示灯,同时控制步进电机的旋转。

2.1.28255A的功能分析

8255A采用40脚双列直插式封装单一+5V电源,全部输入/输出均与TTL电平兼容,为可编程通用并行接口芯片。它有24条可编程的I/O引脚,与Intel 系列微处理器完全兼容,直接的位清0或置1功能,简化了接口控制。8255A在本设计中起并行传输接口作用,负责将从逻辑开关得到的控制信号控制电机和发光管。本实验中将8255A设置工作在方式0,PB口作为输入口,与逻辑开关相连,

接收开关表示的数值和要控制的相关状态。PA口与PC口均作为输出口。

8255A是一种通用的可编程并行I/O接口芯片,又称“可编程外设接口芯片”。它是为8086/8088而设计的可以通过程序来改变其功能。本设计中8255A设置为方式0,在方式0下,CPU可以采用无条件读/写方式与8255A交换数据。如果把C口的两个部分用作控制和状态口,与外设的控制和状态相连,CPU也可以通过对C口的读/写实现A口与B口的查询方式工作。而本设计中CPU是采用无条件读/写方式与8255A交换数据的。

三个端口都可以作为输入端口或输出端口。A口有三种工作方式:即方式0、方式1和方式2,B口只能工作在方式0或方式1下,而C口通常作为联络信号使用,当然也可以作为输入/输出口使用。8255A的工作只有当片选CS效时才能进行。而控制逻辑端口实现对其他端口的控制。

图2-1 8255A的内部框图

控制字格式如下:本实验中8255A的控制字为82H

D7 D6 D5 D4 D3 D2 D1 D0

1 0 0 0 0 0 1 0

图2-2 8255A方式选择控制字

D7=1工作方式控制标志。D5D6组合设定A口工作方式:00~方式0。D4设定A口的输入/输出,D4=0输出。D3 设定C口高位输入/输出选择,D3=0输出。D2设定B口工作方式选择,D2=0方式0。D1设定B口输入/输出选择D1=1输入。D0设定C口低位输入/输出选择,D0=0输出。

表2-1 8255A技术参数表

8255A技术参数测试条件

规范值

单位大小

输入低电平电压V IL0.8 -0.5 V 输入高电平电压V IH V CC 2.0 V 输出低电平电压V OLIOL=2.5MA 0.45 V 输出低电平电压V OLIOL=1.7MA 0.45 V 输出高电平电压V OHIOR=-400MA 2.4 V 输出高电平电压V OHIOH=-200MA 2.4 V 达林顿驱动电流IOAR-4.0 -1.0 mA

表2—1的主要参数说明如下:8255A 工作最大电流为120MA,VCC=-5V~+5V ,I (DAR )工作电流最大为4MA 。8255的输出电压不高,连接到LED 时,最好加入一个驱动器起到电流放大的作用。

表2-2 8255A 基本操作及端口地址选择、分配表

2.2 DAC0832数模转换器 2.2.1 DAC0832技术参数

表2-3 DAC0832技术参数及引脚图

(1)8-bit 转换精度,转换时间1μs (2)转换输出电压范围0~5V

CS : 片选

V CC : 电源

AGND : 模拟信号地 GND : 数字信号地 DI 0~DI 7: 数据线 V REF : 参考电压输

R fb :模拟量输出反馈端

ILE : 数据允许锁

1WR :写输入锁存器信号 2WR :写输入寄存器信号

XFER : 输入寄存器数据传送控制 I OUT1,I OUT2::D/A 变换器差动电流输出端 DAC0832引脚图

2.2.2 电路工作原理图

DAC0832是采用CMOS 工艺制成的单片直流输出型8位数/模转换器。如图4-82所示,它由倒T 型R-2R 电阻网络、模拟开关、运算放大器和参考电压VREF 四大部分组成。运算放大器输出的模拟量V0为:

电源电流 ICC 120 mA 输入负载电流 IIL IIN =0~ V CC I/O mA 输出浮动电流 IOF VOR =0.45~ V CC I/O mA

图2-3 数模转换电路原理图

公式如下:

由上式可见,输出的模拟量 与输入的数字量( ) 成

正比,这就实现了从数字量到模拟量的转换。

123

VREF 8RFB 9DGND

10

IOUT111IOUT2

12

DI713DI614DI515DI416DI07CS 1WR12AGND 3DI34DI25DI16XFER 17WR218ILE 19VDD

20

D A C 0832L C N

U20

1K

W5510

R78

0.1uF

C332

3

64

7

185

LM741CN

U2310K

W6 4.7K R79-12V

VCC

D5

+12V

-12V

OUT

D0D1D2D3D4D5D6D7

12JP31

-INPUT413OUTPUT11+INPUT13GND

11V+

4+INPUT310+INPUT25-INPUT39-INPUT26OUTPUT38

OUTPUT414OUTPUT27

-INPUT12+INPUT412LM324N

U26DS23470R71-12V

WR

0.1uF

C32

CS

图2-4 DAC0832工作电路原理图

2.2.3 DAC0832的主要技术指标

转换时间,1μs ,分辨率,8位,功耗,200mV ,单一工作电源,+5~+15。

DAC0832工作方式有三种:单缓冲方式、双缓冲方式和直通方式。根据本实验的

特点分析可知采用单缓冲方式比较简单。其方法是控制输入寄存器和DAC寄存器

同时接收数据,或者只有输入寄存器而把DAC寄存器接成直通方式。

2.3逻辑开关选择

本实验用来显示小车的转向可以用发光管来表示,在实验板上JP65:发光

管控制接口,0-灯亮,1-灯灭;用JP80控制电机的转速及转向:开关控制接口:闭合---0信号,断开—1信号。

2.3.1逻辑开关在本设计中的作用

设计时用到五个逻辑开关,分别用来控制电机的转速、转向和步进电机的启动,输入0时,开关闭合,输入1时,开关断开。

2.3.2逻辑开关的功能分析

如图2-5所示,开关未合时,与5V 电压相连,输入1,当合上之后,开关就将A 口接地,也就输入为0,4位开关可以置0~15的数。

2.3.3逻辑开关的技术参数

图2-5 8路二进制开关

开关高电平:+5V、低电平:0V。二进制逻辑开关合上表示0信号,松开表示1信。

2.4步进电机

2.4.1步进电机在本设计中的作用

步进电机的正传与反转带动齿轮转动,实现车轮的转动及实现了小车的左转与右转。

2.4.2步进电机的功能分析

步进电机驱动原理是通过对每相线圈中的电流的顺序切换来使电机作步进

式旋转。切换是通过8255输出脉冲信号来实现的。所以改变各相脉冲的先后顺序,可以改变电机的旋转方向。

图2-6 步进电机与8255A的链接原理图

用8255A的PA0~3分别控制步进电机的A、B、C、D四相,“1”则该相绕组通电,“0”则不通电。步进电机的驱动原理是使各相绕组依次通电来使其作步进式旋转,通过通电顺序和切换频率来调节其转速和转向。步进电机可以四相四拍或四相八拍方式工作,即通电顺序为:A→B→C→D→A;A→AB→B→BC→C→CD →D→DA→A。按相反的顺序即可改变电机的旋转方向。本实验系统采用的是:A →AB→B→BC→C→CD→D→DA→A。相序表:08h\0ch\04h\06h\02h\03h\01h\09h (正转);01h\03h\02h\06h\04h\0ch\08h\09h(反转)。用8279控制键盘输入和LED显示。UNL2003驱动电机运转。

2.4.3步进电机的技术参数

本设计采用的是四相步进电机,用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图7是该四相反应式步进电机工作原理示意图。

图2-7 四相步进电机步进示意图

开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。

四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。

2.4直流电机

2.4.1直流电机在本设计中的作用

直流电机的转动带动车轮转动,实现小车前行。通过增大和减小直流电机的转速实现小车加速与减速。实质是调节直流电机的电压的大小来调节电机的转速。

2.4.2直流电机的功能分析

通过5个逻辑开关输入一个数字量,编码之后送至DAC0832,转换成模拟量送至直流电机,调节直流电机的转速,实现控制小车的速度。

2.4.3直流电机的技术参数

图2-8 直流电机电路原理图

如果直流电机的转子不用原动机拖动,而把它的电刷A、B接在电压为U的直流电源上(如图2所示),那么会发生什么样的情况呢?从图上可以看出,电刷A是正电位,B是负电位,在N极范围内的导体ab中的电流是从a流向b,在S极范围内的导体cd中的电流是从c流向d。前面已经说过,载流导体在磁场中要受到电磁力的作用,因此,ab和cd两导体都要受到电磁力Fde的作用。根据磁场方向和导体中的电流方向,利用电动机左手定则判断,ab边受力的方向是向左,而cd边则是向右。由于磁场是均匀的,导体中流过的又是相同的电流,所以,ab边和cd边所受电磁力的大小相等。这样,线圈上就受到了电磁力的作用而按逆时针方向转动了。当线圈转到磁极的中性面上时,线圈中的电流等于零,电磁力等于零,但是由于惯性的作用,线圈继续转动。线圈转过半州之后,虽然ab与cd的位置调换了,ab边转到S极范围内,cd边转到N极范围内,但是,由于换向片和电刷的作用,转到N极下的cd边中电流方向也变了,是从d流向c,在S极下的ab边中的电流则是从b流向a。因此,电磁力Fdc的方向仍然不变,线圈仍然受力按逆时针方向转动。可见,分别处在N、S极范围内的导体中的电流方向总是不变的,因此,线圈两个边的受力方向也不变,这样,线圈就可

以按照受力方向不停的旋转了,通过齿轮或皮带等机构的传动,便可以带动其它工作机械。

2.5硬件总逻辑图及其说明

连线说明:

表2-4 连线说明

B4区:CS(8255) A3区:CS1 B4区:PC1 E1区:B

B4区:A0、A1 ES-PCI: A0、A1 B4区:PC2 E1区:C

B4区:JP56 G6区:JP65 B4区:PC3 E1区:D

B4区:JP56 G6区:JP80 A3区:CS2 F3区:CS

B4区:PC0 E1区:A F1区:CTRL F3区:OUT(DAC0832)

图2-9 硬件原理图

3.控制程序设计

3.1控制程序设计思路说明

要实现电动玩具车的加速和减速,左转与右转以及转向灯的指示,即是通过逻辑开关控制直流电机转动的快慢,步进电机的正、反转表示小车的左右转以及LED发光管的点亮。根据所设计的硬件电路逻辑图,在编写控制程序的时候,主要是解决怎样判断逻辑开关的开关状态的控制相应的功能模块,如何通过改变直流电压来实现直流电机的加减速,从而引出另一个需解决的问题,如何在程序中实现把数字量转换为模拟量(即电压值),怎样驱动步进电机的转动及原理,LED 发光管何时点亮及发光原理。最后要知道怎样利用8255A输入输出功能实现实验的功能。

具体实现步骤如下:首先初始化8255A,使8255A工作在方式0,A口和C 口作为输入口,B口作为输入口,其初始化命令字为82H。让PA,PC口处于输出状态,PB口处于输入状态。PA工作在输出状态时控制发光二级管的亮灭,PC工

作在输出状态时,通过输出不同的量来作为步进电机的相序控制端,控制步进电机的旋转方向,而PB口处于输入状态,是作为开光的检测,判断是哪个开光被按下,以便确定执行哪项功能。而车速则是通过DAC0832来控制,因为车速是用直流电机来模拟的,直流电机转速只与电流有关,而电流又与电压有关。所以,可以通过DAC0832数模转换芯片来完成。为了观察的方便。在程序的初始化中一开始给DAC0832写入7FH这个数字量,让小车以一半的速度运行,是为了测试加减速的运行效果。而加减速的效果我是这样定义的,若是执行加速功能则通过DAC0832写入一个新的数字量,该数字量是原理数字量按10H的增率往上加的,知道FFH,而减速则是相应的是按10H的增率往下递减的知道减到0为止。这样整个设计思路就比较清晰了。按照此思路其控制流程图和控制程序如下:

3.2程序流程图

图3-1 流程图

3.1控制程序

.MODEL TINY

PCIBAR3 EQU 1CH

;8位I/O空间基地址(它就是实验仪的基地址, 也为DMA & 32 BIT RAM板卡上的8237提供基地址)

Vendor_ID EQU 10EBH

;厂商ID号

Device_ID EQU 8376

;设备ID号

.STACK 100

.DATA

IO_Bit8_BaseAddress DW ?

COUNT DB 00H

FLAG DB 00H

msg0 DB 'BIOS不支持访问PCI $' msg1 DB '找不到Star PCI9052板卡 $' msg2 DB '读8位I/O空间基地址时出错$' COM_ADD DW 00F3H

;控制口偏移量

PA_ADD DW 00F0H

;PA口偏移量

PB_ADD DW 00F1H

;PB口偏移量

PC_ADD DW 00F2H

;PC口偏移量

DA0832_ADD DW 00E0H

;DAC0832控制口偏移量

LED_DATA DB 01111111B

; 一号绿灯亮

DB 10111111B

; 二号黄灯亮

DB 11011111B

;三号灯灯亮

DB 11101111B

;四号灯亮

STEP1 db 01h,03h,02h,06h,04h,0ch,08h,09h ;步进电机正转相序

STEP2 db 09h,08h,0ch,04h,06h,02h,03h,01h ;步进电机反转相序

voltageoffset EQU 10H

voltage db 0

.CODE

start:mov ax,@data

mov ds,ax

nop

CALL INITPCI

CALL ModifyAddress

mov dx,COM_ADD

mov al,82H ;向控

制口写入方式控制字

out dx,al

Lea si,LED_DATA

mov voltage,3FH call DAC0832

mov dx,PA_ADD

mov al,0ffh

out dx,al

mov dx,PC_ADD

mov al,0

out dx,al ;步进电机

停止转动

K: MOV DX,PB_ADD

IN AL,DX

CMP AL,01H

JZ K1

CMP AL,02H

JZ K2

CMP AL,04H

JZ K3

CMP AL,08H

JZ K4

CMP AL,00H

JZ K5

K1:

speechup:mov al,voltage

cmp al,0efh

jna eee

mov al,0ffh

jmp key1

eee:add al,voltageoffset

key1: mov voltage,al

call DAC0832

L1: mov bx,si

mov dx,PA_ADD

mov al,0

xlat

out dx,al

CALL DELAY

jmp K

K2:

speechdown:

mov al,voltage

cmp al,10h

jnb ccc

mov al,00h

jmp key2

ccc:sub al,voltageoffset key2: mov voltage,al

call DAC0832

L2: mov dx,PA_ADD

mov bx,si

mov al,1

xlat

out dx,al

CALL DELAY

jmp K

K3: CMP FLAG,00H

JNZ L3

mov bx,si

mov dx,PA_ADD

mov al,2

xlat

out dx,al

L3:LEA BX,STEP1

jmp STEPA

; jmp K

K4: CMP FLAG,00H

JNZ L4

mov bx,si

mov dx,PA_ADD

mov al,3

xlat

out dx,al

L4: LEA BX,STEP2

jmp STEPB

;JMP K

K5: MOV DX,PA_ADD

MOV AL,0FFH

OUT DX,AL

MOV FLAG,00H

MOV COUNT,00H

JMP K

STEPA: MOV CX,08H

LOOP1: MOV DX,PC_ADD

MOV AL,[BX]

OUT DX,AL ;往C 端口输出脉冲

INC BX

CALL DELAY1 ;调DELAY延时子函数

LOOP LOOP1

INC COUNT

CMP COUNT,5

JZ HHH

jmp K

STEPB:MOV CX,08H

LOOP2:MOV DX,PC_ADD

MOV AL,[BX]

OUT DX,AL ;往C 端口输出脉冲

INC BX

CALL DELAY1 ;调DELAY 延时子函数

LOOP LOOP2

INC COUNT

CMP COUNT,6

JZ HHH

jmp K

HHH: MOV DX,PA_ADD

MOV AL,0FFH

OUT DX,AL

MOV COUNT,00H

NOT FLAG

JMP K

DELAY1 PROC NEAR

push ax

push dx

mov dx,01H

mov ah,0ffh

int 21h

pop dx

pop ax

RET

DELAY1 ENDP

DELAY PROC NEAR

push ax

push dx

mov dx,300H

mov ah,0ffh

int 21h

pop dx

pop ax

RET

DELAY ENDP

DELAY2 PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV CX,60000

L: NOP

LOOP L

POP DX

POP CX

POP BX

POP AX

RET

DELAY2 ENDP

DAC0832 PROC NEAR ;数模转换,数字量转化为模拟量

mov dx,DA0832_ADD

mov al,voltage

out dx,al

RET

DAC0832 ENDP

InitPCI PROC NEAR

MOV AH,00H

MOV AL,03H

INT 10H ;清屏

MOV AH,0B1H

MOV AL,01H

INT 1AH

CMP AH,0

JZ InitPCI2

LEA DX,msg0

InitPCI1: MOV AH,09H

INT 21H

JMP Exit

InitPCI2: MOV AH,0B1H

MOV AL,02H

MOV CX,Device_ID

MOV DX,Vendor_ID

MOV SI,0

INT 1AH

JNC InitPCI3

;是否存在Star PCI9052板卡

LEA DX,msg1

JMP InitPCI1

InitPCI3: MOV DI,PCIBAR3

MOV AH,0B1H

MOV AL,09H

INT 1AH

;读取该卡PCI9052基地址

JNC InitPCI4

LEA DX,msg2

JMP InitPCI1

InitPCI4: AND CX,0FFFCH

MOV

IO_Bit8_BaseAddress,CX

RET

InitPCI ENDP

ModifyAddress PROC NEAR

ADD COM_ADD,CX

ADD PA_ADD,CX

ADD PB_ADD,CX

ADD PC_ADD,CX

add DA0832_ADD,cx

add

IO_Bit8_BaseAddress,cx

RET

ModifyAddress ENDP

Exit: MOV AH,4CH

INT 21H

END START

4.上机调试过程

硬件调试

其实在本次试验中的硬件主要是8255A和DAC0832这两个芯片。8255A

调试我是用A口来判断的,通过写入一个基本的程序通过A口来驱动发光二极管,看二极管是否正常点亮。DAC0832的调试时通过观察直流电机的转速来判断的。写入不同的数字量,看直流电机的转速是否按自己的设定的变化。

软件调试

开始调试的时候,我们的程序有很多语法的错误,经过慢慢的一步步修改,将程序完善。因为有些错误也是由于自己的事物造成的。在开始得编程中对于小车的加减速,由于速度是数字量通过DAC0832数模芯片加10H或减10H转化的,而当时没有设置数字量的上下线。当数字量加到FFH以后,已经达到了最大值,再加速的话应该保持不变,而数字量减到00H以后,小车已经停止,再减速应该还是保持不动。一开始由于少了两条比较指令,导致小车减速到0后,又加速,加速到最大时又减速,使得速度不定,达不到题目要求的效果。

联机调试

联机调试比较简单,通过单步测试和断电调试,根据信息框和调节开关控制直流和步进转动的情况来判断程序存在的问题。

故在单步执行程序时,可以发现程序的错误出现在什么地方,比如:就我个人而言,在编写程序的时,很容易忽略现场保护,例如在使用AL这个寄存器,它里面已存在一个值,但是我没有保存AL的值,就又使用它,导致新的值覆盖了原来的值,当我再要用到AL的初始值时,又没有向它写入原来的值,这将会导致程序出错,得不到预期的结果。

调试结果和问题的提出

经过调试和修改后,最后的调试结果是基本的功能都能实现,就是在小车的左右转向的时候,我用的是指示灯闪烁的效果。调试结果感觉这个指示灯的闪的时间不均匀。所以我就定义了一个变量COUNT来保证发光二极管的亮、灭时间的相同,是的闪烁效果看起来正常一点。而COUNT变量就是记经过的相序数,可以自定义。我定义的是5个相序数。这也就是说明小登闪烁的周期是步进电机工作5个相序数的时间。

对于问题的提出是:小车的左右转我们很容易观察到,但是小车的加减速有时候看起来不是很明显,我想的就是还通过数码管来显示速度的变化。这样整个小车的功能效果给人以一种很直观的感觉。

5.课程设计结果及分析

本实验要求设计一个电动玩具车控制器,能实现电动玩具车的方向控制,车速控制。车在转向的时候并有指示灯提醒。这些功能都实现了,并增加了小车加速与减速的时候有指示灯。初始状态时,四个逻辑开关的都是打开的。当合上一

号开关时,直流电机加速直至稳定或者断开一号开关;关闭二号开关使直流电动机减速。在减速的过程中断开二号开关,直流电机会保持在当前的转速;同样的方法,关闭三号开关,步进电机正转,表示小车左转,同时左转指示灯会亮。断开开关,步进电机停止转动。右转与左转类似。步进电机正转与反转只是用来模拟小车的左转与右转。这个是灵活的,正转可以模拟左转也可以用来模拟右转。

问题延伸:

由于时间限制及实验器材的限制,虽然在短时间内完成了本次课程设计所要求实现的功能,但是程序并不是很完善的。程序有些循环的地方有点冗余,不过在老师的提示下,已经更正。其实本实验相对来讲还算是简单的,因为功能比较简单,实现起来不是太难。对于张老师提出来的功能的提升我觉得还是有点挑战的。就是在加减速的时候不是简单的按下哪个开关,而是通过一个来回的按动开关来手动加减速。而且只能是一来一回才能产生效果,其他的情况按动开关速度是不会变的。这就需要读3次B口的状态,比较二次才能得出结果。如果第一次读出的B口的值和第二次不一样,而第二次读出的B口的值和第三次不一样这就说明开关经过了一个来回的变化,再来在判断是哪个键拨动产生的才能执行相应的功能。这就要主要一个事情就是读三次B口状态时两两之间间隔的时间。我们大概测试了一下开关来回拨动一次的时间是300ms,所以我们读取的时间应该设置为150ms。利用星研公司提供的软中断来延时。我自己还加了8279来控制数码管的显示来实现对车速的一个直观的获取。后面附带改进后的源代码!

心得体会和建议

通过这次的实验:在硬件上,我更深入的了解了8255A芯片的功能,熟悉了它的使用方法。而且8255A也是我们这门课的一个主要的芯片,运用比较多。还有就是DAC0832的应用,如果不是这次实验可能对这个元件还不知道怎么用,通过亲身实践,更加深刻体会到其在电路设计中所起的作用。对LED显示器也有了比较深入的对其构造及功能的了解。并认识到通过互联网可以学习到很多知识;在编程方面,提高了对汇编语言的各种指令的熟悉和利用汇编语言编程的能力。也明白了面对问题,不需要过于惧怕它的难度,也不能过于轻视问题。需要的是一步步地了解问题,进而解决问题。没有解决不了的问题,也没有不去解决就能解决的问题。

其实本次的课程设计如果按照我们一开始得题目要求来说来实现,显得有点简单。但后来增加的功能我觉得还是有点味道的。尤其是手动改变车速。一开始也想到是那么回事,但是就是在写程序的时候不是这里有漏洞就是那里有漏洞。问题的关键就是在两次比较上,我后来定义了一个COUNT量来记录比较的次数,当比较的两个有相同时则将这个COUNT量清零。重新检测在比较。否则每比较一次COUNT加一。当COUNT加到2时说明有来回拨动键的产生符合手动加减速的要求。则执行相应的功能。

总的来说,虽然课程设计的时间有限,但在这有限的时间里,不仅完成了作业,提交了结果,也丰富了这门硬件课程的更多知识,更深入地了解了这门专业课的精髓,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析

问题解决问题的能力得到全面提高。

下面附带增加功能后的程序设计原代码:

.MODEL TINY

PCIBAR3 EQU 1CH

;8位I/O空间基地址(它就是实验仪的基地址, 也为DMA & 32 BIT RAM板卡上的8237提供基地址)

Vendor_ID EQU 10EBH

;厂商ID号

Device_ID EQU 8376

;设备ID号

.STACK 100

.DATA

IO_Bit8_BaseAddress DW ? COUNT DB 00H COUNT1 DB 00H FLAG DB 00H FLAG1 DB 00H

msg0 DB 'BIOS不支持访问PCI $'

msg1 DB '找不到Star PCI9052板卡 $'

msg2 DB '读8位I/O空间基地址时出错$'

LED_TAB DB

0C0H,0F9H,0A4H,0B0H,99H,92H,82H, 0F8H

DB

080H,90H,88H,83H,0C6H,0A1H,86H,8 EH

CMD_8279 DW 00B1H ;8279命令字、状态字地址

DATA_8279 DW 00B0H ;8279读写数据口的地址

COM_ADD DW 00F3H

;控制口偏移量

PA_ADD DW 00F0H

;PA口偏移量

PB_ADD DW 00F1H

;PB口偏移量

PC_ADD DW 00F2H

;PC口偏移量

DA0832_ADD DW 00E0H

;DAC0832控制口偏移量

LED_DATA DB 01111111B ; 一号绿灯亮

DB 10111111B

; 二号黄灯亮

DB 11011111B

;三号灯灯亮

DB 11101111B

;四号灯亮

STEP1 db 09h,08h,0ch,04h,06h,02h,03h,01h

;步进电机正转相序

STEP2 db 01h,03h,02h,06h,04h,0ch,08h,09h

;步进电机反转相序

voltageoffset EQU 10H

voltage db 0

SPEED DB 00

BUFFER1 db 00H

;BUFFER2 DB ?

.CODE

start:mov ax,@data

mov ds,ax

nop

CALL INITPCI

CALL ModifyAddress

mov dx,COM_ADD

mov al,82H ;向控制口

写入方式控制字

out dx,al

Lea si,LED_DATA

mov voltage,00H

call DAC0832

call INIT8279

mov dx,PA_ADD

mov al,0ffh

out dx,al

mov dx,PC_ADD

mov al,0

out dx,al ;步进电机停止转

K: CALL CHANGE

CALL KEYSCAN

CMP FLAG1,01H

JZ K1

CMP FLAG1,02H

JZ K2

CMP AL,04H

JZ K3

CMP AL,08H

JZ K4

CMP AL,00H

CALL INIT

JMP K

K1:

speechup:

mov al,voltage

cmp al,0efh

jna eee

mov al,0ffh

jmp key1

eee:add al,voltageoffset ADD SPEED,02H

key1: mov voltage,al

call DAC0832

L1: mov bx,si

mov dx,PA_ADD

mov al,0

xlat

out dx,al

CALL DELAY

jmp K

K2:

speechdown:

mov al,voltage

cmp al,10h

jnb ccc

mov al,00h

jmp key2

ccc:sub al,voltageoffset SUB SPEED,02H

key2: mov voltage,al

call DAC0832

L2: mov dx,PA_ADD

mov bx,si

mov al,1

xlat

out dx,al

CALL DELAY

jmp K

K3: CMP FLAG,00H

JNZ L3

mov bx,si

mov dx,PA_ADD

mov al,2

xlat

out dx,al

L3:LEA BX,STEP1

jmp STEPA

K4: CMP FLAG,00H

JNZ L4

mov bx,si

mov dx,PA_ADD

mov al,3

xlat

out dx,al

L4: LEA BX,STEP2

jmp STEPB

;JMP K

INIT PROC NEAR

MOV DX,PA_ADD

MOV AL,0FFH

OUT DX,AL

MOV FLAG,00H

MOV COUNT,00H

RET

INIT ENDP

STEPA: MOV CX,08H

LOOP1: MOV DX,PC_ADD

MOV AL,[BX]

OUT DX,AL ;往C端口输出脉冲

INC BX

CALL DELAY1 ;调DELAY 延时子函数

LOOP LOOP1

INC COUNT

CMP COUNT,5

JZ HHH

jmp K

STEPB:MOV CX,08H

LOOP2:MOV DX,PC_ADD

MOV AL,[BX]

OUT DX,AL ;往C端口输出脉冲

INC BX

CALL DELAY1 ;调DELAY延时子函数

LOOP LOOP2

INC COUNT

CMP COUNT,6

JZ HHH

jmp K

HHH: MOV DX,PA_ADD

MOV AL,0FFH

OUT DX,AL

MOV COUNT,00H

NOT FLAG

JMP K

KEYSCAN PROC NEAR

MOV DX,PB_ADD

IN AL,DX

CMP AL,BUFFER1

JZ BB

INC COUNT1

CMP COUNT1,02H

JZ B

mov BUFFER1,al

CALL DELAY3

MOV DX,PB_ADD

IN AL,DX

; MOV BUFFER1,AL

CMP AL,BUFFER1

JZ BB

;MOV AL,BUFFER1

INC COUNT1

CMP COUNT1,02H

JZ B

MOV AL,BUFFER1

CALL DELAY3

MOV DX,PB_ADD

IN AL,DX

CMP AL,BUFFER1

JZ BB

INC COUNT1 CMP COUNT1,02H

JZ B

; MOV FLAG1,01H

JMP B

BB: MOV FLAG1,00H

MOV COUNT1,00H

JMP BBB

B: OR AL,BUFFER1

CMP AL,01H

JZ BBBB

MOV FLAG1,02H

JMP BBB

BBBB:MOV FLAG1,01H BBB :RET

KEYSCAN ENDP

DELAY1 PROC NEAR

push ax

push dx

mov dx,01H

mov ah,0ffh

int 21h

pop dx

pop ax

RET

DELAY1 ENDP

DELAY PROC NEAR

push ax

push dx

mov dx,250H

mov ah,0ffh

int 21h

pop dx

pop ax

RET

DELAY ENDP

DELAY3 PROC NEAR

push ax

push dx

mov dx,150H

mov ah,0ffh

int 21h

pop dx

pop ax

RET

相关文档
最新文档