首页 > 精品范文库 > 11号文库
微机硬件课设(红绿灯)(推荐五篇)
编辑:紫竹清香 识别码:20-340576 11号文库 发布时间: 2023-04-07 09:31:39 来源:网络

第一篇:微机硬件课设(红绿灯)

微机原理实验课程设计

硬件部分

东华大学信息学院

2013.1

一. 基础实验部分

实验1存储器读写实验

一、实验目的

1.掌握PC机外存扩展的方法。2.熟悉6264芯片的接口方法。

3.掌握8086十六位数据存储的方法。

二、实验设备

微机实验箱、8086CPU模块。

三、实验内容

向02000~020FFH单元的偶地址送入AAH,奇地址送入55H。

四、实验原理介绍

本实验用到存储器电路

五、实验步骤和要求

1、实验接线:本实验无需接线。

2、编写调试程序

3、运行实验程序,可采取单步、设置断点方式,打开内存窗口可看到内存区的变化。本实验的主要目的是学会用使用工具软件,掌握用单步执行和断点方式运行程序,观察寄存器和内存中的数据变化等程序调试的手段。

六、实验提示

七、实验范例程序框图及源代码(实验程序名:RAM.ASM)

八、思考题

1、单步执行到“intram”标号的语句时,ds寄存器的数据是什么?采用断点方式运行时执行到第一个断点处,2000H~202FH内存单元的数据是什么?执行到第二个断点处,2000H~200FH内存单元的数据是什么?并根据观察结果和对源程序的判读简述源程序的运行效果。

答:单步执行到“intram”标号的语句时,ds寄存器的数据都为00。

断点方式运行时执行到第一个断点处时,2000H~202FH内存单元的数据都为00。

到第二个断点处,2000H~200FH内存单元偶地址都为AA,奇地址都为00。

2、修改程序,实现从2000H到200FH单元依次赋值00H~0FH的功能。答:只需改变intram 和 fil中相关的程序: 需改动的原程序:

intram: mov [si],al

incsi loopintram mov si,1000h;设置断点处 mov cx,100h mov ax,55aah fil:

mov [si],ax;RAM区循环置数 incsi

改为:

intram: mov [si],al incsi loopintram mov si,1000h;设置断点处

mov cx,100h mov ax,0100h fil:

mov [si],ax incsi addax,0202h incsi loopfil

;RAM区循环置数

实验2简单I/O口扩展实验

一、实验目的

1、熟悉74LS273,74LS244的应用接口方法。

2、掌握用锁存器、三态门扩展简单并行输入、输出口的方法。

二、实验设备

微机实验箱、8086CPU模块。

三、实验内容

逻辑电平开关的状态输入74LS244,然后通过74LS273锁存输出,利用LED显示电路作为输出的状态显示。

四、实验原理介绍

本实验用到两部分电路:开关量输入输出电路,简单I/O口扩展电路。

五、实验步骤

1、实验接线:(表示相互连接)CS0 CS244; CS1CS273;平推开关的输出K1~K8  IN0~IN7(对应连接); O0~O7LED1~LED8。

2、编辑程序,单步运行,调试程序

3、调试通过后,全速运行程序,观看实验结果。

4、编写实验报告。

六、实验提示

七、实验结果

程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如:K2置于L位置,则对应的LED2应该点亮。

八、实验范例程序框图(实验程序名: T244273.ASM)

九、程序源代码清单

十、思考题:

将74LS244的片选信号CS244改接CS2,将74LS273的片选信号CS273改接CS3,修改程序实现与范例程序相同的功能。

答:只需改变程序中start相应的输入输出口地址。需改动的原程序:

start:

mov dx,04a0h

inal,dx mov dx,04b0h outdx,al 改为:

start:

mov dx,04c0h

inal,dx mov dx,04d0h outdx,al

实验3 8255并行口实验

一、实验目的

掌握8255A的编程原理。

二、实验设备

微机实验箱、8086CPU模块。

三、实验内容

8255A的A口作为输入口,与逻辑电平开关相连。8255A的B口作为输出口,与发光二极管相连。编写程序,使得逻辑电平开关的变化在发光二极管上显示出来。

四、实验原理介绍

本实验用到两部分电路:开关量输入输出电路和8255可编程并口电路。

五、实验步骤

1、实验接线

CS0CS8255; PA0~PA7平推开关的输出K1~K8; PB0~PB7发光二极管的输入LED1~LED8。

2、编程并全速或单步运行。

3、全速运行时拨动开关,观察发光二极管的变化。当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。

六、实验提示

七、实验结果

程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如: K2置于L位置,则对应的LED2应该点亮。

八、实验范例程序框图及源代码(实验程序名:t8255.asm)

九、思考题:

1、修改接线CS2CS8255,并要求开关置“H”(下)位置时对应LED亮,修改程序实现相应功能。

答:改变相应的输入输出口地址,并将读入ax的值取反。

需改动的原程序: start:

mov dx,04a6h

mov ax,90h

out dx,ax

start1:

mov dx,04a0h

in ax,dx

mov dx,04a2h

out dx,ax

jmp start1 改动后: start:

mov dx,04c6h

mov ax,90h

out dx,ax

start1:

mov dx,04c0h

in ax,dx

mov dx,04c2h not

ax

out dx,ax

jmp start1

实验4 8253定时器/计数器接口实验

一、实验目的

掌握8253定时器的编程原理,用示波器观察不同模式下的输出波形。

二、实验设备

微机实验箱、8086CPU模块、示波器。

三、实验内容

了解8253计数器的不同工作方式,掌握其初始化控制字对定时/记数效果的影响。

四、实验原理介绍

本实验用到两部分电路:脉冲产生电路、8253定时器/计数器电路

五、实验步骤

1、实验连线:

CS0CS8253OUT08253CLK2 OUT2LED1 OUT1LED2 CLK38253CLK0,CLK38253CLK1

2、编程调试程序

3、全速运行,观察实验结果

六、实验提示

七、实验结果

程序全速运行后,LED1按一定周期闪烁(周期理论值为0.2s),LED2在高频脉冲信号(约15KHz)影响下,有微弱的光亮,但无明显的周期变化现象。

八、实验范例程序框图及源代码(实验程序名:t8253.asm)

九、思考题:

1、为什么说范例程序运行时LED1闪烁周期的理论值是0.2秒?在范例程序设置LED2的最大闪烁周期是多少?请分析说明。

答:因为T2采用OUT0的输出为时钟,且T2中设置初值为04h,则OUT2输出方波周期为4*0.05s=0.2s 因为OUT1LED2,则LED2的周期即为计数器T1的周期,且T1的计数初值由程序知为32h=50d,所以最大周期为50*4/3*10^6=6.67x10^-5s。

2、修改片选信号接线使CS1和CS8253连接,并要求LED1的闪烁周期变为4秒(亮2秒,灭2秒),修改程序实现功能。答:因为4/0.05=80d=50h,所以只需改变相应的计数值和片选接口地址。

需改动的原程序: mov ax,0b6h

out dx,ax mov dx,04a4h mov ax,04h out dx,ax mov ax,0 out dx,ax 改动后:

mov ax,0b6h

out dx,ax mov dx,04b4h mov ax,50h out dx,ax mov ax,0 out dx,ax 其余列出的程序段都只要将片选接口地址中的a改为b即可。

实验5 8259中断控制器实验

一、实验目的

1、掌握8259A的工作原理。

2、掌握编写中断服务程序方法。

3、掌握初始化中断向量的方法。

二、实验设备

微机实验箱、8086CPU模块。

三、实验内容

了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。

四、实验原理介绍

本实验用到三部分电路:电平开关电路、简单I/O口扩展电路和8259中断控制器电路。

五、实验步骤

1、实验接线

CS0CS8259

CS3 CS273 O0~O3LED1~LED4

K1~K4IR0~IR3 INTINT(8086CPU板)INTAINTA(8086CPU板)CS0CS8253OUT08253CLK2 OUT2LED1 OUT1LED2 CLK38253CLK0,CLK38253CLK1

2、编译调试程序

3、全速运行程序,拨动某一电平开关,观察LED的亮灭情况。

六、实验提示

七、实验结果

全速运行程序,由上往下拨动开关时,相应位置的LED点亮,其余LED全灭。

八、实验范例程序框图及源代码(实验程序名:t8259.asm)

九、思考题:

1、说明源代码8259初始化所设置的所有中断控制字的值和含义(按位说明)。

答:ICW1为初始化字,13h即00010011b,对应于边沿触发,间距为8,单片8259A,需要ICW4。

ICW2为中断类型码字,80h即10000000b,对应于IR0~IR7的中断类型码为80h~87h。

ICW3为中断结束方式字,01h即00000001b,对应于普通全嵌套方式,非缓冲方式,正常EOI,8086/8088模式。

OCW1为屏蔽控制字,00h即00000000b,对应于8为全部复位屏蔽。

2、修改接线IR3P+(实验箱右下角),并修改源程序,使按实验箱右下角“Pules”键时LED1~LED4全亮。

答:改变程序最后IR2的中断服务程序的设定值,即由0fbh改为0f0h.二、综合设计实验部分

一、设计要求

参考基础实验的实验1~实验5所使用的硬件和范例程序,设计一个简单的红绿灯控制系统,用LED1~LED4表示两组红绿灯,每组红灯、绿灯各1只。要求实现以下功能:

(1)红绿灯的定时切换(每10秒切换一次)

(2)设置灯光测试开关K1,当K1打开(高电平)时,LED1~LED4全亮,关闭后恢复正常。

二、实验设备

微机实验箱、8086CPU模块。

三、实验内容

了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。

四、实验原理介绍

本实验用到五部分电路:电平开关电路、简单I/O口扩展电路和8259中断控制器电路,脉冲产生电路、8253定时器/计数器电路

五、实验步骤

1、实验接线

CS0CS8259CS0CS8253 CS0CS273 O0LED101LED2 02LED403LED3 INTINT(8086CPU板)INTAINTA(8086CPU板)OUT08253CLK2 OUT2IR0 OUT1k1 IR1k1CLK38253CLK0,CLK38253CLK1

2、编译调试程序

3、全速运行程序,观察结果。

六、实验提示

(1)定时功能可利用8253实现,利用定时器输出作为中断申请,利用中断处理切换LED的显示;LED状态可用内存保存或用I/O口读取。

(2)测试功能运行可在主循环中通过I/O口读取开关状态后判定,或利用中断处理方式运行。

七、实验结果

全速运行程序,LED1和LED3为一组,LED12和LED4为一组,两组灯每亮10秒切换一次,拨动k1开关,观察是否出现LED1~LED4全亮,关闭后恢复正常。

八、程序框图及源代码

ASSUME

CS:CODE CODE SEGMENT

PUBLIC

ORG

100H START:

MOV

CX,0

MOV

BX,0FAH START1:

CLI

MOV

DX,04A0H

MOV

AX,13H

OUT

DX,AX

;ICW1, ICW4 NEEDED

MOV

DX,04A2H

MOV

AX,80H

OUT

DX,AX

;ICW2 中断类型80h

MOV

AX,01H

;01

OUT

DX,AX

;ICW4

MOV

AX,00H

OUT

DX,AX

;OCW1, 开放所有中断

NOP

;以上为8259初始化

MOV

AX,0

MOV

DS,AX

MOV

DI,200H

;初始化中断向量表

MOV

AX,OFFSETINT0

MOV

DS:[DI],AX

ADD

DI,2

MOV

DS:[DI],100H

ADD

DI,2

MOV

AX,OFFSET INT1

MOV

DS:[DI],AX

ADD

DI,2

MOV

DS:[DI],100H

ADD

DI,2

MOV

AX,OFFSET INT2

MOV

DS:[DI],AX

ADD

DI,2

MOV

DS:[DI],100H

ADD

DI,2

MOV

AX,OFFSETINT3

MOV

DS:[DI],AX

ADD

DI,2

;上述程序为芯片8259的初始化程序

MOV

DS:[DI],100H

;建议不熟练者不要修改。

MOV

DX,04A6H

;控制寄存器

MOV

AX,36H

;计数器0,方式3

OUT

DX,AX

MOV

DX,04A0H

