第一篇:微机硬件课设(红绿灯)
微机原理实验课程设计
硬件部分
东华大学信息学院
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; CS1CS273;平推开关的输出K1~K8 IN0~IN7(对应连接); O0~O7LED1~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、实验接线
CS0CS8255; PA0~PA7平推开关的输出K1~K8; PB0~PB7发光二极管的输入LED1~LED8。
2、编程并全速或单步运行。
3、全速运行时拨动开关,观察发光二极管的变化。当开关某位置于L时,对应的发光二极管点亮,置于H时熄灭。
六、实验提示
七、实验结果
程序全速运行后,逻辑电平开关的状态改变应能在LED上显示出来。例如: K2置于L位置,则对应的LED2应该点亮。
八、实验范例程序框图及源代码(实验程序名:t8255.asm)
九、思考题:
1、修改接线CS2CS8255,并要求开关置“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、实验连线:
CS0CS8253OUT08253CLK2 OUT2LED1 OUT1LED2 CLK38253CLK0,CLK38253CLK1
2、编程调试程序
3、全速运行,观察实验结果
六、实验提示
七、实验结果
程序全速运行后,LED1按一定周期闪烁(周期理论值为0.2s),LED2在高频脉冲信号(约15KHz)影响下,有微弱的光亮,但无明显的周期变化现象。
八、实验范例程序框图及源代码(实验程序名:t8253.asm)
九、思考题:
1、为什么说范例程序运行时LED1闪烁周期的理论值是0.2秒?在范例程序设置LED2的最大闪烁周期是多少?请分析说明。
答:因为T2采用OUT0的输出为时钟,且T2中设置初值为04h,则OUT2输出方波周期为4*0.05s=0.2s 因为OUT1LED2,则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、实验接线
CS0CS8259
CS3 CS273 O0~O3LED1~LED4
K1~K4IR0~IR3 INTINT(8086CPU板)INTAINTA(8086CPU板)CS0CS8253OUT08253CLK2 OUT2LED1 OUT1LED2 CLK38253CLK0,CLK38253CLK1
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、修改接线IR3P+(实验箱右下角),并修改源程序,使按实验箱右下角“Pules”键时LED1~LED4全亮。
答:改变程序最后IR2的中断服务程序的设定值,即由0fbh改为0f0h.二、综合设计实验部分
一、设计要求
参考基础实验的实验1~实验5所使用的硬件和范例程序,设计一个简单的红绿灯控制系统,用LED1~LED4表示两组红绿灯,每组红灯、绿灯各1只。要求实现以下功能:
(1)红绿灯的定时切换(每10秒切换一次)
(2)设置灯光测试开关K1,当K1打开(高电平)时,LED1~LED4全亮,关闭后恢复正常。
二、实验设备
微机实验箱、8086CPU模块。
三、实验内容
了解中断处理的原理,掌握利用中断控制器进行中断申请和中断操作的方法。
四、实验原理介绍
本实验用到五部分电路:电平开关电路、简单I/O口扩展电路和8259中断控制器电路,脉冲产生电路、8253定时器/计数器电路
五、实验步骤
1、实验接线
CS0CS8259CS0CS8253 CS0CS273 O0LED101LED2 02LED403LED3 INTINT(8086CPU板)INTAINTA(8086CPU板)OUT08253CLK2 OUT2IR0 OUT1k1 IR1k1CLK38253CLK0,CLK38253CLK1
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