微机原理课程设计电子时钟.docx
《微机原理课程设计电子时钟.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计电子时钟.docx(15页珍藏版)》请在冰豆网上搜索。
微机原理课程设计电子时钟
山东理工大学计算机学院
课程设计
(微机原理及接口技术)
班级
计科0702
姓名
张赛龙
学号
0712106457
指导教师
王志强
二○一○年七月十三日
课程设计任务书及成绩评定
课题名称
电子时钟设计
Ⅰ、题目的目的和要求:
学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
Ⅱ、设计进度及完成情况
日期
内容
2010.7.4-7.6
选取参考书,查阅有关文献资料,初步设计。
2010.7.7~7.8
创建相关流程图、原理图,编写源程序
2010.7.12
调试程序并记录调试中的问题。
2010.7.13
系统测试,演示设计成果。
2010.7.14
整理课程设计说明书,并上交
主要参考文献及资料
[1]戴梅萼等.微型计算机技术及应用.清华大学出版社出版,2008.2
[2]徐建平,成贵学,朱萍等主编,微机原理与接口技术,北京航空工业出版社,2010
[3]马金忠编,微机原理及应用学习指导,重庆大学出版社,2009
Ⅳ、成绩评定:
设计成绩:
(教师填写)
指导老师:
(签字)
二〇一〇年七月十三日
第一章概述
1.1本课程设计意义
课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
《微机原理与接口技术》是一门重要的专业课。
1.2课题意义和设计目标
学习和掌握计算机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。
通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。
该系统的要求利用8253定时器设计一个具有时、分、秒显示的电子时钟,并定义一个启动键,当按下该键时时钟从当前设定值(可在显示缓冲区中予置)开始走时。
第二章系统分析与设计
2.1系统设计
该系统是一个简单的利用8253定时器、8255可并行通信接口和中断控制器8259设计的电子时钟系统,在该系统中设有一个启动键,启动键未按下时,显示初始化界面“HELLO”;当按下启动键时,8253定时器开始计时(8253的初值为10000,接1MHz的脉冲,即当8253计满100时正好是1S),当计时计满100时,8259便产生一次中断,在LED显示器便显示系统预先设计好的初始值“02.59.55”便开始从秒位开始加1,当加到10S时,10s位加1,加到60S时分位加1,同时秒位清零。
该系统的主要工作原理为:
在主程序中,要对各个用到的芯片进行初始化,在对8253进行初始化时,使它用方式2,每10ms产生一次脉冲。
在系统总8253的输入时钟频率为1MHZ,定时常数设为10000,则定时周期正好为10ms。
由于8253的定时输出与8259的IR0相连,所以,系统中每隔10ms便由8253对8259产生一次中断请求,即每隔10ms执行一次中断处理程序。
本系统将与时间密切相关的两个模块即显示模块和计时模块放在中断处理程序中,这样,就保证了LED的数字每隔10ms得到一次刷新,从而保证了数字显示的稳定。
中断处理程序完成计时功能要依靠两个方面,因为中断处理程序是每10ms执行一次,但计时并不是一10ms为单位进行的,而是以秒为单位进行的,所以,计时功能的事项一方面要利用10ms这个基准时间单位,另一方面要借助于一个计数单元。
计数单元的初始值为100,每进行一次中断,便使计数单元的内容减1,也就是说,每10ms作一次计数。
每当计数单元从100减为0时,说明已经经过了10ms*100=1s时间,于是使秒位加1。
秒位加1之后,又须判断由此而可能引起的进位,如有进位,则应实现正确的修改。
修改完以后,再将LED显示一遍。
第三章程序设计流程图
3.1程序设计原理图
3.2程序流程图
第四章程序源代码
codesegment
assumecs:
code,ds:
code
start:
movax,cs
movds,ax
movbp,0064h;设置计数初值
jmpstart1
portbitequ208h
portsegequ209h
start1:
movdx,20bh
moval,10000001b
outdx,al;8255初始化
moval,34h
movdx,203h
outdx,al;8253写控制字
movdx,200h
movax,10000d
outdx,al
moval,ah
outdx,al;8253初始化
moval,13h;8259初始化
movdx,210h
outdx,al;ICW1初始化
moval,08h
movdx,211h
outdx,al;ICW2初始化
moval,01h
outdx,al;ICW4初始化
inal,dx
andal,0feh
outdx,al;OCW1打开非屏蔽位IR5被屏蔽************************************************************
pushds
movax,0
movds,ax
movax,offsetintr
movds:
wordptr[4*8],ax
movax,cs
movds:
wordptr[4*8+2],ax;设置中断向量
popds
************************************************************
ab:
movdx,20ah;主程序开始
inal,dx
andal,1
cmpal,01h;判断时钟是否启动
jzintr1;若启动,则开中断
callshowhello;没启动,则转显示
cli;关中断
jmpab
intr1:
sti;开中断
jmpab;检测时钟状态
************************************************************
;初始界面显示程序
showhello:
leabx,TABLE
leadi,BUFDA
movcl,11011111b;位码
next:
movdx,208h
moval,cl
outdx,al;输出位码
moval,[di+06];取段码
xlat;把al+bl放到al
movdx,209h;输出段码
outdx,al
pushcx
movcx,30h
delay1:
loopdelay1;软件延迟
popcx
cmpcl,11111110b;判断是否扫完一遍
jzaaaa;显示完一遍则返回
incdi
rorcl,1;循环右移一位
jmpnext
aaaa:
ret
************************************************************
intrprocnear;中断处理程序
pushsi
pushax;保存寄存器的内容
decbp;计数单元减1
jnzdisplay;如未计到100,则直接转显示
movdi,offsetBUFDA
movbp,0064h;计数单元设置初值
moval,[di+05]
incal;秒位加1
mov[di+05],al
cmpal,0ah;是否引起进位
jnzdisplay;无进位则转显示
moval,00
mov[di+05],al
moval,[di+04]
incal;有进位则本位清零,前一位加1
mov[di+04],al
cmpal,06;是否满60秒
jnzdisplay;否,则转显示
moval,00
mov[di+04],al
moval,[di+03]
incal;是则本位清零,而分位加1
mov[di+03],al
cmpal,0ah;是否引起分位有进位
jnzdisplay;否,则转显示
moval,00
mov[di+03],al
moval,[di+02]
incal
mov[di+02],al;有进位,则本位清零,前一位加1
cmpal,06;是否满60分
jnzdisplay;否,则转显示
moval,00
mov[di+02],al
moval,[di+01]
incal;有进位,则本位清零,前一位加1
mov[di+01],al
cmpal,0ah;是否引起时位有进位
jnzdisplay;否,则转显示
moval,00
mov[di+01],al
display:
calldispl;调用显示程序
movdx,210h
moval,20h
outdx,al;手动结束中断
popax
popsi
iret
intrendp;被中断处理程序调用的显示程序
displprocnear
pushdx
pushcx
pushbx
pushsi
movcx,0006;显示位数
movbx,offsetTABLE
movsi,offsetBUFDA
movah,11011111b
displ1:
movdx,portbit//portbitequ208H
moval,0ffh
outdx,al;关显示
pushcx
movcx,0100h
wait1:
loopwait1;软件延时
movdx,portseg//portsegequ209H
moval,[si]
xlat;转换
outdx,al;输出段码
movdx,portbit
moval,ah
outdx,al;输出位码
movcx,0100h
wait2:
loopwait2;延时
popcx
rorah,1
incsi
loopdispl1
popsi
popbx
popcx
popdx
ret
displendp
TABLE:
db3fh;“0”的段码
db06h;“1”的段码
db5bh;“2”的段码
db4fh;“3”的段码
db66h;“4”的段码
db6dh;“5”的段码
db7dh;“6”的段码
db07h;“7”的段码
db7fh;“8”的段码
db6fh;“9”的段码
db00h;
db76h;“H”的段码
db79h;“E”的段码
db38h;“L”的段码
db38h;“L”的段码
db5ch;“o”的段码
BUFDA:
db0,2,5,9,5,7,11,12,13,14,15,16
codeends
endstart
第五章调试过程中的问题及系统测试情况
本次课程设计过程中,碰到了不少的问题,但最终通过互联网和查阅资料,都一一解决掉,获益匪浅,纠正了以前自己认识上的不足之处,增强了自己程序设计能力。
最终系统能够成功运行。
第六章心得体会
经过两周努力,在指导老师和同学的帮助下,终于如期完成了该电子时钟的课程设计。
当然在课程设计的过程中遇到了许多问题,但是经过查阅有关资料和向老师、同学请教后,还是一一解决了。
系统设计的开始几天的时间,没有什么大的进展,仅仅是初始界面就调试了很长时间才成功,以后的几天的时间开始调中断程序,程序中一旦有了中断,调试就困难了,调中断调了好几天,难度挺大的,任何一个初始化的失误都可能使你的程序不正常,所以写程序的时候一定要仔细,考虑问题一定要全面,最后使各部分捏成一整体,让整个程序顺利运行,这部分不是很难,所以只用半天就调完了。
通过本次课程设计,使我在课堂中学到的东西充分的融入到实践当中。
进一步的熟悉了可并行通信接口8255、计数器/定时器8253及中断控制器的编程原理和7段LED数码管显示器的工作原理,为以后独立的设计系统提供了丰富的实践经验。