MOV

AX,7CH

OUT

DX,AX

MOV

AX,92H

OUT

DX,AX

;计数值927Ch

MOV

DX,04A6H

MOV

AX,0B6H

;计数器2,方式3

OUT

DX,AX

MOV

DX,04A4H

MAIN:

WAITING:

DELAY:

INT0:

NOT

INT1:

MOV

INT2:

INT3:

NOP

MOV

CODE

MOV

AX,90H

OUT

DX,AX

MOV

AX,01H

;计数初值0190h

OUT

DX,AX

MOV

AX,0H

STI

;开中断。

CMP

AX,0H

JE

WAITING

;没发生中断,则等待

NOP

NOP

MOV

DX,04A0H

OUT

DX,AX

;对应LED灯亮

MOV

CX,0

LOOP

DELAY

;数字滤波,按键去抖

JMP

START1

CLI

;关中断。以下类推。

NOP

;此两行为IR0的中断服务程序 BX

;输出取反

MOV

AX,BX

;用户可修改。

IRET

;中断返回,以下类推。

CLI

NOP

;此两行为IR1的中断服务程序,AX,0F0H

;用户可修改。

IRET

CLI

NOP

;此两行为IR2的中断服务程序,MOV

AX,0F5H

;用户可修改。

IRET

CLI

;此两行为IR3的中断服务程序,AX,0F7H

;用户可修改。

IRET

ENDS

END

START

九.运行结果调试问题及解决方法

1.对于亮10秒钟的时间设定问题,一开始是算好初值为190h,直接将其赋给AX而忽略了其高位低位的情况,导致验证结果时总是只有3秒左右,发现后改为先低位后高位复制即达到设定要求:

MOV

AX,90H OUT

DX,AX

MOV

AX,01H

;计数初值0190h

OUT

DX,AX

2.对于拨动k1开关后LED1~LED4全亮的情况,一开始实验结果总是四个灯都亮但都只保持10秒的设定时间,之后又恢复到两组灯每亮10秒切换一次的情况。当将开关量k1改为脉冲输入的时候发现每一次脉冲信号也可以产生相同的实验结果,由此想到所设计的程序运行周期的情况,一次中断的产生与有效作用的时间只在这一总线周期内,因此可以在原有中断的基础上再人为的加上周期小于总线周期的脉冲有效信号,使其在k1为高电平时期不断地执行中断程序,因此可在k1有效时使LED1~LED4一直保持全亮,而k1低电平后又恢复原状态,具体操作为将脉冲输出out1也接到k1上

第二篇:微机原理课设

目录

一.课程设计的实验目的与要求……………………………2 1.教学目的……………………………2 2.教学要求……………………………2 3.主要技术指标……………………………2 二.课程设计课题的分析……………………………2 三.课程设计的结果……………………………4 1.实验代码……………………………4 2.实验现象……………………………10 四.心得体会 ……………………………12 五.参考文献 ……………………………12

一、课程设计的目的与要求 1.教学目的

本课程的课程设计是自动化专业学生学习完《微机原理及应用》课程后,进行的一次以汇编语言为主,硬件设计为辅的综合训练。本课程设计的其目的在于加深对微机原理基本知识的理解,掌握汇编语言程序设计的基本方法;掌握运用微机原理开发系统的基本方法。2.教学要求

从课程设计的目的出发,通过设计工作的各个环节,达到以下要求: 1)掌握汇编语言程序设计的基本方法。

2)进一步理解各种接口电路的应用。例如8255并行接口,8253定时器等。3)掌握利用PC机扬声器发出不同频率声音的方法。3.主要技术指标

1)在程序运行时使PC即成为一架可弹奏的电子琴。当按下数字键1-8时,依次发出1,2,3,4,5,6,7,I这八个音调。2)在程序运行时使PC自动按要求提示演奏乐曲。

二、课程设计课题的分析

图1.扬声器工作原理图示

图2.主程序工作流程图

图3.乐曲演奏子程序工作流程图 图4.电子琴子程序工作流程图

图5.扬声器工作流程图

三、课程设计的结果

1、实验代码

DATA

SEGMENT INFO1

DB 0AH, 0DH, 'WELCOME YOU TO COME HERE!$'

DB 0AH, 0DH, 'THIS IS A MUSIC PROGRAM!$' DB 0AH, 0DH, 'PLEASE SELECLT!$' INFO4

DB 0AH, 0DH, 'INPUT ERROR!$' INFO5

DB 0AH, 0DH, 'PLEASE INPUT AGAIN!$' MUSLIST

DB 0AH, 0DH, '========================='

DB 0AH, 0DH, 'Press1

HuanLeSong' DB 0AH, 0DH, 'Press2

KaiXin' DB 0AH, 0DH, 'Press3

XiaoBuWuQu' DB 0AH, 0DH, 'Press4

Wonderful' DB 0AH, 0DH, 'Press5

SCALE PLAY ' DB 0AH, 0DH, 'Press6

EXIT' DB 0AH, 0DH, '=========================' DB 0AH, 0DH, '$' MUS_FRQ1

DW 330, 330, 350, 393, 393, 350, 330, 294

DW 262, 262, 294, 330, 330, 294, 294 DW 330, 330, 350, 393, 393, 350, 330, 294

DW 262, 262, 294, 330, 294, 262, 262 DW 294, 294, 330, 262, 294, 330, 350, 330, 262 DW 294, 330, 350, 330, 262, 262, 294, 393 DW 330, 330, 350, 393, 393, 350, 330, 294 DW 262, 262, 294, 330, 294, 262, 262,-1 MUS_TIM1

DW 8 DUP(100)

DW 7 DUP(100),200 DW 8 DUP(100)DW 7 DUP(100),200 DW 5 DUP(100),50,50,2 DUP(100)DW 100,50,50,4 DUP(100),200 DW 8 DUP(100)DW 7 DUP(100),200 MUS_FRQ2

DW 330, 294, 262, 294, 3 DUP(330)DW 3 DUP(294), 330, 392, 392 DW 330, 294, 262, 294, 4 DUP(330)DW 294, 294, 330, 294, 262,-1 MUS_TIM2

DW 6 DUP(100),200 DW 2 DUP(100,100,200)DW 8 DUP(100)DW 4 DUP(100),400 MUS_FRQ3

DW 392, 262, 294, 330, 350, 392, 262, 262 DW 440, 350, 392, 440, 494, 524, 262, 262 DW 350, 392, 350, 330, 294, 330

DW 350, 330, 294, 262, 294, 330, 294, 262, 247, 262,-1 MUS_TIM3

DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200, 200, 200 DW 200, 4 DUP(100), 200 DW 4 DUP(100), 200, 4 DUP(100), 400 MUS_FRQ4

DW 330, 392, 330, 294, 330, 392, 330, 394, 330 DW 330, 392, 330, 294, 262, 294, 330, 392, 294

DW 262, 262, 220, 196, 196, 220, 262, 294, 330, 262,-1 MUS_TIM4

DW 3 DUP(200), 100, 100, 200, 100, 100, 400 DW 2 DUP(200,200,100,100), 400 DW 3 DUP(200,100,100), 400 TABLE

DW 262, 294, 330, 349, 392, 440, 494, 525

NUMB

DB 0AH, 0DH, 'Keyboard number 1~8 keys play notes of the scale'

DB 0AH, 0DH, 'Enter or Ctrl+C to exit' DB 0AH, 0DH, '$' DATA

ENDS STACK

SEGMENT

PARA STACK 'STACK'

STA

DB 200 DUP('STACK')

STACK

ENDS CODE

SEGMENT ASSUME DS: DATA, SS: STACK, CS: CODE, ES: DATA START:

MOV AX, DATA

MOV DS, AX MOV ES, AX MOV AX, STACK

MOV SS, AX SHOW

MACRO B MOV DX, OFFSET B

MOV AH, 09H

INT 21H ENDM SHOW INFO1 LOP:

SHOW MUSLIST MOV AH, 01H

INT

21H

CMP AL, 36H

JZ

RETU

CMP AL, 31H

JNZ

B0 CALL MUSIC1

JMP

EXIT1 B0:

CMP

AL, 32H

JNZ

C0 CALL MUSIC2

JMP

EXIT1 C0:

CMP

AL, 33H

JNZ

D0 CALL MUSIC3

JMP

EXIT1 D0:

CMP

AL, 34H

JNZ

E0 CALL MUSIC4

JMP

EXIT1 E0:

CMP

AL, 35H

JNZ

EXIT SHOW NUMB CALL MUSIC5 EXIT1:

SHOW INFO5

JMP

LOP EXIT:

SHOW INFO4 SHOW INFO5

JMP

LOP RETU:

MOV AX, 4C00H

INT

21H MUSIC1

PROC

LEA

SI, MUS_FRQ1

LEA

BP,DS: MUS_TIM1 FREQ1:

MOV DI, [SI] CMP DI,-1

JE

END_MUS1 MOV BX, DS: [BP] CALL GENSOUND

ADD

SI,2

ADD

BP,2 JMP FREQ1

END_MUS1:RET MUSIC1

ENDP MUSIC2

PROC

LEA

SI, MUS_FRQ2

LEA

BP,DS: MUS_TIM2 FREQ2:

MOV DI, [SI] CMP DI,-1

JE

END_MUS2 MOV BX, DS: [BP] CALL GENSOUND

ADD

SI,2

ADD

BP,2

JMP FREQ2

END_MUS2:RET MUSIC2

ENDP MUSIC3

PROC

LEA

SI, MUS_FRQ3

LEA

BP,DS: MUS_TIM3 FREQ3:

MOV DI, [SI] CMP DI,-1

JE

END_MUS3 MOV BX, DS: [BP] CALL GENSOUND

ADD

SI,2

ADD

BP,2 JMP FREQ3

END_MUS3:RET MUSIC3

ENDP MUSIC4

PROC

LEA

SI, MUS_FRQ4

LEA

BP,DS: MUS_TIM4 FREQ4:

MOV DI, [SI] CMP DI,-1

JE

END_MUS4 MOV BX, DS: [BP] CALL GENSOUND

ADD

SI,2

ADD

BP,2 JMP FREQ4

END_MUS4:RET MUSIC4

ENDP MUSIC5

PROC NEAR PUSH AX PUSH BX PUSH CX LOP5:

MOV AH, 01H

INT

21H

CMP AL, 0DH

JE

EXIT5

CMP AL, 31H

JB

LOP5

CMP AL, 38H

JA

LOP5

AND AX, 0FH

SHL

AX, 1

SUB

AX, 2

MOV SI, AX MOV BX, OFFSET TABLE MOV DI, [BX][SI]

MOV BX, 100

CALL

GENSOUND

JMP LOP5 EXIT5:

POP CX POP BX POP AX

RET MUSIC5

ENDP GENSOUND

PROC

PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AL, 0B6H

OUT

43H, AL

MOV

DX, 12H

MOV AX, 533H*896 DIV DI OUT 42H, AL

MOV AL, AH OUT 42H, AL

IN AL, 61H

MOV AH, AL OR AL, 3

OUT 61H, AL

PUSH AX

WAIT1:

MOV CX, 1200

DELA1:

IN AL, 61H

AND AL, 10H CMP AL, AH JE DELA1 MOV AH,AL LOOP DELA1 DEC BX JNZ WAIT1 POP AX MOV AL, AH OUT 61H, AL

POP DI POP DX POP CX

POP

BX POP AX

RET GENSOUND ENDP CODE

ENDS END

START

2、实验现象

1.进入DOS后在DOS界面进行汇编链接并生成可执行文件.exe 2.双击可执行文件DZQ.exe进入操作界面如图所示

操作界面初始界面

3.在进行操作的时候只要在键盘上按1-4这数字键就可以听取歌曲1-4,按数字键5时进入电子琴界面,这时候1-8分别表示音乐CDEFGABC这几个音符。按回车后退出电子琴操作界面,这时候按6退出程序。

按数字键5后进入电子琴界面

四、心得体会

这次课程设计给我的感觉是:与其说这次课设是一个任务,不如说是期末对微机原理的一次系统的复习。通过课设,我弄清楚了课本上一些比较晦涩但是又非常重要的章节的内容,例如:键盘和显示器DOS功能调用,数据定义伪指令的使用,子程序的嵌套,8253芯片的初始化等等。

