微机原理课设电风扇徐直.docx
《微机原理课设电风扇徐直.docx》由会员分享,可在线阅读,更多相关《微机原理课设电风扇徐直.docx(22页珍藏版)》请在冰点文库上搜索。
微机原理课设电风扇徐直
沈阳航空航天大学
课程设计报告
课程设计名称:
微机系统综合课程设计
课程设计题目:
模拟电风扇动作
院(系):
计算机学院
专业:
计算机科学与技术
班级:
84010102
学号:
2008040101038
姓名:
徐直
指导教师:
毛艳娥
完成日期:
2011年7月15日
目录
第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
第1章总体设计方案
1.1设计原理
利用芯片8259,8255,8253,8279,分别控制中断,彩色发光二极管,时钟,和LED显示。
用受8253控制的8259给8255和8279产生每秒钟一次的中断,控制彩色发光二极管和LED的显示
1.2设计思路
首先需要一个总开关,用来控制电风扇的开关,可以用8255的输入端接收这一信号,信号为1时进入循环,此时彩色发光二极管通过红绿色灯显示风扇的转动效果,不为1时执行下一步。
其次需要实现的功能是三级风速的变换,可以设计三个变换延时的子程序,并根据键盘输入的不同来分别调用这三个步骤。
再次是要实现定时功能,用8253和8259实现这一功能并不困难,当时间减为零时,向8255的AL中输入O6AH,使彩色发光二极管显示初始化。
还有就是彩色发光二极管的显示问题,只需将8255中控制彩灯显示的数据起始值设为01101010,然后循环左移两位即可。
(1)提出方案
总开关是用来控制风扇的启动停止的,所以只需有两种状态,即开和关,所以,我选择用实验箱右下角的开关来实现这以功能。
为了能显示风扇的转动,我选用8255和实验箱右上角的彩灯来显示风扇的转动。
为了实现定时功能,我选用8253定时,8259产生中断,用中断程序来控制定时。
由于定时时要能显示时间及风扇转动时要有风速等一些功能的选择,所以还需要8279键盘显示接口芯片。
(2)方案论证
1)用8255和彩灯模拟风扇的转动,所以,可以将8255的B口设为工作在方式0,输出状态,然后通过输出不同二进制数来控制彩灯的红绿显示,通过循环移位使彩灯循环显示来实现风扇转动的模拟。
2)用右下角的开关控制风扇的转动与停止,所以,可将8255A口设为方式0,输入状态,来读取开关的状态,然后在程序中判断输入的是1还是0,进而控制风扇的转动与停止。
3)为了实现定时的功能,可以用8253的分频功能,将输入的脉冲信号分频,以输出1HZ的脉冲信号,然后输入到8259的INT0以产生周期为1s的终端,即每秒钟进一次中断,在中断服务程序中来实现时间的递减,当减到0时就将风扇停止,这样就实现了定时功能了。
4)为了实现三级风速的选择和定时功能、定时时间的变化显示等功能,需要8279的键盘显示功能,在键盘上设置三个键分别控制三级风速,在设置一个按键来控制定时功能的选择,当按下定时功能键后,还需要键盘的数字键来实现定时时间的设定。
最后就是用数码管显示时间的变化了。
1.3实验环境
·硬件环境:
AEDK实验箱,PC机。
·软件环境:
LCA88ET应用软件。
第2章详细设计方案
2.1硬件电路设计
硬件电路由键盘显示接口芯片8279构成,如图2.1所示。
图2.1硬件电路连线图
8279是可编程设置型键盘/显示芯片,其特点是:
(1)可同时进行键盘扫描及文字显示;
(2)键盘扫描模式;(3)传感器扫描模式;(4)激发输入模式;(5)8乘8键盘FIFO;(6)具有接点消除抖动,2键锁定及N键依次读出模式;(7)双排8位数或双排16位数显示器;(8)右边进入或左边进入,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.3功能选择模块的设计与实现
图2.3.1功能选择模块流程图
第3章结果测试及分析
3.1结果测试
编译并连接程序,然后全速运行,在数码管上就显示计时器的时间,开始时是全0。
此时双色彩灯是初始状态,即只有一个灯是红的,其余三个灯都是绿色。
然后,将开关K1向上扳去,时8255的PA0口输入高电平,此时发现双色彩灯还是循环亮红灯,并且只有一个灯是红色的,其余都是绿色,这样,当以一定的速度循环点亮四个灯,就会模拟出风扇的转动了。
在风扇转动时,按下键盘上的A、B、C键,则彩灯会分别以不同的速度循环点亮红色,这样就实现了通过键盘实现三级风速的选择功能了。
当风扇在某一风速下转动时,按下D键,则进入定时状态,接着只需按下键盘上的数字键,设定好定时的时间,然后再按下D键,风扇就将在设定的时间内转动,并且在数码管上显示时间的变化,逐渐减少,当减到0时,风扇就将停止转动。
这就是定时功能的实现。
3.2结果分析
开始运行时,发现双色彩灯并不是按理想顺序逐渐点亮红色,后来,检查程序发现并没有错,最后,检查硬件连线时发现,8255B口得导线与双色灯的借口连接顺序错了,调整了连接顺序后彩灯理想的顺序循环点亮了。
风扇正常运行了,但是在定时时发现数码管上的时间没有变化,过了定时的时间后,风扇也没有停止,开始以为程序问题,单步运行后发现一切正常,然后检查数码管显示也没发现问题,这时将接在INT0上的导线拔下,接在发光二极管上发现没有电流,最后,断定是8253并没有产生脉冲信号给8259,导致中断服务程序无法进入,使得计时功能失效,所以才会出现刚才的问题,于是,我测试了几根好用的导线从新将8253的连线连一遍,再运行时定时功能就好用了。
实验结果基本实现了课设的要求,虽然有些问题和程序还会有些不稳定,但是所要求的功能都实现了,那些问题我会在以后进行完善。
参考文献
[1]王爱英.计算机组成与设计[M]北京:
教育出版社,2003
[2]杨素行.微型计算机系统原理及应用[M]北京:
清华大学出版社,1996
[3]张雪兰.汇编语言程序设计[M]北京:
清华大学出版社,2006
[4]龚尚福.微机原理与接口技术[M]西安:
西安电子科技大学出版社,2003
[5]王中民.微型计算机原理[M]西安:
西安电子科技大学出版社,2003
[6]沈美明,温冬婵.IBM-PC汇编语言程序设计[M]北京:
清华大学出版社,2001
附录
datasegment
isenddb0
n0db0
n1db0
n2db0
keykinddb0
oldkeydb0
kinddb0
isstopdb0
numbersdb3fh,6,5bh,0,0,0,0,0,0,0
dataends
codesegment
assumecs:
code,ds:
data
main:
cli
movax,cs
movds,ax
movkind,0
movkeykind,0ah
movoldkey,0ah
movkind,06
movisstop,0
movisend,0
movn0,0
movn1,0
movn2,0
callinitnumbers
callinit8255
callinit8259
callinit8253
callmodifyint
movdx,212h
moval,0
outdx,al
callcleardevice
calldisplay
moval,0
movdx,22ah
outdx,al
moval,30h
outdx,al
moval,6ah
sti
dowhat:
pushax
dowait:
movdx,210h
inal,dx
testal,1
jzdowait
popax
callreadakey
cmpkeykind,0ah
jnza1
movkind,2
callgotonext
jmpaa
a1:
cmpkeykind,0bh
jnza2
movkind,1
callgotonext
jmpaa
a2:
cmpkeykind,0ch
jnza3
movkind,0
callgotonext
jmpaa
a3:
cmpkeykind,0dh
jnza4
pushax
movdx,212h;c口给0
moval,0
outdx,al
popax
movisstop,0
pushax
moval,oldkey
movkeykind,al
callreading
movdx,212h
moval,0ffh
outdx,al
popax
sti;开中断,进入中断程序计时
jmpaa
a4:
cmpkeykind,0eh
jnzaa
pushax
moval,oldkey
movkeykind,al
popax
aa:
jmpdowhat
gotonext:
movdx,211h
outdx,al
roral,1
roral,1
continue:
cmpkind,2
jnzmm1
callspeed2
jmpmm3
mm1:
cmpkind,1
jnzmm2
callspeed1
jmpmm3
mm2:
cmpkind,0
jnzmm3
callspeed0
mm3:
pushax
mm33:
cmpisstop,0
jzmm4
movdx,211h
moval,0ffh
outdx,al
movdx,210h
inal,dx
testal,1
jnzmm33
movisstop,0
cli
mm4:
popax
ret
readakey:
;读键盘
pushax
moval,keykind
movoldkey,al
movdx,22ah
inal,dx
andal,0fh
cmpal,0
jzgotoexit;没按键就直接返回
moval,40h
movdx,22ah
outdx,al
movdx,228h
inal,dx
movkeykind,al
gotoexit:
popax
ret
speed1:
pushcx
movcx,18000
sp1:
loopsp1
popcx
ret
speed2:
pushcx
movcx,50000
sp2:
loopsp2
popcx
ret
speed0:
pushcx
movcx,8000
sp0:
loopsp0
popcx
ret
readisd:
key:
;读键盘,是D键返回
movdx,22ah
inal,dx
andal,0fh
cmpal,0
jzkey
moval,40h
outdx,al
movdx,228h
inal,dx
cmpal,0dh
jnzkey
ret
reading:
;计时时间输入
pushax
movn0,0
movn1,0
movn2,0
callreadanumber
movn0,al
calldisplay
callreadanumber
cmpal,0dh
jzreadexit
movah,n0
movn0,al
movn1,ah
calldisplay
callreadanumber
cmpal,0dh
jzreadexit
movah,n0
movn0,al
moval,n1
movn1,ah
movn2,al
calldisplay
callreadisd
readexit:
popax
ret
readanumber:
key2:
movdx,22ah
inal,dx
andal,0fh
cmpal,0
jzkey2
moval,40h
outdx,al
movdx,228h
inal,dx
ret
initnumbers:
pushbx
movbx,offsetnumbers;初始化数码管显示数字表0-9
movbyteptr[bx],3fh
movbyteptr[bx+1],6
movbyteptr[bx+2],5bh
movbyteptr[bx+3],4fh
movbyteptr[bx+4],66h
movbyteptr[bx+5],6dh
movbyteptr[bx+6],7dh
movbyteptr[bx+7],7
movbyteptr[bx+8],7fh
movbyteptr[bx+9],6fh
popbx
ret
display:
;从左到右依次在三个数码管上显示数字
callcleardevice
movbx,offsetnumbers
moval,80h
movdx,22ah
outdx,al
moval,n0
xorah,ah
addbx,ax
moval,[bx]
movdx,228h
outdx,al
movbx,offsetnumbers
moval,81h
movdx,22ah
outdx,al
movdx,228h
moval,n1
xorah,ah
addbx,ax
moval,[bx]
outdx,al
movbx,offsetnumbers
moval,82h
movdx,22ah
outdx,al
movdx,228h
moval,n2
xorah,ah
addbx,ax
moval,[bx]
outdx,al
ret
intcount:
pushax
pushbx
pushdx
cmpn0,0
jznext1
decn0
jmpnext4
next1:
movn0,9
cmpn1,0
jznext2
decn1
jmpnext4
next2:
movn1,9
cmpn2,0
jznext3
decn2
jmpnext4
next3:
movn2,9
next4:
cmpn0,0
jnznext5
cmpn1,0
jnznext5
cmpn2,0
jnznext5
movisstop,1
movdx,212h
moval,0
outdx,al
next5:
calldisplay
popdx
popbx
popax
iret
init8255:
moval,90h
movdx,213h
outdx,al
ret
init8259:
moval,13h
movdx,220h
outdx,al
movdx,221h
moval,30h
outdx,al
moval,3
outdx,al
moval,0feh
outdx,al
ret
modifyint:
pushds
pushbx
pushax
xorax,ax
movds,ax
movbx,30h*4
movax,offsetintcount
mov[bx],ax
movax,8100h
mov[bx+2],ax
popax
popbx
popds
ret
init8253:
pushax
moval,35h
movdx,203h
outdx,al
movax,0ffffh
movdx,200h
outdx,al
moval,ah
outdx,al
moval,75h
movdx,203h
outdx,al
movax,27
movdx,201h
outdx,al
moval,ah
outdx,al
popax
ret
cleardevice:
;清空显示内存
pushax
pushdx
moval,0c1h
movdx,22ah
outdx,al
wait1:
movdx,22ah
inal,dx
testal,80h
jnzwait1
popdx
popax
ret
codeends
endmain
课程设计总结:
通过本次课程设计,是我对所学的微机原理知识有了更深的理解,对各芯片,特别是8255、8259、8253、8279等常用芯片的功能和使用方法有了更加深层的掌握,也能更加熟练的运用这些芯片来实现各种功能。
在用汇编语言编写程序时,使我更加熟悉各种语句的作用和使用发法,为我以后编写更加大型的汇编语言程序打下了坚实的基础。
但通过这次课程设计,我也发现了许多在学习中没有发现和注意到的缺点和不足,在连线时,不能很快的找到实验箱上的相应接口,这是我对实验箱和芯片不够熟悉导致的;还有就是,在调试运行时,程序很不稳定,这很有可能是我对软件和硬件的结构和功能还不是很透彻,加之第一次用汇编语言编写程序,不可能编写出高效又健壮的程序来,所以,这可能是运行时出现不稳定的主要原因;再有,调试程序时,一些调试方法不够熟练,很多调试方法和工具都不知道,但是,以后有机会我会多用相关软件编写汇编语言,这样就能更加熟练地使用软件使所编写的程序更加完美。
在本次课设中,老师给予了我无私的帮助,这次课设我能顺利的完成,与老师的帮助是分不开的,在这要感谢老师的谆谆教导,我不会辜负老师的期望,我会在以后的学习工作中努力完善自己的。
指导教师评语:
指导教师(签字):
年月日
课程设计成绩