微机原理与接口技术倒计电子时钟课程设计报告.docx
《微机原理与接口技术倒计电子时钟课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术倒计电子时钟课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
![微机原理与接口技术倒计电子时钟课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/4/9c46b51a-af58-4aea-aa2c-3cd8940dce08/9c46b51a-af58-4aea-aa2c-3cd8940dce081.gif)
微机原理与接口技术倒计电子时钟课程设计报告
微机原理与接口技术
课程设计报告
——倒计电子时钟
倒计电子时钟课程设计报告
一、设计题目:
倒计电子时钟
二、设计目的:
1、掌握多位计数器相连的设计方法。
2、掌握十进制、六十进制、二十四进制计数器的设计方法。
3、进一步掌握定时器的使用和编程方法。
4、进一步掌握中断处理程序的编程方法。
5、进一步掌握数码显示电路的驱动方法。
三、设计要求:
1.用时、分、秒计数显示功能,以24小时开始倒计时。
格式如下:
24:
60:
60由左向右分别为:
时、分、秒
2.具有重新调节开始时间为12:
60:
60,暂停,继续的功能。
四、设计环境:
伟福Lab6000通用微控制器实验系统实验仪以及伟福6000仿真模拟软件。
五、设计说明:
定时器每100us中断一次,在中断服务程序中,对中断次数进行计数,100us计数10000次就是1秒。
然后再对秒计数得到分和小时值,并送入显示缓冲区。
六、设计连接电路图:
1、电路连接图描述:
本实验利用8253做定时器,用定时器输出的脉冲控制8259产生中断
在8259中断处理程序中,对时、分、秒进行计数,在等待中断的循
环中用LED显示时间。
8253用定时器/计数器1,8253片选接CS4,地址为0C000H。
8253时钟
源CLK1接分频电路的F/64输出。
分频器的Fin接4MHz时钟。
8253的
GATE1接VCC。
8259中断INT0接8253的OUT1,片选接CS5,地址为0D000H。
显示电路的KEY/LEDCS接CS0,地址为08000H。
2、电路连接图如下:
七、设计程序框架图:
八、设计原理和步骤:
1.设计原理:
(1)、数字电路设计理论
(2)、时钟倒计数:
秒---60进制BCD码计数;分---60进制BCD码计数;时---24进制BCD码计数;开始时计数器显示的是初始化的时钟时间:
24:
60:
60。
时钟根据电路连接图时频的不同接法,其运行时间的快慢也会有所不同。
按不同的按钮其执行的功能也有所不同,整个计数器具有重新运行自己所设置的时间开始倒计时(这里的按钮键是:
9)、暂停(按钮是:
7)、继续(按钮是:
8)的功能。
并且功能键的位置也可根据自己的习惯在代码中进行相应的设置,如:
设重新运行设置的时间开始倒计时(按钮键是:
4)、暂停(按钮是:
5)、继续(按钮是:
6)。
2.设计步骤:
(1)、在有masm软件的计算机上进行设计编码。
(2)、对masm上的代码进行调试并进行修改。
运行。
(3)、把已在masm可运行的程序移植到EDA实验室的计算机wav6000软件上。
(4)、对程序进行编译,修改,直至编译通过。
并对选择的环境进行相应的设置。
编译通过截图如下:
(5)、根据电路连接图的描述和对应的连接图在试验箱中进行电路图的连接。
(6)、把计算机wav6000软件与试验箱相连接进行通信,可把程序代码导入8086cpu芯片中。
(7)、运行程序,在试验箱中按根据已设的按钮,观察其对应的显示信息。
看其是否有按预设的功能显示,并记录。
(8)、对电路进行不同的连接,并在代码进行相应的修改,看其显示的信息是否有发生相应的变化。
(9)、完成设计后,整理实验仪器。
书写设计报告。
九:
设计结论和心得:
1.结论:
实验达到了实验的要求和目的。
(1)、按按钮7可暂停,按按钮8可使已暂停的计数继续倒计时,按按钮9可使正在运行的倒计时从12:
60:
60开始进行倒计时。
(2)、对按钮的位置修改也可达到预期的效果,对倒计时的时频进行修改,也可加快或减慢其倒计时的速度。
(3)、对电路图的接口进行修改和相应的代码修改也可达到相同的显示结果。
2.心得体会:
通过这次倒计电子时钟的设计和实现,掌握了六十进制和二十四进制数字电路的设计,同时复习了wav6000这个软件和试验箱的连接应用。
由于汇编原理的有些知识掌握不牢固,实验过程中遇到了很多困难,但在老师和同学的帮助下,顺利完成了此次的设计,同时也借此机会复习了汇编原理的知识,提高了自己动手能力。
希望以后能多做一些这样的设来验证已学过知识,达到学以致用的效果。
十、附加代码:
CONTROLequ0a003h
COUNT0equ0a000h
COUNT1equ0a001h
COUNT2equ0a002h
md8255equ82h;8255工作方式
PA8255equ8001h;8255PA口输出地址
CTL8255equ8003h;8255控制口地址
OUTBITequ08002h;位控制口
OUTSEGequ08004h;段控制口
IN_KEYequ08001h;键盘读入口
ICW1equ00010011b;单片8259,上升沿中断,要写ICW4
ICW2equ00100000b;中断号为20H
ICW4equ00000001b;工作在8086/88方式
OCW1equ11111110b;只响应INT0中断
CS8259Aequ0d000h;8259地址
CS8259Bequ0d001h
datasegment
CNTdb0
LEDBufdb6dup(?
);显示缓冲
Numdb1dup(?
);显示的数据
DelayTdb1dup(?
)
Hourdb0
Minutedb0
Seconddb0
LEDMAP:
;八段管显示码(使用软件译码的方式显示LED数码管)
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db7fh,6fh,77h,7ch,39h,5eh,79h,71h
KeyTable:
;键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
dataends
codesegment
assumecs:
code,ds:
data
Delayprocnear
pushax;延时子程序
pushcx
moval,0
movcx,ax
loop$
popcx
popax
ret
Delayendp
DisplayLEDprocnear
movbx,offsetLEDBuf
movcl,6;共6个八段管
movah,00100000b;从左边开始显示
DLoop:
movdx,OUTBIT
moval,0
outdx,al;关所有八段管
moval,[bx]
movdx,OUTSEG
outdx,al
movdx,OUTBIT
moval,ah
outdx,al;显示一位八段管
pushax
movah,1
callDelay
popax
shrah,1
incbx
deccl
jnzDLoop
movdx,OUTBIT
moval,0
outdx,al;关所有八段管
ret
DisplayLEDendp
IEnterprocnear
pushax
pushdx
decSecond;秒数减少1
moval,Second
cmpal,0;比较,若秒数小于0则结束本次中断,若等于0则秒数为60,分数减1
jneExit
movSecond,0
decMinute
moval,Minute
cmpal,0
jneExit
movMinute,0
decHour
moval,Hour
cmpal,0
jneExit
movHour,0
Exit:
movdx,CS8259A
moval,20h;中断服务程序结束指令
outdx,al
popdx
popax
iret
IEnterendp
IInitproc;8259A初始化子程序
movdx,CS8259A
moval,ICW1
outdx,al;写控制字ICW1
movdx,CS8259B
moval,ICW2
outdx,al;写控制字ICW2
moval,ICW4
outdx,al;写控制字ICW4
moval,OCW1
outdx,al;写控制字OCW1
ret
IInitendp;初始化结束
TestKeyprocnear
movdx,OUTBIT
moval,0
outdx,al;输出线置为0
movdx,IN_KEY
inal,dx;读入键状态
notal
andal,0fh;高四位不用
ret
TestKeyendp
GetKeyprocnear
movch,00100000b
movcl,6
KLoop:
movdx,OUTBIT
moval,ch;找出键所在列
notal
outdx,al
shrch,1
movdx,IN_KEY
inal,dx
notal
andal,0fh
jneGoon_;该列有键入
deccl
jnzKLoop
movcl,0ffh;没有键按下,返回0ffh
jmpExit1
Goon_:
deccl
shlcl,2;键值=列X4+行
movch,4
LoopC:
testal,1
jnzExit1
shral,1
inccl
decch
jnzLoopC
Exit1:
movdx,OUTBIT
moval,0
outdx,al
movch,0
movbx,offsetKeyTable
addbx,cx
moval,[bx];取出键码
movbl,al
WaitRelease:
movdx,OUTBIT
moval,0
outdx,al;等键释放
movah,10
callDelay
callTestKey
jneWaitRelease
moval,bl
ret
GetKeyendp
startprocnear;主程序
movax,data
movds,ax
movHour,24;分别给时,分,秒赋初值
movMinute,60
movSecond,60
cli;关中断
movax,0
movds,ax;数据段段地址为0
moval,76h;01110110B;初始化8253计数器1,16位,方式3,二进制
movdx,CONTROL
outdx,al
movax,62500
movdx,COUNT1
outdx,al;计数器低字节
moval,ah
outdx,al;计数器高字节
moval,MD8255
movdx,CTL8255
outdx,al
movbx,4*ICW2;中断号
movax,code;获取中断向量段地址cs值
shlax,4;x16
addax,offsetIEnter;中断入口地址(段地址为0)
mov[bx],ax
movax,0
incbx
incbx
mov[bx],ax;将cs:
ip的地址附给中断向量[bx+2]:
[bx]
callIInit;初始化8259
movax,data
movds,ax
movCNT,0;计数值初始为0
moval,CNT
movdx,PA8255
outdx,al
sti
LP:
callTestKey;判断是否简易键盘是否有键入,有则转至
;set,无则往下执行
jnzSet;等待中断,并计数。
moval,Hour;把时钟时数为10位和个位
movah,0
movcl,10
divcl
movch,ah
movah,0;把时数的十位数送到数据缓冲区
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movLEDBuf,al
movbx,offsetLEDMAP;把时数的个位数送到数据缓冲区
moval,ch
movah,0
addbx,ax
moval,[bx]
oral,80h
movLEDBuf+1,al
moval,Minute
movah,0
movcl,10
divcl
movch,ah
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movLEDBuf+2,al
movbx,offsetLEDMAP
moval,ch
movah,0
addbx,ax
moval,[bx]
oral,80h
movLEDBuf+3,al
moval,Second
movah,0
movcl,10
divcl
movch,ah
movah,0
movbx,offsetLEDMAP
addbx,ax
moval,[bx]
movLEDBuf+4,al
movbx,offsetLEDMAP
moval,ch
movah,0
addbx,ax
moval,[bx]
oral,80h
movLEDBuf+5,al
callDisplayLED;调用LED数码管数据显示子程序,使上面的数值显示出来
jmpLP
Set:
callGetKey
cmpal,07h
jzpause
cmpal,08h
jzcontiue
cmpal,09h
jzReset
jmpLP
pause:
CLI
jmpLP
contiue:
sti
jmpLP
Reset:
cli
movHour,12
MOVMinute,0
MOVSecond,0
sti
jmpLP
startendp
codeends
endstart
;按7暂停,8继续,9复位