刚拿到课设题目时可以说是毫无思绪,但是通过查阅资料,模仿别人的程序,不断理解,拼凑,改进,终于按照课设要求完成任务。刚开始上机运行程序出现的问题不可谓不多,但是通过汇编的错误提示,我很容易的发现了问题并改正了它,如果不是上机运行,而是一味的盯着程序检查,那样的话真可谓无从下手,事倍功半。这个告诉我有时候动动手实践,远比啃书学习知识的效率要高得多。

五、参考文献

[1] 王忠民.微型计算机原理(第二版).西安:西安电子科技大学出版社,2007年

[2] 马春燕.微机原理与接口技术实验与学习辅导.北京:电子工业出版社.2007年

第三篇:微机原理课设

微机应用系统设计与综合专业班级学生姓名学生学号指导老师实验课程设计

——信号发生器功能程序设计

第一章

设计课题概述

本学期开设的《微型计算机原理与接口技术》理论课程是一门专业基础课程,1.1 课程设计目的

它的主要内容包括微型计算机体系结构、8086 微处理器和指令系统、汇编语言设计以及微型计算机各个组成部分介绍等内容。要求学生对微机原理中的基本概念有较深入的了解,能够系统地掌握微型计算机的结构、8086 微处理器和指令系统、汇编语言程序设计方法、微机系统的接口电路设计及编程方法等,并具有综合运用所学知识分析问题和解决问题的能力。

《微机应用系统设计与综合实验(实践)》课程设计,让学生对微机系统有一个较全面的理解,掌握常规的芯片使用方法、掌握简单的微型计算机应用系统软硬件的设计方法,对典型数字接口电路的应用技术有一个较深入的掌握,并对应用系统进行硬件原理和软件编程进行分析、设计和调试,达到基本掌握简单微型计算机应用系统软硬件的设计方法,提高项目开发能力的目的。课程中要求学生根据课程设计指导书来选择课题,并且独立完成课题,写出课程设计说明书,画出电路原理图,说明工作原理,画出电路板图,编写程序以及程序流程图。

针对《信号发生器功能程序设计》这一课题,主要涉及到硬件的连接(主要用到芯片有:8086CPU,DAC0832,8255,74LS273,74LS138,运放等)以及数码管,键盘矩阵硬件,示波器等连接原理图,程序的编写(主要涉及到显示波形,数码管显示以及通过小键盘来对波形进行选择控制)以及各个子程序或程序段的程序流程等,通过课程设计不仅可以锻炼学生在微机应用方面的实际工作能力,将所学转化为所用,更是一个锻炼解决实际问题能力的很好机会。

1.2 课程设计要求

(1)、分别用C语言和汇编语言编程完成硬件接口功能设计;(2)、硬件电路基于80x86微机的接口电路;

(3)、程序功能要求:小键盘给定、数码管(屏幕)显示,并产生对应信号波形(D/A)输出(信号波形包括正弦波、三角波、方波、锯齿波)、输出信号波形幅度、频率可调。(注意:按键数量应尽量少)。

 实现技术指标

(1)、完全用小键盘控制各波形间的切换和频率和幅值的调节以及退出。(2)、实现正弦波、三角波、方波和锯齿波信号的产生。(3)、数码管同步显示当前工作波形的频率和幅值。(4)、实现频率的1到5倍可调。(5)、实现幅值的1到5倍可调。

 使用说明

(1)、小键盘第一列对应0-3,第二列对应4—7。

(2)、开始选择0—3分别对应方波,三角波,锯齿波,正弦波。同时数码管会显示当前波形的幅值和频率。

(3)、有波形产生以后,再调节幅值和频率。0对应增大频率,1对应减小频率,2对应减小幅值,3对应增大幅值。

(4)、频率和幅值可以实现1到5倍可调,同时数码管会显示当前波形的幅值和频率的倍数(1~5)。

(5)、任何时候4都对应退出,回到最开始的选择波形状态,数码管归零。

第二章 设计思想和实施方案

2.1功能分析

2.1.1波形产生

由于要由数字信号转换为模拟信号来产生波形,因此要由D/A转换芯片DAC0832来完成此项任务。通过汇编语言编写各个波形子程序,由于要显示波形,所以每输出一个值,都要进行一定时间的延时,扫描没有按键按下后再输出下一个值,直到形成一个周期的代码。利用循环,就可产生连续波形代码,再通过8255输出给DAC0832,将数字量转换成模拟量输出,即可得各种波形。具体方案在后面有分析。

2.1.2波形切换

波形的选择和调节由小键盘控制。第一列从上到下编码为0,1,2,3,分别对应方波、三角波、锯齿波、正弦波。第二列第一个键的键值为4,对应退出波形,可以重新选择波形,实现波形切换。当没有输出波形的时候,也就是输出为零,选择0到3就会进入相应的波形子程序。进入波形子程序以后,每一个点输出之前都会调用扫描子程序,判断是否有键按下,有则跳转到相应的程序断去执行,无则继续。由于小键盘扫描在程序总是存在的,因此可随时进行波形间的切换。

2.1.3 数码管显示

数码管同步显示当前波形的幅值和频率。硬件上由8086将数据输出给8255,8255再将输出送给数码管的A~Dp,显示相应字符。软件上定义一个缓冲区存放波形的幅值和频率,显示数码管时,利用缓冲区的数值查找数码管键值表再输出对应数值。循环输出波形时也循环输出缓冲区内容对应的值,就可以同步显示波形的幅值和频率。利用小键盘扫描得到的键值进行判断,对缓冲区内的幅值频率进行相应的改变,使数码管能显示不同的幅值和频率。

2.1.4小键盘控制

使用实验箱上4×4键盘,可以实现切换波形,调频、调幅和退出波形的控制功能。Protues内的键盘矩阵扫描时轮流选通一行,然后从端口处读取列数据,如果有按键则读取的数据肯定有一位为0,经过取反后,尽有一位为1,然后再根据选取的列和读取的行值,确定按的是哪一个键,然后将键值编码保存在一个名为keyass的存储单元里。当有键按下时,从keyass内取出键值进行判断,就能转入相应的子程序进行控制,并且键盘扫描、获取键值等子程序也能够很好的嵌入在其他程序中,方便调用。

2.1.5有极调频

改变波形子程序中的各个数据输出时间,即延时,就可改变整个波形的频率。延时越短频率越高。定义三个缓冲区来存放延时,其中一个存放初始值3,一个存放当前波形的延时,还有一个作为中间暂存用。产生波形以后,取出延时初值存入中间暂存缓冲区,再扫描键盘:0对应减小延时,1对应增大延时,无键则不改变延时。对暂存区的数值进行相应操作后,将最后的值存入名为tiaopin的缓冲区内作为当前波形的延时。

2.1.6有极调幅

和有级调频类似,有极调幅也是定义三个缓冲区,功能和有极调频类似。幅值缓冲区存放的是输出点的值的放大倍数,调节放大倍数也就使幅值改变了。产生波形以后,取出倍数初值存入中间暂存缓冲区,再扫描键盘:2对应减小倍数,3对应增大倍数,无键则不改变倍数。对暂存区的数值进行相应操作后,将最后的值存入名为tiaofu的缓冲区内作为当前波形的幅值放大倍数。

2.1.6开始结束

用小键盘第二列第一个也就是4来结束波形,无论在什么时候只在小键盘扫描到了4键,它就会无条件跳出程序,返回起始状态,等待选择波形,同时数码管显示零。

2.2所用芯片功能简介

2.2.1 8086功能简介

8086 CPU是由总线接口部件BIU和执行部件EU这两大部分构成。总线接口部件BIU是8086 CPU在存储器和I/O设备之间的接口部件,负责对全部引脚的操作,即8086对存储器和I/O设备的所有操作都是由BIU完成的。所有对外部总线的操作都必须有正确的地址和适当的控制信号,BIU中的各部件主要是围绕这个目标设计的。它提供了16位双向数据总线、20位地址总线和若干条控制总线。

其具体任务是:负责从内存单元中预取指令,并将它们送到指令队列缓冲器暂存。CPU执行指令时,总线接口单元要配合执行单元,从指定的内存单元或I/O端口中取出数据传送给执行单元,或者把执行单元的处理结果传送到指定的内存单元或I/O端口中。

执行单元EU中包含1个16位的运算器ALU、8个16位的寄存器、1个16位标志寄存器FR、1个运算暂存器和执行单元的控制电路。这个单元进行所有指令的解释和执行,同时管理上述有关的寄存器。EU对指令的执行是从取指令操作码开始的,它从总线接口单元的指令队列缓冲器中每次取一个字节。如果指令队列缓冲器中是空的,那么EU就要等待BIU通过外部总线从存储器中取得指令并送到EU,通过译码电路分析,发出相应控制命令,控制ALU数据总线中数据的流向。

管脚图如下:

2.2.2 8255A功能简介

8255A具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。8255A的通用性强,使用灵活,通过它CPU可直接与外设相连。

8255A在使用前要写入一个方式控制字,选择A、B、C三个端口各自的工作方式,共有三种。方式0 :基本的输入输出方式,即无须联络就可以直接进行的 I/O方式。其中A、B、C口的高四位或低四位可分别设置成输入或输出;方式1 :选通I/O,此时接口和外围设备需联络信号进行协调,只有A口和B口可以工作在方式1,此时C口的某些线被规定为A口或B口与外围设备的联络信号,余下的线只有基本的I/O功能,即只工作在方式0;方式2: 双向I/O方式,只有A口可以工作在这种方式,该I/O线即可输入又可输出,此时C口有5条线被规定为A口和外围设备的双向联络线,C口剩下的三条线可作为B口方式1的联络线,也可以和B口一起方式0的I/O线。

管脚图如下:

2.2.3 DAC0832功能简介

DAC0832是采用CMOS工艺制成的单片电流输出型8位数 / 模转换器。它由倒T型R-2R电阻网络、模拟开关、运算放大器和参考电压VREF四大部分组成。电路有极好的温度跟随性,使用了COMS电流开关和控制逻辑而获得低功耗、低输出的泄漏电流误差。集成电路内有两级输入寄存器,使DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要.DAC0832有8个输入端(其中每个输入端是8位二进制数的一位),有一个模拟输出端。输入可有2的8次方,即256个不同的二进制组态,输出为256个电压之一,即输出电压不是整个电压范围内任意值,而只能是256个可能值。

D/A转换结果采用电流形式输出。若需要相应的模拟电压信号,可通过一个高输入阻抗的线性运算放大器实现。运放的反馈电阻可通过RFB端引用片内固有电阻,也可外接。DAC0832逻辑输入满足TTL电平,可直接与TTL电路或微机电路连接。

DAC0832的管脚图如下:

2.2.4 74LS273功能简介

地址锁存器就是一个暂存器,它根据控制信号的状态,将总线上地址代码暂存起来。8086/8088数据和地址总线采用分时复用操作方法,即用同一总线既传输数据又传输地址。当微处理器与存储器交换信号时,首先由CPU发出存储器地址,同时发出允许锁存信号ALE给锁存器,当锁存器接到该信号后将地址/数据总线上的地址锁存在总线上,随后才能传输数据。

地址锁存器74LS273是带清除端的八D触发器,只有清除端为高电平时才具有锁存功能,锁存控制端为11脚CLK,在上升沿锁存。8086的ALE端输出的锁存控制信号必须经反相器后才能连到74LS273的CLK端,以满足CLK在上升沿锁存的要求。74LS273的引脚1D~8D为数据输入端,1Q~8Q为数据输出端,WR:主清除端,低电平触发,即当为低电平时,芯片被清除,输出全为0。CP(CLK):触发端,上升沿触发,即当CP从低到高电平时,D0~D7的数据通过芯片,为0时将数据锁存,D0~D7的数据不变。由于8086有20位物理地址,所以需要用3片74LS273级联。

74LS273的管脚图如右:

2.3 实施方案

2.3.1系统总体设计方案

该设计包括硬件设计和软件设计两部分。

