1、 沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:微机系统综合课程设计 课程设计题目:模拟电风扇工作 院(系):计算机学院 专 业:计算机科学与技术 班 级: 学 号: 姓 名: 指导教师: 完成日期: 沈阳航空航天大学课程设计报告 目 录 第1章 总体设计方案 1 1.1 设计原理 1 1.2 设计思路 1 1.3 实验环境 2 第2章 详细设计方案 3 2.1 硬件电路设计 3 2.2 主程序设计
2、4 2.3 功能选择模块的设计与实现 5 第3章 结果测试及分析 6 3.1 结果测试 6 3.2 结果分析 6 参考文献 7 附 录 8 -16- 沈阳航空航天大学课程设计报告 第1章 总体设计方案 第1章 总体设计方案 1.1 设计原理 根据课程设计任务书的要求,要求实现模拟电风扇的工作,电风扇的开关利用输入量来控制,用可编程并行接口芯片8255的输入端接收这一信号,双色灯模拟风扇转动方向,可以设计三个变换延时的子程序,用小键盘ABC,来调用以控制不同的风速,定时显示利用受可编程定时器
3、芯片8253控制的可编程中断控制器8259给可编程并行接口芯片8255和键盘显示接口芯片8279产生每秒钟一次的中断,控制彩色发光二极管和LED的显示。 1.2 设计思路 采用汇编语言程序设计的方法结合硬件电路设计方法,利用AEDK实验箱上已有芯片8259,8255,8253,8279来实现模拟电风扇工作。首先需要一个总开关,用来控制电风扇的开关,可以用8255的输入端接收这一信号, 其次需要实现的功能是三级风速的变换,可以设计三个变换延时的子程序,并根据键盘输入的不同来分别调用这三个步骤,再次是要实现定时功能,当时间减为零时,向8255的AL中输入06AH,使彩色发光二极管显示初始化。
4、 (1) 提出方案 总开关是用来控制风扇的启动停止的,所以只需有两种状态,即开和关,所以,我选择用实验箱左下角的K1来实现这一功能。为了能显示风扇的转动,我选用8255和实验箱左上角的S双色灯来显示风扇的转动。为了实现定时功能,我选用可编程定时器芯片8253定时,可编程中断控制器8259产生中断,用中断程序来控制定时。由于定时要能显示时间及风扇转动时要用键盘控制风速等,所以还需要键盘显示接口芯片8279。 (2) 方案论证 1) 用8255和彩灯模拟风扇的转动,所以,可以将8255的B口设为工作在方式0,输出状态,然后通过输出不同二进制数来控制彩灯的显示,通过循环右移使彩灯循环显示来实
5、现风扇转动的模拟。 2) 用左下角K1控制风扇的转动与停止,所以,可将8255A口设为方式0,输入状态,来读取开关的状态,然后在程序中判断输入的是1还是0,进而控制风扇的转动与停止。 3) 为了实现定时的功能,可以用8253的分频功能,将输入的脉冲信号分频,然后输入到8259的INT0以产生周期为1s的中断,在中断服务程序中来实现时间的递减,当减到0时就将风扇停止,这样就实现了定时功能了。 4) 为了实现三级风速的选择和定时功能、定时时间的变化显示等功能,需要8279的键盘显示功能,还需要键盘的数字键来实现定时时间的设定。最后就是用数码管显示时间的变化了。 1.3 实验环境 ·硬件
6、环境: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~
7、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的端口地址分
8、别接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 结果测试 编译并连接程序
9、然后全速运行,在数码管上就显示000。此时双色彩灯是初始状态,即只有一个灯是红的,其余三个灯都是绿色。然后,将开关K1向上扳去,此时8255的PA0口输入高电平,发现双色彩灯循环亮红灯,这样,当以一定的速度循环点亮四个灯,就会模拟出风扇的转动了。在风扇转动时,按下键盘上的A、B、C键,则彩灯会分别以不同的速度循环点亮红色(风速依次变大),这样就实现了通过键盘实现三级风速的选择功能了。当风扇在某一风速下转动时,按下D键,则进入定时状态,接着只需按下键盘上的数字键,设定好定时的时间,然后再按下D键,风扇就将在设定的时间内转动,并且在数码管上显示时间的变化,逐渐减少,当减到0时,风扇就将停止转动。
10、这就是定时功能的实现。 3.2 结果分析 开始运行时,发现双色彩灯并不是按理想顺序逐渐点亮红色,后来,检查程序发现并没有错,最后,检查硬件连线时发现,8255B口得导线与双色灯的接口连接顺序错了,调整了连接顺序后彩灯理想的顺序循环点亮了。 实验结果基本实现了课设的要求,虽然有些问题和程序还会有些不稳定,但是所要求的功能都实现了,那些问题我会在以后进行完善 。 沈阳航空航天大学课程设计报告 附 录 参考文献 [1]王爱英.计算机组成与设计 [M] 北京:教育出版社, 2003 [2]王中民.
11、微型计算机原理 [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 d
12、b 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
13、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,22
14、ah 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:
15、 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 a
16、l,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,
17、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 a
18、l,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
19、 ;没按键就直接返回 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:
20、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
21、 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
22、 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
23、 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 byt
24、e 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: ;从左到右依次在三个数码管上显示
25、数字 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 mo
26、v 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,
27、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
28、 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
29、 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,2
30、03h 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 cod
31、e ends end main 沈阳航空航天大学课程设计报告 课程设计总结: 通过这次课程设计,我也发现了许多在学习中没有发现和注意到的缺点和不足,在调试运行时,程序不是很稳定,这很有可能是我对软件和硬件的结构和功能的了解还不是很透彻,加之第一次用汇编语言编写程序,编写出的程序来多多少少有一些缺陷,所以,这可能是运行时出现不稳定的主要原因;再有,调试程序时,一些调试方法不够熟练,很多调试方法和工具都不知道,有时一个很简单的错误费很大劲才能找出来。在本次课程设计中,老师和同学给予了我无私的帮助,这次课设我能顺利的完成,与大家的帮助是分不开的,在这要感谢,我会在以后的学习及工作中努力
32、完善自己的。 正是此次课程设计,让我对所学的微机原理知识有了更深的理解,对各芯片,特别是8255、8259、8253、8279等常用芯片的功能和使用方法有了更加深入的了解,也能相对熟练的运用这些芯片来实现各种功能。使我明白了许多当时在课堂上并没有理解的疑问,在用汇编语言编写程序时,使我更加熟悉各种语句的作用和使用,为我以后程序语言与硬件结合打下了坚实的基础。我觉得这次课程设计使得我综合地运用了我所学习的知识,令知识的脉络在我的脑中逐渐清晰,所以说学以致用才能起到最好的学习效果。 指导教师评语: 指导教师(签字): 年 月 日 课程设计成绩






