资源描述
沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:微机系统综合课程设计
课程设计题目:模拟电风扇工作
院(系):计算机学院
专 业:计算机科学与技术
班 级:
学 号:
姓 名:
指导教师:
完成日期:
沈阳航空航天大学课程设计报告
目 录
第1章 总体设计方案 1
1.1 设计原理 1
1.2 设计思路 1
1.3 实验环境 2
第2章 详细设计方案 3
2.1 硬件电路设计 3
2.2 主程序设计 4
2.3 功能选择模块的设计与实现 5
第3章 结果测试及分析 6
3.1 结果测试 6
3.2 结果分析 6
参考文献 7
附 录 8
-16-
沈阳航空航天大学课程设计报告 第1章 总体设计方案
第1章 总体设计方案
1.1 设计原理
根据课程设计任务书的要求,要求实现模拟电风扇的工作,电风扇的开关利用输入量来控制,用可编程并行接口芯片8255的输入端接收这一信号,双色灯模拟风扇转动方向,可以设计三个变换延时的子程序,用小键盘ABC,来调用以控制不同的风速,定时显示利用受可编程定时器芯片8253控制的可编程中断控制器8259给可编程并行接口芯片8255和键盘显示接口芯片8279产生每秒钟一次的中断,控制彩色发光二极管和LED的显示。
1.2 设计思路
采用汇编语言程序设计的方法结合硬件电路设计方法,利用AEDK实验箱上已有芯片8259,8255,8253,8279来实现模拟电风扇工作。首先需要一个总开关,用来控制电风扇的开关,可以用8255的输入端接收这一信号, 其次需要实现的功能是三级风速的变换,可以设计三个变换延时的子程序,并根据键盘输入的不同来分别调用这三个步骤,再次是要实现定时功能,当时间减为零时,向8255的AL中输入06AH,使彩色发光二极管显示初始化。
(1) 提出方案
总开关是用来控制风扇的启动停止的,所以只需有两种状态,即开和关,所以,我选择用实验箱左下角的K1来实现这一功能。为了能显示风扇的转动,我选用8255和实验箱左上角的S双色灯来显示风扇的转动。为了实现定时功能,我选用可编程定时器芯片8253定时,可编程中断控制器8259产生中断,用中断程序来控制定时。由于定时要能显示时间及风扇转动时要用键盘控制风速等,所以还需要键盘显示接口芯片8279。
(2) 方案论证
1) 用8255和彩灯模拟风扇的转动,所以,可以将8255的B口设为工作在方式0,输出状态,然后通过输出不同二进制数来控制彩灯的显示,通过循环右移使彩灯循环显示来实现风扇转动的模拟。
2) 用左下角K1控制风扇的转动与停止,所以,可将8255A口设为方式0,输入状态,来读取开关的状态,然后在程序中判断输入的是1还是0,进而控制风扇的转动与停止。
3) 为了实现定时的功能,可以用8253的分频功能,将输入的脉冲信号分频,然后输入到8259的INT0以产生周期为1s的中断,在中断服务程序中来实现时间的递减,当减到0时就将风扇停止,这样就实现了定时功能了。
4) 为了实现三级风速的选择和定时功能、定时时间的变化显示等功能,需要8279的键盘显示功能,还需要键盘的数字键来实现定时时间的设定。最后就是用数码管显示时间的变化了。
1.3 实验环境
·硬件环境:AEDK实验箱,PC机。
·软件环境:LCA88ET应用软件。
沈阳航空航天大学课程设计报告 第2章 详细设计方案
第2章 详细设计方案
2.1 硬件电路设计
硬件电路由键盘显示接口芯片8279构成,如图2.1所示。
K1
Pa0
8255
Pb0 …… Pb7
cs
8279
Clk1 out1
Gate1 8253 clk0
Out0 cs gate0
Int0
8259 cs
200~207
210~217
220~227
228~22f
DR4…DR1…DY4…DY1
cs
Pc0
Pc3
脉冲源
LED显示 JING
键盘输入
图2.1 硬件电路连线图
8279是可编程设置型键盘/显示芯片,其特点是:(1)可同时进行键盘扫描及文字显示;(2)键盘扫描模式; (3)右边进入或左边进入,16字符或8字符显示。8255是可编程并行接口芯片,A口工作在方式0,输入;B口工作在方式0,输出;C口工作在方式0,输出;8253将脉冲源分频,产生周期为1s的脉冲信号,驱动8259产生周期为1s的中断。8255、8259、8253、8279的端口地址分别接210H-217H、220H-227H、200H-207H、228H-22FH。
2.2 主程序设计
主程序流程图如图2.2所示
图2.2 主程序流程图
2.3 功能选择模块的设计与实现
利用8279显示芯片显示倒计时,当数码管变为000时风扇停止转动。如图2.3.1所示
图2.3.1 功能选择模块流程图
沈阳航空航天大学课程设计报告 第3章 结果测试及分析
第3章 结果测试及分析
3.1 结果测试
编译并连接程序,然后全速运行,在数码管上就显示000。此时双色彩灯是初始状态,即只有一个灯是红的,其余三个灯都是绿色。然后,将开关K1向上扳去,此时8255的PA0口输入高电平,发现双色彩灯循环亮红灯,这样,当以一定的速度循环点亮四个灯,就会模拟出风扇的转动了。在风扇转动时,按下键盘上的A、B、C键,则彩灯会分别以不同的速度循环点亮红色(风速依次变大),这样就实现了通过键盘实现三级风速的选择功能了。当风扇在某一风速下转动时,按下D键,则进入定时状态,接着只需按下键盘上的数字键,设定好定时的时间,然后再按下D键,风扇就将在设定的时间内转动,并且在数码管上显示时间的变化,逐渐减少,当减到0时,风扇就将停止转动。这就是定时功能的实现。
3.2 结果分析
开始运行时,发现双色彩灯并不是按理想顺序逐渐点亮红色,后来,检查程序发现并没有错,最后,检查硬件连线时发现,8255B口得导线与双色灯的接口连接顺序错了,调整了连接顺序后彩灯理想的顺序循环点亮了。
实验结果基本实现了课设的要求,虽然有些问题和程序还会有些不稳定,但是所要求的功能都实现了,那些问题我会在以后进行完善 。
沈阳航空航天大学课程设计报告 附 录
参考文献
[1]王爱英.计算机组成与设计 [M] 北京:教育出版社, 2003
[2]王中民.微型计算机原理 [M] 西安: 西安电子科技大学出版社, 2007
[3]杨素行.微型计算机系统原理及应用 [M] 北京: 清华大学出版社, 1996
[4]张雪兰.汇编语言程序设计 [M] 北京: 清华大学出版社, 2006
附 录
data segment
isend db 0
n0 db 0
n1 db 0
n2 db 0
keykind db 0
oldkey db 0
kind db 0
isstop db 0
numbers db 3fh,6,5bh,0,0,0,0,0,0,0
data ends
code segment
assume cs:code,ds:data
main:
cli
mov ax,cs
mov ds,ax
mov kind,0
mov keykind,0ah
mov oldkey,0ah
mov kind,06
mov isstop,0
mov isend,0
mov n0,0
mov n1,0
mov n2,0
call initnumbers
call init8255
call init8259
call init8253
call modifyint
mov dx,212h
mov al,0
out dx,al
call cleardevice
call display
mov al,0
mov dx,22ah
out dx,al
mov al,30h
out dx,al
mov al,6ah
sti
dowhat:
push ax
dowait:
mov dx,210h
in al,dx
test al,1
jz dowait
pop ax
call readakey
cmp keykind,0ah
jnz a1
mov kind,2
call gotonext
jmp aa
a1:
cmp keykind,0bh
jnz a2
mov kind,1
call gotonext
jmp aa
a2:
cmp keykind,0ch
jnz a3
mov kind,0
call gotonext
jmp aa
a3:
cmp keykind,0dh
jnz a4
push ax
mov dx,212h ;c口给0
mov al,0
out dx,al
pop ax
mov isstop,0
push ax
mov al,oldkey
mov keykind,al
call reading
mov dx,212h
mov al,0ffh
out dx,al
pop ax
sti ;开中断,进入中断程序计时
jmp aa
a4:
cmp keykind,0eh
jnz aa
push ax
mov al,oldkey
mov keykind,al
pop ax
aa:
jmp dowhat
gotonext:
mov dx,211h
out dx,al
ror al,1
ror al,1
continue:
cmp kind,2
jnz mm1
call speed2
jmp mm3
mm1:
cmp kind,1
jnz mm2
call speed1
jmp mm3
mm2:
cmp kind,0
jnz mm3
call speed0
mm3:
push ax
mm33:
cmp isstop,0
jz mm4
mov dx,211h
mov al,0ffh
out dx,al
mov dx,210h
in al,dx
test al,1
jnz mm33
mov isstop,0
cli
mm4:
pop ax
ret
readakey: ;读键盘
push ax
mov al,keykind
mov oldkey,al
mov dx,22ah
in al,dx
and al,0fh
cmp al,0
jz gotoexit ;没按键就直接返回
mov al,40h
mov dx,22ah
out dx,al
mov dx,228h
in al,dx
mov keykind,al
gotoexit:
pop ax
ret
speed1:
push cx
mov cx,18000
sp1:
loop sp1
pop cx
ret
speed2:
push cx
mov cx,50000
sp2:
loop sp2
pop cx
ret
speed0:
push cx
mov cx,8000
sp0:
loop sp0
pop cx
ret
readisd:
key: ;读键盘,是D键返回
mov dx,22ah
in al,dx
and al,0fh
cmp al,0
jz key
mov al,40h
out dx,al
mov dx,228h
in al,dx
cmp al,0dh
jnz key
ret
reading: ;计时时间输入
push ax
mov n0,0
mov n1,0
mov n2,0
call readanumber
mov n0,al
call display
call readanumber
cmp al,0dh
jz readexit
mov ah,n0
mov n0,al
mov n1,ah
call display
call readanumber
cmp al,0dh
jz readexit
mov ah,n0
mov n0,al
mov al,n1
mov n1,ah
mov n2,al
call display
call readisd
readexit:
pop ax
ret
readanumber:
key2:
mov dx,22ah
in al,dx
and al,0fh
cmp al,0
jz key2
mov al,40h
out dx,al
mov dx,228h
in al,dx
ret
initnumbers:
push bx
mov bx,offset numbers ;初始化数码管显示数字表0-9
mov byte ptr[bx],3fh
mov byte ptr[bx+1],6
mov byte ptr[bx+2],5bh
mov byte ptr[bx+3],4fh
mov byte ptr[bx+4],66h
mov byte ptr[bx+5],6dh
mov byte ptr[bx+6],7dh
mov byte ptr[bx+7],7
mov byte ptr[bx+8],7fh
mov byte ptr[bx+9],6fh
pop bx
ret
display: ;从左到右依次在三个数码管上显示数字
call cleardevice
mov bx,offset numbers
mov al,80h
mov dx,22ah
out dx,al
mov al,n0
xor ah,ah
add bx,ax
mov al,[bx]
mov dx,228h
out dx,al
mov bx,offset numbers
mov al,81h
mov dx,22ah
out dx,al
mov dx,228h
mov al,n1
xor ah,ah
add bx,ax
mov al,[bx]
out dx,al
mov bx,offset numbers
mov al,82h
mov dx,22ah
out dx,al
mov dx,228h
mov al,n2
xor ah,ah
add bx,ax
mov al,[bx]
out dx,al
ret
intcount:
push ax
push bx
push dx
cmp n0,0
jz next1
dec n0
jmp next4
next1:
mov n0,9
cmp n1,0
jz next2
dec n1
jmp next4
next2:
mov n1,9
cmp n2,0
jz next3
dec n2
jmp next4
next3:
mov n2,9
next4:
cmp n0,0
jnz next5
cmp n1,0
jnz next5
cmp n2,0
jnz next5
mov isstop,1
mov dx,212h
mov al,0
out dx,al
next5:
call display
pop dx
pop bx
pop ax
iret
init8255:
mov al,90h
mov dx,213h
out dx,al
ret
init8259:
mov al,13h
mov dx,220h
out dx,al
mov dx,221h
mov al,30h
out dx,al
mov al,3
out dx,al
mov al,0feh
out dx,al
ret
modifyint:
push ds
push bx
push ax
xor ax,ax
mov ds,ax
mov bx,30h*4
mov ax,offset intcount
mov [bx],ax
mov ax,8100h
mov [bx+2],ax
pop ax
pop bx
pop ds
ret
init8253:
push ax
mov al,35h
mov dx,203h
out dx,al
mov ax,0ffffh
mov dx,200h
out dx,al
mov al,ah
out dx,al
mov al,75h
mov dx,203h
out dx,al
mov ax,27
mov dx,201h
out dx,al
mov al,ah
out dx,al
pop ax
ret
cleardevice: ;清空显示内存
push ax
push dx
mov al,0c1h
mov dx,22ah
out dx,al
wait1:
mov dx,22ah
in al,dx
test al,80h
jnz wait1
pop dx
pop ax
ret
code ends
end main
沈阳航空航天大学课程设计报告
课程设计总结:
通过这次课程设计,我也发现了许多在学习中没有发现和注意到的缺点和不足,在调试运行时,程序不是很稳定,这很有可能是我对软件和硬件的结构和功能的了解还不是很透彻,加之第一次用汇编语言编写程序,编写出的程序来多多少少有一些缺陷,所以,这可能是运行时出现不稳定的主要原因;再有,调试程序时,一些调试方法不够熟练,很多调试方法和工具都不知道,有时一个很简单的错误费很大劲才能找出来。在本次课程设计中,老师和同学给予了我无私的帮助,这次课设我能顺利的完成,与大家的帮助是分不开的,在这要感谢,我会在以后的学习及工作中努力完善自己的。
正是此次课程设计,让我对所学的微机原理知识有了更深的理解,对各芯片,特别是8255、8259、8253、8279等常用芯片的功能和使用方法有了更加深入的了解,也能相对熟练的运用这些芯片来实现各种功能。使我明白了许多当时在课堂上并没有理解的疑问,在用汇编语言编写程序时,使我更加熟悉各种语句的作用和使用,为我以后程序语言与硬件结合打下了坚实的基础。我觉得这次课程设计使得我综合地运用了我所学习的知识,令知识的脉络在我的脑中逐渐清晰,所以说学以致用才能起到最好的学习效果。
指导教师评语:
指导教师(签字): 年 月 日
课程设计成绩
展开阅读全文