1.硬件上要求以8086CPU为核心进行电路设计。完全用小键盘对波形进行控制。小键盘作为产生波形、波形切换、调节频率,调节幅值、退出波形的控制端口。8255A芯片完成对小键盘扫描,获取键值编码以及输出到数码管。通过DAC0832将数字量转换成模拟量输出,再由转换电路将电流输出转换为电压输出产生各种波形,通过虚拟示波器显示出波形。由于8255A的A,B,C端口都已使用,所以采用键盘控制进行幅值和频率的有极调节。

2.软件方面要设计方波,三角波,锯齿波,正弦波何时产生,如何产生,何时退出,并且还要设计如何通过对按键的判断,对频率和幅值进行调节。

方波比较简单,先扫描键盘,无键按下时输出零,保持一个延时,再扫描键盘,无键按下时输出20H的倍数,该倍数就是我定义的幅值,再延时,循环该周期就可得到方波。如果有键按下就会转入相应子程序。

三角波分为两段,因它的上升斜坡和下降斜坡都是线性关系,所以只要由数字量的增减来控制就可以了。产生上升斜坡时让输出值从零开始逐渐递增,其上升的最大值是30乘以放大倍数,相反,产生下降斜坡时,让输出值从最大值逐渐递减到零。为简单起见,这里采用的是查表法,在数据段定义了三角波函数表,规律如上。其幅值由放大倍数控制,频率是由输出点之间的延时来控制。

锯齿波截取三角波的上升斜坡部分,到达最大值后就跳回最低值0,方法与三角波相同,也采用查表法。先定义了锯齿波的函数表,输出时只要按着函数表一个一个往下输出,当显示到最大值即一个周期内的最后一个值再将指针指向表的首地址就开始了新的周期。其幅值由放大倍数控制,频率是由输出点之间的延时来控制。

正弦波也是用的查表法。该方法的优点是速度快,但在精度高的情况下要求的存储器容量也要增大,所以此种方法应用在对精度要求不高的场合。本程序中制造了一张正弦数字量表,即查函数表得到的值转换成十进制数填表。一个周期内,采样点越多,精度越高,本实验中采样点为40点/周期。正弦数字量表中的值为参考值,对于不同幅值的正弦波可以通过把表中的每个值乘以相同的倍数得到,其频率由改变输出点之间的延时来实现。

频率和幅值的调节由每个点的延时和幅值的放大倍数决定。在各个波形输出之前,先读取频率和幅值的初值,若要增加(减小)频率,则使延时减(加)1;若要增大(减小)幅值,则使原幅值基础值得放大倍数加(减)1。然后再将改变后的幅值频率送给原波形进行输出,同时,幅值和频率的值作为偏移量查找数码管显示表,然后送给对应的数码管显示。

2.3.2系统设计方框图

第三章 典型程序模块及编程技巧分析

3.1键盘扫描模块

小键盘工作原理:

(1)初始化8255的工作方式:A,B口作为输出,C口低四位作为输入。矩阵的X1~X4接到输出端口PA0-PA3上,用程序控制4条行线的输出。4条列线Y1~Y4连接到输入端口C的PC0-PC3。用读指令读取C口状态时,可读取键盘的列号。

(2)在无键按下的时候,由于接到+5V上的上拉电阻的作用,列线被置成高电平。压下某一个键所在的行线和列线接通。这时,如果向被压下的键所在的行线上输出一个低电平信号,则对应的列线也呈现低电平。当从C口读取列线信号时,便能检测到该列线上的低电平。

(3)扫描键盘时,A口输出全0,读C口,取低四位再取反,若为0则无键输入,若不为零则转获取键值子程序。获取键值时,对X1到X4轮流选中,即轮流输出0。先把第一行赋0,读C口检测是不是第一行,不是再继续第二行,没有的话总共循环4次跳出循环,这样根据选中的行和读入的列状态中低电平的位置,便能确定哪个键被按下了。检测到按键后,对压下的键进行编码,将该键的行列信号转化成16进制码,将键值存入缓冲区,以便以后利用进行判断比较。接着继续扫描按键,等待按键释放。

具体的实现如下:

CCSCAN扫描按键是否有键按下: CCSCAN PROC

NEAR

;扫描是否有按键闭合子程序

MOV

AL,00H

MOV

DX,MY8255_A;将4列全选通,X1~X4置0

OUT

DX,AL

MOV

DX,MY8255_C

IN

AL,DX

;读Y1~Y4

NOT

AL

AND

AL,0FH

;取出Y1~Y4的反值

RET

CCSCAN ENDP

如果有按键,就获取按键码的功能,4×4键盘的编码, 从上到下,从左到右,依次编码为0~F, 如果有按键, 则转入到按键处理子程序模块执行, 如果没有,则返回主程序循环。具体的实现代码如下:

GETKEY1 PROC

NEAR

;获取键值子程序

CALL

DIS

;显示刷新

CALL

DALLY

;延时

CALL

DALLY

;延时

CALL

CLEAR

;清屏

CALL

JNZ

JMP

GETKEY2: MOV

MOV

COLUM: MOV

MOV

OUT

MOV

IN

L1: TEST

JNZ

MOV

JMP

L2: TEST

JNZ

MOV

JMP

L3: TEST

JNZ

MOV

JMP

L4: TEST

JNZ

MOV

KCODE: ADD

CCSCAN

;再次扫描按键

GETKEY2

;有键按下则跳置GETKEY2 BEGIN1

;否则跳回开始继续循环

CH,0FEH

CL,00H

;设置当前检测的是第几列

AL,CH

;选取一列,将X1~X4中一个置0

DX,MY8255_A DX,AL

DX,MY8255_C;读Y1~Y4,用于判断哪一行按键闭合 AL,DX

AL,01H

;是否为第1行 L2

;不是则继续判断

AL,00H

;设置第1行第1列的对应的键值

KCODE

AL,02H

;是否为第2行 L3

;不是则继续判断

AL,04H

;设置第2行第1列的对应的键值

KCODE

AL,04H

;是否为第3行 L4

;不是则继续判断

AL,08H

;设置第3行第1列的对应的键值

KCODE

AL,08H

;是否为第4行 NEXT

;不是则继续判断

AL,0CH

;设置第4行第1列的对应的键值

AL,CL

;将第1列的值加上当前列数,确定按键值

CALL

PUTBUF

;保存按键值

PUSH

AX

KON: CALL

DIS

;显示刷新

CALL

CLEAR

;清屏

CALL

CCSCAN

;扫描按键,判断按键是否弹起

JNZ

KON

;未弹起则继续循环等待弹起

POP

AX

NEXT: INC

CL

;当前检测的列数递增

MOV

AL,CH

TEST

AL,08H

;检测是否扫描到第4列

JZ

KERR

;是则跳回到开始处

ROL

AL,1

;没检测到第4列则准备检测下一列

MOV

CH,AL

JMP

COLUM

KERR: RET

GETKEY1 ENDP PUTBUF PROC

NEAR

;保存键值子程序

MOV

DI,OFFSET KEY

MOV

[DI],AL

CMP

DI,2FFFH

JNZ

GOBACK

MOV

DI,3004H

GOBACK: RET

PUTBUF ENDP

3.2数码管显示模块

4个数码管的X端为选通端,将小键盘的X1~X4对应接到数码管,这样扫描小键盘的时候,也就选中了数码管,当调用getkey1获取键值子程序的时候,数码管轮流选中,也就可以控制哪个数码管显示什么内容。通过对8255写入数据,由B口输出给数码管的A~Dp,当没有波形输入时,数码管显示0数码管;定义两个缓冲区存放幅值和频率,有波形输出时,同步显示该波形的幅值和频率。

先在数据段定义一个缓冲区存放数码管显示0~F的段位值表: DTABLE DB

3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB

7FH,6FH,77H,7CH,39H,5EH,79H,71H 因为要一直显示数码管,所以将显示部分作为子程序,方便经常调用。DIS PROC

NEAR

;显示键值子程序

AGAIN:

PUSH

AX

;以缓冲区存放的键值为键值表偏移找到键值

并显示

MOV

SI,3000H

;缓冲区3000H内存放了当前波形的幅

值,3001H存放了频率。

MOV

DL,0F7H MOV

AL,DL PUSH

DX MOV

DX,MY8255_A OUT

DX,AL

;设置X1~X4,选通一个数码管 MOV

AL,[SI]

;取出缓冲区中存放键值 MOV

BX,OFFSET DTABLE AND

AX,00FFH ADD

BX,AX MOV

AL,[BX]

;将键值作为偏移和键值基地址相加得到

相应的键值

MOV

DX,MY8255_B OUT

DX,AL

;写入数码管A~Dp CALL

DALLY INC

SI

;取下一个键值 POP

DX MOV

AL,DL TEST

AL,01H

;判断是否显示完? JZ

OUT1

;显示完,返回 ROR

AL,1 MOV

DL,AL

JMP

AGAIN

;未显示完,跳回继续

OUT1: POP

AX

RET

DIS ENDP 3.3有级调频调幅判断及控制模块

改变波形产生子程序中的各个数据输出时间,及延时,就可改变整个波形的频率。改变波形产生子程序中的每次输出数值的放大倍数,就可以改变整个波形的幅值。而实现有级变化的初值是在数据段预先定义的数据表。

在选择波形以后,才能调节频率和幅值,频率和幅值的调节由小键盘控制。在3000H和3001H的缓冲区内存放了幅值和频率的初值3,在每个波形输出之前先扫描键盘,键值存在KEY里,对KEY值进行判断后,取出缓冲区的初值做相应改变:0选择增大频率,1选择减小频率,2选择减小幅值,3选择增大幅值,4退出波形,返回开始状态。

具体的实现代码如下:

AMPLFENC PROC

NEAR

;调节幅值频率子程序

CALL

DIS

;刷新

CALL

CCSCAN

;再次扫描按键

JNZ

TRI1

;有键按下则跳置tri1

JMP

TRI5

;没按键按下就跳出该子程序

TRI1: CALL

DIS

;刷新

CALL

GETKEY1

MOV

SI,OFFSET KEY

MOV

AL,[SI]

CMP

AL,4

;第五个键就退出

JZ

TRI10

JZ

TRI5

CMP

AL,0

;第一个键减少周期

JNZ

TRI2

MOV

DI,3001H

;取延时初值

MOV

BL,[DI]

CMP

BL,01H

JE

TRI5

DEC

BL

MOV

[DI],BL

JMP

TRI5

TRI2: CMP

AL,1

;第二个键增加周期

JNZ

MOV

MOV

CMP

JE

INC

MOV

JMP

TRI3: CMP

JNZ

MOV

MOV

CMP

JE

DEC

MOV

JMP

TRI4: CMP

JNZ

MOV

MOV

CMP

JE

INC

MOV

JMP

TRI3

DI,3001H BL,[DI] BL,05H TRI5 BL [DI],BL TRI5

AL,2

TRI4 DI,3000H

BL,[DI]

BL,01H TRI5 BL [DI],BL TRI5

AL,3

TRI5 DI,3000H

BL,[DI]

BL,05H TRI5 BL [DI],BL TRI5

;取延时初值;第三个键减少幅度

;取幅值初值;第四个键增加幅度

;取幅值初值

TRI10: JMP

FAR PTR BEGIN0

TRI5: RET

AMPLFENC ENDP

3.4 波形切换及基本控制模块

这个模块是本次设计的主程序,它控制了波形的输出和切换。它是根据对小键盘的操作来实现的,不同按键对应的编码转入不同模块(0:方波,1:三角波,2:锯齿波,3:正弦波,4:退出波形)。先扫描键盘是否有键按下,若无循环等待,若有则将键值保存再比较,然后实现相应操作。为使程序可循环使用,不至于显示一次波形就退出,在执行完子程序返回时,不退出系统,而是返回到开始等待输入状态,这样就能切换波形。

具体的实现代码如下:

BEGIN0: MOV

SI,3000H

;把数码管清0

MOV

AL,00H

;先初始化键值为0

MOV

[SI],AL

MOV

AL,00H

MOV

[SI+1],AL

MOV

AL,00H

MOV

[SI+2],AL

MOV

AL,00H

MOV

[SI+3],AL

MOV

SI,OFFSET KEY

MOV

AL,00H

MOV

[SI],AL BEGIN1: CALL

DIS

;显示刷新

CALL

CCSCAN

;再次扫描按键

JNZ

LBEGIN0

;有键按下则跳置LBEGIN0

JMP

BEGIN1;不是按下第一或二键就继续等待输入

LBEGIN0: CALL

GETKEY1

;第二个菜单等待输入

CALL

DIS

MOV

SI,OFFSET KEY

MOV

AL,[SI]

CMP

AL,4

;第5个键退出

JZ

BEGIN0

CMP

AL,0

;第1个键到squ(方波)函数

JZ

LBEGIN1

CMP

AL,1

;第2个键到tri(三角波)函数

JZ

LBEGIN2

CMP

AL,2

;第3个键到rec(锯齿)函数

JZ

LBEGIN3

CMP

AL,3

;第4个键到sin(正弦)函数

JZ

LBEGIN4

JMP

BEGIN1

;其他键则跳到继续等待输入

LBEGIN1: CALL

SQUREW

;SQUARE

JMP

BEGIN0

LBEGIN2: CALL

TRIW

;TRIANGLE

JMP

BEGIN0

LBEGIN3: CALL

RCTW

;RECANGLE

JMP

BEGIN0

LBEGIN4: CALL

SINW

;SIN

JMP

BEGIN0

;执行完输出波形之后 回到开始状态

JMP

BEGIN0

3.5波形产生模块 3.5.1方波

方波的产生只要使DAC0832输出一个较大值(此处用20H),并延时一段时间,再输出一个较小值(此处用00F),延时一段相同时间,就是方波的一个周期。但因为实现过程中结合了数码管的显示以及频率幅值的调节所以并不那么简单。先将幅值和频率的初值放入暂存缓冲区,使数码管显示,扫描键盘,无键按下则继续,有键按下则先判断是否为0到3,是则调节频率幅值,是4则退出波形。执行相应操作后刷新数码管,将新的幅值和频率存在TIAOFU和TIAOPIN的缓冲区内,把低电平的值乘以TIAOFU输出,延迟时间乘以TIAOPIN,使该值持续一段时间,输出高电平的过程与低电平相同,循环该周期就得到连续方波。

具体的实现代码如下:

SQUREW PROC

NEAR

;方波发生子程序

MOV

MOV

MOV

MOV

MOV

MOV

MOV

MOV

SQUR1: CALL 调节幅值频率

MOV

MOV

CMP

JZ

CALL

MOV

MOV

MOV

MOV

MOV

MOV

MOV

MOV

TRILOOP1: MOV

MOV

DI,OFFSET FENC

;初始化显示管的值为3

AL,[DI]

SI,3000H

[SI],AL

DI,OFFSET AMPL

AL,[DI]

SI,3001H

[SI],AL

AMPLFENC

;调节幅值频率子程序,有键按下是

SI,OFFSET KEY

;按下第五个键就退出

AL,4

[SI],AL

SQUA

DIS

;刷新数码管

SI,3000H

BL,[SI]

DI,OFFSET TIAOFU

[DI],BL

SI,3001H

AL,[SI]

SI,OFFSET TIAOPIN

[SI],AL

DX,DA0832

;输出低电平

输出方波形

AL,00H

OUT

DX,AL

CALL

DIS

;刷新

PUSH

CX

PUSH

AX

MOV

CL,TIAOPIN

MOV

CH,00H

D11: MOV

D21: DEC

PUSH

PUSH

CALL

CALL

JNZ

POP

POP

JNZ

LOOP

POP

POP

CALL

JNZ

MOV

MOV

MUL

MOV

OUT

CALL

PUSH

PUSH

MOV

MOV

D12: MOV

AX,00FFH AX AX CX DIS

CCSCAN

;再次扫描按键 SQUR1

;有键按下则跳置squr1, CX AX D21 D11 AX CX

CCSCAN

;再次扫描按键

SQUR1;有键按下则跳置squr1,改变幅值频率 BL,TIAOFU AL,20H BL

DX,DA0832

;输出高电平DX,AL

DIS

;刷新 CX AX CL,TIAOPIN CH,00H AX,00FFH

D22: DEC

AX

PUSH

AX

PUSH

CX

CALL

DIS

CALL

CCSCAN

;再次扫描按键

JNZ

SQUR1

;有键按下则跳置tri1

POP

CX

POP

AX

JNZ

D22

LOOP

D12

POP

AX

POP

CX

JZ

TRILOOP1

;没按键时继续输出波形

SQUA: RET

SQUREW ENDP

3.5.2三角波

三角波理论上有两段,上升和下降,上升时从最低值开始自增,直到最大值,然后再自减至最低。本设计中,因为对波形精度要求不是很高,所以采用按列表输出的方式,即先在数据段定义了一段三角波一个周期内的采样值的数字量表,采样频率为60点/周期。数字量表中的值为参考值,输出三角波时通过把表中的每个值乘以相同的倍数,该倍数为我们设定的幅值。波形输出方式都相同,这里简要说明:先将幅值和频率的初值放入暂存缓冲区,使数码管显示,扫描键盘,执行相应操作后刷新数码管,将新的幅值和频率存在TIAOFU和TIAOPIN的缓冲区内,将第一个数字量乘以TIAOFU输出,延迟时间乘以TIAOPIN,再扫描,输出第二个值,直到指针指完该数字量表再循环该周期就得到连续三角波。

具体的实现代码如下:

TRITAB

DB

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;三角函数表

DB

16,17,18,19,20,21,22,23,24,25,26,27,28,29,30

DB

30,29,28,27,26,25,24,23,22,21,20,19,18,17,16

DB

15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 TRIW PROC

NEAR

;三角波形子程序

MOV

DI,OFFSET FENC

MOV

AL,[DI]

MOV

SI,3000H

MOV

[SI],AL

TRA1:

TRLOOP1:

TRLOOP2:

MOV

DI,OFFSET AMPL MOV

AL,[DI] MOV

SI,3001H MOV

[SI],AL CALL

AMPLFENC MOV

SI,OFFSET KEY MOV

AL,4 CMP

[SI],AL JZ

TRIA CALL

DIS MOV

SI,3000H MOV

BL,[SI] MOV

DI,OFFSET TIAOFU MOV

[DI],BL MOV

SI,3001H MOV

AL,[SI] MOV

SI,OFFSET TIAOPIN MOV

[SI],AL MOV

SI,OFFSET TRITAB MOV

AL,[SI] MOV

BL,TIAOFU MUL

BL MOV

DX,DA0832

;启动D/A转换 OUT

DX,AL PUSH

AX PUSH

SI

PUSH

CX

MOV

CL,TIAOPIN

MOV

CH,00H

DALLYTRI1: CALL

DIS

CALL

CCSCAN

JNZ

TRA1

LOOP

DALLYTRI1

POP

CX

POP

SI

POP

AX

INC

SI

CMP

SI,OFFSET RCTTAB

JNZ

TRLOOP2

JMP

TRLOOP1

TRIA: RET

TRIW ENDP

3.5.3锯齿波

锯齿波就是截取了三角波的上升部分,由最小值自增到达最大值后下一个值就返回最小值。本设计中锯齿波的产生方式也是对锯齿波采样,采样周期为32点/周期,然后以采样表为基础输出。锯齿波的输出方式与三角波相同,这里不再重复。

具体的实现代码如下:

先在数据段定义一张锯齿波采样后的数字量表: RCTTAB DB

1,2,3,4,5,6,7,8

;锯齿函数表

DB

9,10,11,12,13,14,15,16

DB

17,18,19,20,21,22,23,24

DB

25,26,27,28,29,30,31,32 RCTW PROC

NEAR

;锯齿波形子程序

MOV

DI,OFFSET FENC

MOV

AL,[DI]

MOV

SI,3000H

MOV

[SI],AL

MOV

DI,OFFSET AMPL

MOV

AL,[DI]

MOV

SI,3001H

MOV

[SI],AL

RCT1: CALL

AMPLFENC

MOV

MOV

CMP

JZ

CALL

MOV

MOV

MOV

MOV

MOV

MOV

MOV

MOV

RCLOOP1: MOV

RCLOOP2: MOV

MOV

MUL

MOV

OUT

PUSH

PUSH

PUSH

MOV

MOV

DALLYRCT1: CALL

CALL

SI,OFFSET KEY AL,4 [SI],AL DIS SI,3000H BL,[SI]

DI,OFFSET TIAOFU [DI],BL SI,3001H AL,[SI]

SI,OFFSET TIAOPIN [SI],AL

SI,OFFSET RCTTAB AL,[SI] BL,TIAOFU BL

DX,DA0832

;启动D/A转换 DX,AL AX SI CX CL,TIAOPIN CH,00H

;刷新,扫描,延时CCSCAN

RCTA

DIS

JNZ

RCT1

LOOP

DALLYRCT1

POP

CX

POP

SI

POP

AX

INC

SI

;下一个值

CMP

SI,OFFSET STR1

JNZ

RCLOOP2

JMP

RCLOOP1

RCTA: RET

RCTW ENDP

3.5.4正弦波

正弦波的产生方式有两种,一种是通过调用函数输出,精度较高,第二种为采样查表法。本实验精度要求不高,所以采用第二种。该方法与前面的三角波,锯齿波方法相同,对一个周期内的正弦波采样,采样周期为40点/周期,输出方式与三角波相同,不再重复。

先在数据段定义正弦波的采样数字量表:

SINTAB DB

16,19,21,23,25,27,29,30,31,32,32,32

;正弦函数表

DB

31,30,29,27,25,23,21,19,16,13,11,9

DB

7,5,3,2,1,0,0,0,1,2,3,5,7,9,11,13 SINW PROC

NEAR

;正弦波的子程序

MOV

DI,OFFSET FENC

MOV

AL,[DI]

MOV

SI,3000H

;取幅值初值

MOV

[SI],AL

MOV

DI,OFFSET AMPL

MOV

AL,[DI]

MOV

SI,3001H

;取频率初值

MOV

[SI],AL

SINA1: CALL

AMPLFENC

MOV

SI,OFFSET KEY

MOV

AL,4

CMP

[SI],AL

JZ

SINA

CALL

DIS

MOV

SI,3000H

MOV

BL,[SI]

MOV

MOV

MOV

MOV

MOV

MOV

SINLOOP1: MOV

SINLOOP2: MOV

MOV

MUL

MOV

OUT

PUSH

PUSH

PUSH

MOV

MOV

DALLYSIN1: CALL

CALL

JNZ

LOOP

POP

POP

POP

INC

CMP

DI,OFFSET TIAOFU [DI],BL SI,3001H AL,[SI]

SI,OFFSET TIAOPIN [SI],AL

SI,OFFSET SINTAB AL,[SI] BL,TIAOFU BL

DX,DA0832

;启动D/A转换

DX,AL AX SI CX CL,TIAOPIN CH,00H CCSCAN SINA1 DALLYSIN1 CX SI AX SI

SI,OFFSET TRITAB

;是否结束一个周期

DIS

JNZ

SINLOOP2

JMP

SINLOOP1

SINA: RET

SINW ENDP

第四章 系统调试遇到的问题及解决方法

本次课程设计是对前几次微机原理实验的检验,也是微机原理与接口技术这门课程的综合应用。前几次软件实验,我都积极地实现了拓展题目的要求,所以在选择课题的时候,我第一印象就感觉到信号发生器对软件要求要大于硬件要求,重点是编程,所以,在选择了这个题目以后我就开始思考用何种方式实现。

整体分析后,硬件电路的系统设计比较简单,主程序的设计思路也比较清晰,主要分为波形产生,数码管显示,键盘控制,频率幅值调节四个模块。但是具体每个模块的实现却又遇到了很多的问题,方案上也有些调整。

在此次实验系统调试的过程中,把整个大的程序划分为几个小模块分开调试好,无误后再写主程序将各个子程序整合起来。虽然一开始感觉思路是很好的,但是在实现过程中遇到了很大的麻烦。

1.硬件的连线。硬件连好后,将方波子程序载入8086,最开始示波器连输出都没有,DAC0832的片选端一直没有被选中,我总是以为是地址的问题,可是怎么检查程序也是没有理由出错的,最后发现DAC0832的WR端虚接了,软件画图容易出现虚接的情况,所以连线的时候一定要小心。

2.小键盘控制,这也是整个程序中最核心的部分。这个子程序加在程序的最前面的,如果没有扫描到键值,整个程序就会陷入死循环,不会有任何输出变化。要使键盘扫描得到键值,我参考了实验指导书上的小键盘控制,先把小键盘扫描的程序单独给出来,看能否显示数字,结果并不能正常显示,反复检查调试以后,修改了键值的存储方式以及延时,将其修改后,小键盘方面能正常扫描了。

3.其实最复杂的是将数码管显示和小键盘扫描整合在一起。数码管显示问题一直很复杂,总是不能正常的显示,明明小键盘Y端有变化,表明有键按下,但是数码管就是不能将要显示的数平稳地显示,刚开始只显示零,后来经修改后,会偶尔显示一下幅值或频率但又立马变了,并且显示的数字也不正确,貌似会和之前显示的数字有重双影。查唐都的实验说明得知,数码管只提供了一个8位数据端口,一次只能让一个数码管显示数据,然后显示过程特别地快,基本上看不到想要的结果,并且闪烁得特别厉害。经过反复一直地查找修改,终于发现,有两个数码管显示的内容重叠了,原来是要显示的两个存储单元的地址弄混了,并且延时也有问题。但是数码管的延时又涉及到波形每个输出点的延时,所以将波形产生方面,我改用了采样数字量表,使所有的波形产生都简化了,同时也使延时更短,改为增加循环次数,并且使数码管显示也加入循环里,这样利用视觉暂留,就能看到同时显示幅值和频率。

4.在小键盘实现中还出现了一个很重要的问题,就是在执行到对应的波形时要怎么样跳出然后执行到另外一个波形里面去。原本我想多设置几个按键,4个负责选择波形,4个负责调幅调频,还要加一个退出按键,每输出一个周期就扫描一次,可是这样按键太多了程序显得臃肿,并且没有波形的情况调节频率也是没有意义的,而且一个周期的时间,很有可能使你的按键落空,没有扫描进去。最后决定只用5个键。没有波形时4个按键选择波形,每次执行完一个点后再重新键盘扫描,此时那4个键又代表调幅和调频,而4键从始至终设置为退出键,只要任何时候扫描到此键就返回初始状态,重新进入波形选择,这样就实现了波形的切换,又使按键有效率更高,而且按键数量也很少。

5.方波和三角波的波形产生的程序并不难。锯齿波就是截取三角波的一半,而正弦波,我找到的正弦波采样值序列表都很长,而且值都比较大,所以最后,我用计算器在0~2π内取了40个点的正弦值。最后在调节幅值的时候,当调到最大幅值时,有两种波形失真了,尤其正弦波和三角波形被截顶了。但是我观察到锯齿波却能正常显示,原来锯齿波的采样数字量表的最大值比较小,经放大最大倍数后也没有超出范围。这可能是因为放大后正弦波的最大值已经超出了运放输出的最大电压,所以导致截顶失真。所以我将数字量的值整体缩小了,最后总算达到满意的效果。第五章 课程设计收获与体会

本次课程设计在面临考试的巨大压力和编程难度的双重压力下终于完成了。这让我对于微机原理与接口技术这门课程又有了更深的了解,尤其是汇编语言的运用。这是一次很好的实践的机会,将我们之前几个星期做的微机原理与接口技术实验的软件和硬件部分都结合起来,灵活的运用,锻炼我们学以致用,解决实际问题的能力。我在此次课程设计中受益匪浅,收获良多。

本次设计我是用仿真完成的,因为上学期在模电数电课程设计中也使用到了protues软件,所以这次的设计,对于protues的使用我一点也不陌生。但是,这次的仿真比起以前模电数电仿真要复杂多了。因为这次我选择的信号发生器重点就是汇编语言程序的编写和调试,程序出现的错误比硬件出现的错要难找的多,尤其是逻辑错误,有的时候看都看不出来。但是我还是比较喜欢汇编语言的,可能是对C已经忘得差不多了的缘故吧,脑子里只有汇编。汇编是一门很原始的语言,但是也是一门很有用的语言,通过这么一个比较大的实验,让我对汇编的理解有了进一步的加深。虽然中间过程有苦有煎熬,但是还是很值得回味的,因为我们就是在这样一次又一次煎熬中才熬出了头,才不断成长为更加强大的人。

在这次设计中,一开始想的比较简单和乐观,因为在做微机原理编程实验的时候,我们接触的都是几十行到一百来行的小程序,写完一检查就能比较轻松地查找到错误,但是这次的题目重点就在编程。一开始,我以为这些程序不会错,电路也比较简单。所以当我很快的连好电路,再几个子程序都加载进去的时候,就完全不是我想象的那样输出。而且从整个电路分析,我也找不到问题到底出在哪里。我必须要一步一步地再回头检查错误。这样有可能还检查不出来,最后我只能从一个小模块开始重新连电路,再将该模块对应的程序加载,有问题再改。就这样,一步一步,只有解决了局部的问题,才能为解决整体的问题提供可能。

在小键盘和数码管显示的模块,确实一度陷入瓶颈,不知道问题出在哪里,为什么就是不能显示。我去了几次实验室,想和大家交流一下,但是选择这个题目的人真的很少,最后找到几个同学,但是他们迫于考试压力要么放弃了仿真,要么放弃了小键盘,当时的情绪真是非常抑郁,难道就真的做不出来了吗?怎么可能?就是不相信,感觉就差一点点,就要实现了,因为坚持,因为坚信,因为坚定,哪怕这个茬再难找也会原形毕露的。当看到数码管显示正常,自己的心血终于有了结果,内心的喜悦溢于言表。有句话说得对:失败就是离成功最近的地方,迈过去了就是另一片天。

这次的课程设计,我要十分感谢同学们给予我的帮助,还有李志明老师的指导,让我在短短的几个星期里学到了很多很实用的知识,通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。而且在做课程设计的过程中,不仅是考验自己所学的《微机原理》知识,更是要锻炼自己的分析问题的能力和解决实际问题的能力,而在此次课程设计过程中得到了充分的体现。虽然在设计的过程遇到了各种各样的问题,但同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计,把以前所学过的知识重新温习,加以巩固。

这回顾起此次课程设计,我收获颇丰,不仅巩固了《微机原理》的知识,而且锻炼了动手设计,解决实际问题的能力,同时让我坚定了一个信念,学习上,没有攀登不了的山峰,即使山重水复疑无路,只要坚持下去,也会看到柳暗花明又一村。在今后的学习中,我也会将以这样的精神面对所有的困难。

第六章 参考文献

1.《微机原理与接口技术(第4版)》周荷琴等 中国科学技术大学出版社 2.《TD-PIT+实验教程》 3.《TD-PIT+用户手册》

第七章 附录

7.1汇编源程序

IOY0 EQU

0C400H

;片选IOY0对应的端口始地址

IOY1 EQU

0C440H

;片选IOY0对应的端口始地址;*****************************************************************

MY8255_A EQU

IOY0+00H*4;8255的A口地址

MY8255_B EQU

IOY0+01H*4;8255的B口地址

MY8255_C EQU

IOY0+02H*4;8255的C口地址

MY8255_MODE EQU

IOY0+03H*4;8255的控制寄存器地址

DA0832 EQU

IOY1+00H*4;DA0832的端口地址

STACK1 SEGMENT

STACK

DW

256 DUP(?)

STACK1 ENDS

DATA SEGMENT

DTABLE DB

3FH,06H,5BH,4FH,66H,6DH,7DH DB

07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H

;键值表,0~F对应的7段数码管的段位值

SINTAB DB

16,19,21,23,25,27,29,30,31,32,32,32 DB

31,30,29,27,25,23,21,19,16

;正弦函数表

DB

13,11,9,7,5,3,2,1,0,0,0,1,2,3,5,7,9,11,13

TRITAB DB

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;三角函数表

DB

16,17,18,19,20,21,22,23,24,25,26,27,28,29,30

DB

30,29,28,27,26,25,24,23,22,21,20,19,18,17,16

DB

15,14,13,12,11,10,9,8,7,6,5,4,3,2,1

RCTTAB DB

1,2,3,4,5,6,7,8

;锯齿函数表

DB

9,10,11,12,13,14,15,16

DB

17,18,19,20,21,22,23,24

DB

25,26,27,28,29,30,31,32

STR1 DB

'press 0~3 to output wave',0AH,0DH

DB

'press 4to quit ',0AH,0DH,'$'

AMPL DB

FENC DB

TIAOFU DB

?

TIAOPIN DB

?

KEY DB

?

DATA ENDS

CODE SEGMENT

ASSUME

CS:CODE,DS:DATA

START: MOV

AX,DATA

MOV

DS,AX

MOV

DX,MY8255_MODE

;初始化8255工作方式

MOV

AL,81H

;方式0,A口、B口输出,C口低4位输入

OUT

DX,AL

BEGIN0: MOV

SI,3000H

;把数码管清0

MOV

AL,00H

;先初始化键值为0

MOV

[SI],AL

MOV

AL,00H

MOV

[SI+1],AL

MOV

AL,00H

MOV

[SI+2],AL

MOV

AL,00H

MOV

[SI+3],AL

MOV

SI,OFFSET KEY

MOV

AL,00H

MOV

[SI],AL

BEGIN1: CALL

DIS

;显示刷新

CALL

CCSCAN

;再次扫描按键

JNZ

LBEGIN0

;有键按下则跳置LBEGIN0

JMP

BEGIN1

;不是按下第一或二键就继续等待输入

LBEGIN0: CALL

GETKEY1

;第二个菜单等待输入

CALL

DIS

MOV

SI,OFFSET KEY

MOV

AL,[SI]

CMP

AL,4

;第5个键退出

JZ

BEGIN0

CMP

AL,0

;第1个键到squ(方波)函数

JZ

CMP

JZ

CMP

JZ

CMP

JZ

JMP

LBEGIN1: CALL

JMP

LBEGIN2: CALL

JMP

LBEGIN3: CALL

JMP

LBEGIN4: CALL

JMP

JMP

SQUREW PROC

MOV

MOV

MOV

MOV

MOV

MOV

MOV

LBEGIN1

AL,1

;第2个键到tri(三角波)函数 LBEGIN2

AL,2

;第3个键到rec(锯齿)函数 LBEGIN3

AL,3

;第4个键到sin(正弦)函数 LBEGIN4

BEGIN1

;其他键则跳到继续等待输入 SQUREW

;SQUARE BEGIN0

TRIW

;TRIANGLE BEGIN0

RCTW

;RECANGLE BEGIN0

SINW

;SIN

BEGIN0

;执行完输出波形之后 回到开始状态 BEGIN0

;上面是主程序

NEAR

;方波发生子程序

DI,OFFSET FENC

;初始化显示管的值为3 AL,[DI] SI,3000H [SI],AL

DI,OFFSET AMPL AL,[DI] SI,3001H

MOV

[SI],AL

SQUR1: CALL

AMPLFENC

;调节幅值频率子程序,有键按下是调节幅值频率

MOV

SI,OFFSET KEY

;按下第五个键就退出

MOV

AL,4

CMP

[SI],AL

TRILOOP1:

D11:

D21:

JZ

SQUA CALL

DIS MOV

SI,3000H MOV

BL,[SI] MOV

DI,OFFSET TIAOFU MOV

[DI],BL MOV

SI,3001H MOV

AL,[SI] MOV

SI,OFFSET TIAOPIN MOV

[SI],AL

DX,DA0832

;输出低电平

输出方波形 MOV

AL,00H OUT

DX,AL CALL

DIS

;刷新 PUSH

CX PUSH

AX MOV

CL,TIAOPIN MOV

CH,00H MOV

AX,00FFH DEC

AX PUSH

AX PUSH

CX CALL

DIS CALL

CCSCAN

;再次扫描按键 JNZ

SQUR1

;有键按下则跳置squr1, POP

CX

MOV

POP

AX

JNZ

D21

LOOP

D11

POP

AX

POP

CX

CALL

CCSCAN

;再次扫描按键

JNZ

MOV

MOV

MUL

MOV

OUT

CALL

PUSH

PUSH

MOV

MOV

D12: MOV

D22: DEC

PUSH

PUSH

CALL

CALL

JNZ

POP

POP

JNZ

LOOP

POP

POP

JZ

SQUA: RET

SQUR1

;有键按下则跳置squr1,改变幅值频率 BL,TIAOFU AL,20H BL

DX,DA0832

;输出高电平

DX,AL

DIS

;刷新

CX AX CL,TIAOPIN CH,00H AX,00FFH AX AX CX DIS

CCSCAN

;再次扫描按键 SQUR1

;有键按下则跳置tri1 CX AX D22 D12 AX CX

TRILOOP1

;没按键时继续输出波形

SQUREW ENDP

TRIW PROC

NEAR

;三角波形子程序

MOV

DI,OFFSET FENC

MOV

AL,[DI]

MOV

SI,3000H

TRA1:

TRLOOP1:

TRLOOP2:

MOV

[SI],AL MOV

DI,OFFSET AMPL MOV

AL,[DI] MOV

SI,3001H MOV

[SI],AL CALL

AMPLFENC MOV

SI,OFFSET KEY MOV

AL,4 CMP

[SI],AL JZ

TRIA CALL

DIS MOV

SI,3000H MOV

BL,[SI] MOV

DI,OFFSET TIAOFU MOV

[DI],BL MOV

SI,3001H MOV

AL,[SI] MOV

SI,OFFSET TIAOPIN MOV

[SI],AL MOV

SI,OFFSET TRITAB MOV

AL,[SI] MOV

BL,TIAOFU MUL

BL MOV

DX,DA0832

;启动D/A转换 OUT

DX,AL PUSH

AX

PUSH

SI

PUSH

CX

MOV

CL,TIAOPIN

MOV

CH,00H

DALLYTRI1: CALL

DIS

CALL

CCSCAN

JNZ

LOOP

POP

POP

POP

INC

CMP

JNZ

JMP

TRIA: RET

TRIW ENDP

RCTW PROC

MOV

MOV

MOV

MOV

MOV

MOV

MOV

MOV

RCT1: CALL

MOV

MOV

CMP

JZ

CALL

TRA1 DALLYTRI1 CX SI AX SI

SI,OFFSET RCTTAB TRLOOP2 TRLOOP1

NEAR

;锯齿波形子程序 DI,OFFSET FENC AL,[DI] SI,3000H [SI],AL

DI,OFFSET AMPL AL,[DI] SI,3001H [SI],AL AMPLFENC SI,OFFSET KEY AL,4 [SI],AL RCTA DIS

MOV

SI,3000H

MOV

BL,[SI]

MOV

DI,OFFSET TIAOFU

MOV

[DI],BL

MOV

SI,3001H

MOV

AL,[SI]

MOV

MOV

RCLOOP1: MOV

RCLOOP2: MOV

MOV

MUL

MOV

OUT

PUSH

PUSH

PUSH

MOV

MOV

DALLYRCT1: CALL

CALL

JNZ

LOOP

POP

POP

POP

INC

CMP

JNZ

JMP

RCTA: RET

RCTW ENDP

SI,OFFSET TIAOPIN [SI],AL

SI,OFFSET RCTTAB AL,[SI] BL,TIAOFU BL

DX,DA0832

;启动D/A转换 DX,AL AX SI CX CL,TIAOPIN CH,00H CCSCAN RCT1 DALLYRCT1 CX SI AX SI

SI,OFFSET STR1 RCLOOP2 RCLOOP1

DIS

SINW PROC

NEAR

;正弦波的子程序

MOV

DI,OFFSET FENC

MOV

AL,[DI]

MOV

SI,3000H

MOV

[SI],AL

SINA1:

SINLOOP1:

SINLOOP2:

MOV

DI,OFFSET AMPL MOV

AL,[DI] MOV

SI,3001H MOV

[SI],AL CALL

AMPLFENC MOV

SI,OFFSET KEY MOV

AL,4 CMP

[SI],AL JZ

SINA CALL

DIS MOV

SI,3000H MOV

BL,[SI] MOV

DI,OFFSET TIAOFU MOV

[DI],BL MOV

SI,3001H MOV

AL,[SI] MOV

SI,OFFSET TIAOPIN MOV

[SI],AL MOV

SI,OFFSET SINTAB MOV

AL,[SI] MOV

BL,TIAOFU MUL

BL MOV

DX,DA0832

;启动D/A转换 OUT

DX,AL PUSH

AX PUSH

SI

PUSH

CX

MOV

CL,TIAOPIN

MOV

CH,00H

DALLYSIN1: CALL

DIS

CALL

CCSCAN

JNZ

SINA1

LOOP

POP

POP

POP

INC

CMP

JNZ

JMP

SINA: RET

SINW ENDP

AMPLFENC PROC

CALL

CALL

JNZ

JMP

TRI1: CALL

CALL

MOV

MOV

CMP

JZ

JZ

CMP

JNZ

MOV

DALLYSIN1 CX SI AX SI

SI,OFFSET TRITAB SINLOOP2 SINLOOP1

NEAR

;调节幅值频率子程序 DIS

;刷新

CCSCAN

;再次扫描按键 TRI1

;有键按下则跳置tri1 TRI5

;没按键按下就跳出该子程序DIS

;刷新 GETKEY1

SI,OFFSET KEY

AL,[SI]

AL,4

;第五个键就退出 TRI10 TRI5

AL,0

;第一个键减少周期 TRI2

DI,3001H

MOV

BL,[DI]

CMP

BL,01H

JE

TRI5

DEC

BL

MOV

[DI],BL

JMP

TRI5

TRI2: CMP

JNZ

MOV

MOV

CMP

JE

INC

MOV

JMP

TRI3: CMP

JNZ

MOV

MOV

CMP

JE

DEC

MOV

JMP

TRI4: CMP

JNZ

MOV

MOV

CMP

JE

INC

MOV

AL,1

TRI3 DI,3001H BL,[DI] BL,05H TRI5 BL [DI],BL TRI5

AL,2

TRI4 DI,3000H BL,[DI] BL,01H TRI5 BL [DI],BL TRI5

AL,3

TRI5 DI,3000H BL,[DI] BL,05H TRI5 BL [DI],BL

;第二个键增加周期;第三个键减少幅度;第四个键增加幅度

JMP

TRI5

TRI10: JMP

FAR PTR BEGIN0

TRI5: RET

AMPLFENC ENDP

GETKEY1 PROC

NEAR

CALL

CALL

CALL

CALL

CALL

JNZ

JMP

GETKEY2: MOV

MOV

COLUM: MOV

MOV

OUT

MOV

IN

L1: TEST

JNZ

MOV

JMP

L2: TEST

JNZ

MOV

JMP

L3: TEST

JNZ

MOV

JMP

DIS

;显示刷新 DALLY DALLY

CLEAR

;清屏

CCSCAN

;再次扫描按键

GETKEY2

;有键按下则跳置GETKEY2 BEGIN1

;否则跳回开始继续循环

CH,0FEH

CL,00H

;设置当前检测的是第几列

AL,CH

;选取一列,将X1~X4中一个置0

DX,MY8255_A DX,AL

DX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合AL,DX

AL,01H

;是否为第1行 L2

;不是则继续判断

AL,00H

;设置第1行第1列的对应的键值

KCODE

AL,02H

;是否为第2行 L3

;不是则继续判断

AL,04H

;设置第2行第1列的对应的键值

KCODE

AL,04H

;是否为第3行 L4

;不是则继续判断

AL,08H

;设置第3行第1列的对应的键值

KCODE

L4: TEST

AL,08H

;是否为第4行

JNZ

NEXT

;不是则继续判断

MOV

AL,0CH

;设置第4行第1列的对应的键值

KCODE: ADD

AL,CL

;将第1列的值加上当前列数,确定按键值

CALL

PUTBUF

;保存按键值

PUSH

AX

KON: CALL

CALL

CALL

JNZ

POP

NEXT: INC

MOV

TEST

JZ

ROL

MOV

JMP

KERR: RET

GETKEY1 ENDP

CCSCAN PROC

MOV

MOV

OUT

MOV

IN

NOT

AND

RET

CCSCAN ENDP

DIS

;显示刷新 CLEAR

;清屏

CCSCAN

;扫描按键,判断按键是否弹起 KON

;未弹起则继续循环等待弹起 AX

CL

;当前检测的列数递增

AL,CH

AL,08H

;检测是否扫描到第4列 KERR

;是则跳回到开始处

AL,1

;没检测到第4列则准备检测下一列

CH,AL COLUM NEAR

;扫描是否有按键闭合子程序

AL,00H

DX,MY8255_A;将4列全选通,X1~X4置0 DX,AL DX,MY8255_C AL,DX

;读Y1~Y4 AL

AL,0FH

;取出Y1~Y4的反值

CLEAR PROC

NEAR

;清除数码管显示子程序

MOV

DX,MY8255_B;段位置0即可清除数码管显示

MOV

AL,00H

OUT

DX,AL

RET

CLEAR ENDP

DIS

键值并显示

AGAIN:

相应的键值

NEAR

;显示键值子程序

PUSH

AX

;以缓冲区存放的键值为键值表偏移找到MOV

SI,3000H MOV

DL,0F7H MOV

AL,DL PUSH

DX MOV

DX,MY8255_A OUT

DX,AL

;设置X1~X4,选通一个数码管 MOV

AL,[SI]

;取出缓冲区中存放键值 MOV

BX,OFFSET DTABLE AND

AX,00FFH ADD

BX,AX MOV

AL,[BX]

;将键值作为偏移和键值基地址相加得到MOV

DX,MY8255_B OUT

DX,AL

;写入数码管A~Dp CALL

DALLY INC

SI

;取下一个键值 POP

DX MOV

AL,DL TEST

AL,01H

;判断是否显示完? JZ

OUT1

;显示完,返回 ROR

AL,1 MOV

DL,AL PROC

JMP

AGAIN

;未显示完,跳回继续

OUT1: POP

AX

RET

DIS ENDP

PUTBUF PROC

NEAR

;保存键值子程序

MOV

MOV

CMP

JNZ

MOV

GOBACK: RET

PUTBUF ENDP

DALLY PROC

PUSH

MOV

D1: MOV

D2: DEC

JNZ

LOOP

POP

RET

DALLY ENDP

CODE ENDS

END

DI,OFFSET KEY [DI],AL DI,2FFFH GOBACK DI,3004H NEAR

;软件延时子程序 CX CX,000FH AX,000FH AX D2 D1 CX START

7.2 8086 最小模式的硬件连接图

第四篇:微机硬件实验心得

实训四底板LED点阵控制实训个人总结

通过led点阵实验的实践,使我在理论的基础上更深刻的掌握了嵌入式系统的深层内容及实际生活中的应用,实践锻炼了自己动手能力和思维能力,还有在软件方面的编程能力,让我受益匪浅,同时也暴露出一些平时学习上的问题,这次实践让我懂得了如何编写一些简单的程序,这几周我们经过老师耐心的讲解和指导通过自己认真的动手操作,终于完成了本次实训。

在这次实训过程中我们锻炼了自己的思考能力、动手能力和排除故障的能力。虽说在实训过程中遇到很多不懂的地方,但我们还是在老师和同学的帮助下完成了。对于点阵这个实验,刚开始的步骤就不用多说了,和之前的一样,关键在于程序的改写。首先,我们运行原始程序并单步调试观察每一句执行后的结果,对数据寄存器rGPFDAT进行分析,DM1_RL1高四位控制左边点阵前两行,DM1_RL2控制左边点阵中间四行,DM1_RL3低四位控制左边点阵后两行,DM1_RL3高四位控制右边点阵前两行,DM1_RL4控制右边点阵中间四行,DM1_RL5低四位控制右边点阵后两行。如果显示姓名首字母缩写,在点阵中将亮的点置一,写出对应的十六进制数,右边比左边高,下边比上边高,依次写出DM1_RL1、DM1_RL2、DM1_RL3、DM1_RL4、DM1_RL5寄存器中所存的十六进制数据。修改完程序,编译运行程序,最终点阵显示寄存器写入的数据,点阵呈现所设姓名首字母字样。

通过这次试验,使我更加深入的了解了寄存器是如何控制点阵的以及简单程序的编写,加强了我们的实际动手操作能力。

实训三底板LED数码管控制实训个人总结

这次实训主要目的是用led数码管显示学号的后八位,实践锻炼

了自己动手能力和思维能力,还有在软件方面的编程能力。实验开始

忘记了八段数码管是如何控制显示的,但在请教同学之后,我们就很

快写出了学号所对应的十六进制数。虽然实验过程并不顺利,但最终

还是完成了实验内容。

打开实验原始程序,首先,我们运行原始程序并单步调试观察每一句执行后的结果,对数据寄存器rGPFDAT进行分析,观察每步调试

后的数码管显示变化,对寄存器进行分析。根据试验任务要显示三个

人的学号,前四位为8033,led灯显示几,八段数码管的哪位置一,例如八段数码管显示8,则对应hgfe dcba分别为0111 1111,即对应

十六进制为7f,依次写出对应的十六进制,DM1_RL1控制左边数码

管,DM1_RL2控制右边数码管。例如8033对应的十六进制为7f3f4f4f,数码管右边为高位,对应寄存器中应为4f4f3f7f,同理可写出学号的后四位。修改完程序,编译运行程序在不出现错误的情况下可以交替

显示三个不同的学号。

这次实验还算比较顺利,不过在最初的过程中由于理解错误显示的学号是反着的,修改程序后最终得到了想要的效果。这次实验使我掌握了寄存器是如何控制八段数码管的基本原理,锻炼了我们的动手

能力。掌握了编程的基本方法,更加熟悉了c语言的编写以及运用,在学习的过程中也享受了编程的乐趣。

实训二 16个LED灯实训个人总结

第二次实验具体是编程利用实验板控制底板的led数码管闪烁,实现底版上16个LED的单 双 三灯的跑马灯过程以及LED(16个)的单灯汇集。在这次的实验过程中,对软件的应用更加深刻熟练。在修改程序的过程中又温习了c语言的编写以及应用,通过这次实验掌

握了不少的知识,对于寄存器有了更深的认识。

对于这次的实验,我们首先用ARM软件打开工程,编译连接工

程,用AXD 进行调试,观察源程序,单步运行分析程序,观察每一

步执行后led灯的显示效果,根据实验任务修改程序。Led0到led15

分别由四位十六进制代码控制,即16位二进制代码控制,二进制的最低为控制led15,最高位控制led0,置一时对应位置的led灯亮。

首先,用rGPFDAT=rGPFDAT&0xfffffffe;设置I/O口GPBDAT相应LED

寄存器的初始值,分别设置寄存器DM1_RL1=0x00000000;

DM1_RL1=0x00010000;接着用for、while循环实现灯的移位及汇聚效

果,寄存器分别保存移位前和移位后的数值,单灯跑马灯,从左向右

跑到另一侧停止,且一直保持亮的状态。

这次试验要比第一次的实验难,在改写代码这一环节我们就遇

到了很大的困难,要实现跑马灯用源程序类似的代码需要很长一段,为了减少代码使程序简明易懂我们在请教同学的基础上对程序进行

了修改,采用了for循环。这次试验证明c语言在编程中的重要性,而且从这次的实验中我发现了自己c语言的功底还是有待提高,以后的日子里还需努力。

实训一对四个led灯编程个人总结

微机与嵌入式系统实训是我们第一次接触硬件操作,在老师的带领下

我们进入第一节实训课。通过这次实训对微机与嵌入式的硬件操作有

了基本的了解。

首先要进行的是pc机与主板的连接,运行H-Jtag并进行设置,用ARM

软件打开工程,编译连接工程,用AXD 进行调试,观察源程序,单

步运行分析程序,对原程序进行修改。在运行源程序的过程中,由于

第一次接触,最初的设置不成功导致程序运行不出,在同学的指导下,最终顺利运行。接着的难题就是修改程序,根据试验任务,实验中的四个灯由上到下依次分别由三位十六进制数700H、380H、580H、680H

控制,对应的二进制代码D7D8D9D10位分别控制 led1、led2、led3、led4的亮灭,置1时对应的led灯灭,置0时对应的led灯亮,即低

电平有效。首先设用rGPBCON=rGPBCON&0xffc03fff;设置I/O口

GPBCON相应LED寄存器为输出属性,GPBCON=rGPBCON|0xffd57fff;

rGPBDAT=rGPBDAT&0xfffff87f;设置I/O口GPBDAT相应LED寄存器的初

始值。然后根据推算的十六进制代码改写数据寄存器rGPBDAT的内容。

在程序中,对于循环不是很懂,因此用了好几段程序来分别控制led

灯由上到下,再由下到上,最终全亮的效果。修改完程序之后编译运

行,效果不是很明显,因此对于汇编延迟函数delay进行了修改延长

时间。

这次试验让我更深认识了c语言的重要性,对于微机与嵌入式的编程

运行以及寄存器的工作原理有了更深的了解,增强了我们的动手能力。

第五篇:微机原理红绿灯课程设计报告

微机原理红绿灯课程设计报告

实验报告 2009-09-02 18:16:02 阅读1337 评论2 字号:

大中小

摘要:

介绍了基于8255A的交通灯系统设计方案,重点论述了软件系统的编写方法。实际结果表明该系统方案切实可行。

近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结

构软硬件结合,加以完善。

十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。那么靠什么来实现这井然秩序呢?靠的就是交通信号灯的自动指挥系统。交通信号灯控制方式很多。本系统采用8255A芯片实现了A、B口设置红、绿灯点亮时间的功能;红绿灯循环点亮,红绿灯变换之间,黄灯闪烁5秒

关键字: 交通灯、软件系统

设计内容 本次课程设计是交通灯实时控制器,主要是用发光二极管模拟十字路口的红绿灯,如下图所示。交通灯控制器的设计与实现主要是通过编写汇编语言程序利用8255的A口和B口对灯的亮与灭进行控制。由于实验室的仪器上只有16个发光二极管,所以还得弄清楚是每个发光二极管所代表的灯的颜色及方向。16个发光二级管,且从高到低依次为:D15D14D13D12D11D10D9D8 D7D6D5D4D3D2D1D0。在设计的过程中做了如下的规定:R表示红灯,G表示绿灯,Y表示黄灯,E表示方向东,W表示方向西,S表示方向南,N表示方向北,D15D14表示ER,D13D12表示SR,D11D10表示EG,D9D8表示SG,D7D6表示WR,D5D4表示NR,D3D2表示WG,D1D0表示NG,D15D14D11D10表示EY,D7D6D3D2表示WY,D13D12D9D8表示SY,D5D4D1D0

表示NY。交通灯控制示意图 具体时间的分配和控制如下:

东西方向绿灯亮,南北方向红灯亮,时间20秒 东西方向黄灯闪烁,南北方向红灯亮,时间5秒 东西方向红灯亮,南北方向绿灯亮,时间20秒 东西方向红灯亮,南北方向黄灯闪烁,时间5秒

设计器材设备 微机、TD-PIT++实验箱

实验电路图 设计流程图

总体设计过程

1.根据选择题目的要求,结合所参考的资料,选择8255单元芯片以及LED显示单元电路。

1)

电路元器件的选择 可编程并行通信接口芯片8255 2)

完成8255单元电路的设计及参数计算

8255的A口地址是:IOY0+00H*4

B口地址是:IOY0+01H*4 C口地址是:IOY0+02H*4 控制端口地址是:IOY0+03H*4

2.软件流程图的设计 3.电路接线图的设计 4.软件的设计(程序见附录)1)

芯片初始化,写8255的方式字 2)

延时,延时是通过设置指令的循环次数实现的 3)

东西方向绿灯亮,南北方向红灯亮,时间20秒 4)

东西方向黄灯闪烁,南北方向红灯亮,时间5秒 5)

东西方向红灯亮,南北方向绿灯亮,时间20秒 6)

东西方向红灯亮,南北方向黄灯闪烁,时间5秒

7)判断是否有键按下 8)

返回到DOS 5.进行软硬件调试

因采用了pc机和微机原理实验箱,硬件电路设计相对比较简单,利用微机实验箱上的8255并行口、发光二级管,便构成了交通灯控制系统。

心得体会

通过这次课程设计,加强了我的动手、思考和分析解决问题的能力。在整个设计过程中,我们按照老师给出的总体方案设计了一套电路原理和电路连接图。通过查阅各方面资料我们编写了程序代码,并通过了调试,最终证实了该系统

方案确实可行。在设计过程中,了解了很多元器件的功能,并且对于其在电路中的使用有了更多的认识。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做,难免会遇到过各种各样的问题,同时也在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢

固。

这次课程设计使我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能够真正掌握理论知识,从而提高自己的实际动手能力和独立思考的能力。

附录(程序代码)

IOY0 EQU 0E000H PORTA EQU IOY0+00H*4 PORTB EQU IOY0+01H*4 PORTK EQU IOY0+03H*4 STACK1 SEGMENT STACK DW 256 DUP(?)

STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE START: MOV AL, 80H MOV DX, PORTK ;8255工作在方式0,A、B口均输出

OUT DX, AL MOV AL, 3CH MOV DX, PORTA ;A口东方向绿灯亮,南方向红灯亮

OUT DX, AL MOV AL, 3CH MOV DX, PORTB ;B口西方向绿灯亮,北方向红灯亮

OUT DX, AL CALL DELAY ;调用20s延时子程序

MOV CX, 5 START1: MOV AL, 0FCH MOV DX, PORTA ;A口东方向黄灯亮,南方向红灯亮

OUT DX, AL MOV AL, 0FCH MOV DX, PORTB ;B口西方向黄灯亮,北方向红灯亮

OUT DX, AL CALL DELAY1 ;调用0.5s延时子程序

MOV AL, 30H MOV DX, PORTA ;A口东方向黄灯灭,南方向红灯亮

OUT DX, AL MOV AL, 30H MOV DX, PORTB ;B口西方向黄灯灭,北方向红灯亮

OUT DX, AL CALL DELAY1 ;调用延时0.5s子程序

LOOP START1 ;CX≠0则循环

MOV AL, 0C3H MOV DX, PORTA ;A口东方向红灯亮,南方向绿灯亮

OUT DX, AL MOV AL, 0C3H MOV DX, PORTB ;B口西方向红灯亮,北方向绿灯亮

OUT DX, AL CALL DELAY ;调用20s延时子程序

MOV CX, 5 START2: MOV AL, 0F3H MOV DX, PORTA ;A口东方向红灯亮,南方向黄灯亮

OUT DX, AL MOV AL, 0F3H MOV DX, PORTB ;B口西方向红灯亮,北方向黄灯亮

OUT DX, AL CALL DELAY1 ;调用0.5s延时子程序

MOV AL, 0C0H MOV DX, PORTA ;A口东方向红灯亮,南方向黄灯灭

OUT DX, AL MOV AL, 0C0H MOV DX, PORTB ;B口西方向红灯亮,北方向黄灯灭

OUT DX, AL CALL DELAY1 ;调用0.5s延时子程序

LOOP START2 MOV AH, 1 INT 16H JZ START ;判断是否有键按下,无

按键则

QUIT: MOV AX, 4C00H 调回继续循环,有

则退出

INT 21H DELAY PROC NEAR ;20s延时子程序

PUSH CX PUSH DX PUSH BX

MOV BX, 3 MOV DX, 27880 LAB: MOV CX, 0FFFFH

LOOP $ DEC DX JNZ LAB DEC BX JNZ LAB POP BX

POP DX POP CX RET DELAY ENDP PROC NEAR ;0.5s延时子程序 PUSH CX PUSH DX MOV DX, 6970 LAB1: MOV CX, 0FFFFH DELAY1

LOOP $ DEC DX

JNZ LAB1 POP DX POP CX RET DELAY1 ENDP CODE ENDS END START

微机硬件课设(红绿灯)(推荐五篇)
TOP