数字电子钟实施方案.docx

上传人:b****3 文档编号:4361883 上传时间:2023-05-07 格式:DOCX 页数:29 大小:190.23KB
下载 相关 举报
数字电子钟实施方案.docx_第1页
第1页 / 共29页
数字电子钟实施方案.docx_第2页
第2页 / 共29页
数字电子钟实施方案.docx_第3页
第3页 / 共29页
数字电子钟实施方案.docx_第4页
第4页 / 共29页
数字电子钟实施方案.docx_第5页
第5页 / 共29页
数字电子钟实施方案.docx_第6页
第6页 / 共29页
数字电子钟实施方案.docx_第7页
第7页 / 共29页
数字电子钟实施方案.docx_第8页
第8页 / 共29页
数字电子钟实施方案.docx_第9页
第9页 / 共29页
数字电子钟实施方案.docx_第10页
第10页 / 共29页
数字电子钟实施方案.docx_第11页
第11页 / 共29页
数字电子钟实施方案.docx_第12页
第12页 / 共29页
数字电子钟实施方案.docx_第13页
第13页 / 共29页
数字电子钟实施方案.docx_第14页
第14页 / 共29页
数字电子钟实施方案.docx_第15页
第15页 / 共29页
数字电子钟实施方案.docx_第16页
第16页 / 共29页
数字电子钟实施方案.docx_第17页
第17页 / 共29页
数字电子钟实施方案.docx_第18页
第18页 / 共29页
数字电子钟实施方案.docx_第19页
第19页 / 共29页
数字电子钟实施方案.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数字电子钟实施方案.docx

《数字电子钟实施方案.docx》由会员分享,可在线阅读,更多相关《数字电子钟实施方案.docx(29页珍藏版)》请在冰点文库上搜索。

数字电子钟实施方案.docx

数字电子钟实施方案

摘要:

以8086或是8066为cpu, 利用8253可编程定时/计数器、8259中断控制器、8255可编程并行接口芯片和七段数码管设计一个电子钟的电路,并编制一段程序使的该电子钟能正常运行。

并且能用手动控制输入的方法修改电子时钟的时间。

主要目的是通过此次课程设计是我们对一般的电子产品的设计有所了解,并在此的基础上更加深入、熟练地学习8086、8253、8259等芯片的基本知识。

关键词:

数字电子钟、8086、8253、8255、中断。

目录

 

一、设计任务书…………………………..2

二、摘要…………………………...……...3

三、目录…………………………………..4

四、设计目的……………………………..5

五、实验连线……………………………..5

六、设计思想……………………………6

七、功能流程图…………………………..7

八、汇编程序………………………..…....8

九、心得体会…………...……………….22

 

一、设计目的:

(1)熟悉掌握8086/88指令系统。

(2)理解掌握定时/计数器和中断的使用方法。

(3)掌握微机原理实验系统的使用,掌握控制数码管显示的程序。

(4)掌握一定的汇编语言知识,培养自己的动手操作能力。

(5)学习程序设计的基本思路和方法。

二、实验连线

三、设计思想

1、概述:

程序主体设计:

本程序共有分端口设置模块,计数模块,显示模块等几个模块。

C--DISPLAY12,34,56----将闹钟设置为12:

34:

56;

G--GOAHEAD----开中断,闹钟恢复走时

D--STOPTODISPLAY-----关中断,闹钟停止走时

E--EXITTODOS----返回DOS

M--SETTHECLOCK-----设置闹铃时间

F--OPENTHECLOCK-----设置闹钟功能为开

B--CLOSETHECLOCK-----设置闹钟功能为关

P--POSITIONTHEBENINNINGDATE------设置闹钟的时间

2、计时器软件的设计:

主程序中,要对各个用到的芯片进行初始化,目的是使其每20毫秒产生一次方波。

8253A的定时器输出与8259A的IR2连接,计数器0工作在模式3(方波发生器),计数值采用二进制格式,输出作为计数器1的输入,计数器1工作在模式2(分频器),计数值采用二进制格式,输出到总线IRQ2,向CPU发送时钟中断信号,根据两个计数器的设置,系统每隔20毫秒便由8253A产生一次中断请求,即每隔20毫秒执行一次中断处理程序。

这个方法将与时间相关的两个模块即显示模块和计时模块放在中断处理程序中,这样,就保证了数字显示的稳定,中断处理程序完成计时功能要依靠两个方面,因为中断处理程序是每20毫秒执行一次,但计时并不是以20毫秒为单位进行的,而是以秒为单位进行的,所以,计时功能的实现一方面要利用20毫秒这个基准时间单位,另一方面借助一个计数单位。

计数单位的初始值为50,每进行一次中断,便使计数单元的内容减1。

每当计数单元从50减为0时,说明已经过了1秒时间。

并判断是否有进位,如有则进行修改,实现进位。

并在LED上显示。

显示部分:

本程序显示部分用了6个共阴极LED作为显示管,显示程序要做到每送一次段码就送一次位码,每送一次位码后,将位码中的0右移1位作为下次的位码,从而可以实现从左到右使6个LED依次显示出相应的数字。

虽然CPU每隔一定时间便执行显示程序,但只要这个时间段不太长,由于人眼的视觉作用,就可以在6个LED上同时见到数字显示。

四、功能流程图

 

四、源程序以及注释

;*键盘显示8255LED*;

;*********************;

IO_PLX_DEVICE_IDEQU05406H;TPC卡设备ID

IO_PLX_VENDOR_IDEQU010B5H;TPC卡厂商ID

IO_PLX_SUB_IDEQU0905410B5H;TPC卡子设备及厂商ID

PA55EQU218H-200H;8255端口地址

PB55EQU219H-200H

P55CTLEQU21BH-200H

PORTSEGEQU211H-200H;LED端口地址

PORTBITEQU210H-200H

TIM_CTLEQU203H-200H;8253端口地址

TIMER0EQU200H-200H

TIMER1EQU201H-200H

MODE03EQU36H;0011-0111

MODE12EQU74H;0111-0101

DATASEGMENT

CSREGDW?

IPREGDW?

;旧中断向量保存空间

IO_9054BASE_ADDRESSDB4DUP(0);TPC卡PCI接口芯片I/O基地址暂存空间

IO_BASE_ADDRESSDB4DUP(0);TPC卡I/O基地址暂存空间

INTERRUPT_LINEDB2DUP(0);TPC卡中断号暂存空间

PCICARDNOTFINDDB0DH,0AH,'TPCPCICARDNOTFINDORADDRESS/INTERRUPTERROR!

!

!

',0DH,0AH,'$'

IO9054BASEADDRESSDB0DH,0AH,'TPCPCICARD9054CHIPI/OBASEADDRESS:

','$'

IOBASEADDRESSDB0DH,0AH,'TPCPCICARDI/OBASEADDRESS:

','$'

INTNUMBERDB0DH,0AH,'TPCPCICARDINTERRUPTLINE:

','$'

ENTER_RETURNDB0DH,0AH,'$'

MESSDB'8253ATIMER0INMODE3!

COUNT=0200H',0AH,0DH

DB'8253ATIMER1INMODE2!

COUNT=0AH',0AH,0DH,'$'

MESS1DB'IAMRINGING',0AH,0DH,'$'

IRQ_VECTDB08H,09H,0AH,0BH,0CH,0DH,0EH,0FH,70H,71H,72H,73H,74H,75H,76H,77H

;新的中断向量,中断0-7的向量为:

08H-0FH,中断8-15的向量为:

70H-77H

IRQ_MASK_0_7_TABLEDB011111110B,011111101B,011111011B,011110111B

DB011101111B,011011111B,010111111B,001111111B

DB011111011B,011111011B,011111011B,011111011B

DB011111011B,011111011B,011111011B,011111011B

;新的中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零

IRQ_MASK_8_15_TABLEDB0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH

DB011111110B,011111101B,011111011B,011110111B

DB011101111B,011011111B,010111111B,001111111B

;新的中断掩码,中断0-7时全一,中断8-15时从低至高相应位为零

COUNTDB15

CTIMEDB00H,00H,00H,00H,00H,00H

CLOCKDB0AH,0AH,0AH,0AH,0AH,0AH

BUFDB00H,00H,00H,00H,00H,00H;*****************

MYBELLDB00H;***********OFF***INITIALIZE

MONTH3DB0

DAY3DB0

CHAR1DB?

INTMASKDB?

CONST1DW?

LEDDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,79H,00H

TABLE1DW0101H,0201H,0401H,0801H,1001H,2001H,4001H,8001H

DW0102H,0202H,0402H,0802H,1002H,2002H,4002H,8002H

DW0104H,0204H,0404H,0804H,1004H,2004H,4004H,8004H

CHARDB'CDEFBA9845673210RPMG'

;MAXDAYDB00H,1FH,1CH,1FH,1EH,1FH,1EH,1FH,1FH,1EH,1FH,1EH,1FH

MESDB'INSMALLKEYRORD',0AH,0DH

DB'C--DISPLAY12,45,37;G--GOAHEAD',0AH,0DH

DB'D--STOPTODISPLAY;E--EXITTODOS',0AH,0DH

DB'M--SETTHECLOCK;F--OPENTHECLOCK',0AH,0DH

DB'B--CLOSETHECLOCK',0AH,0DH

DB'P--POSITIONTHEBENINNINGDATE',0AH,0DH,'$'

DATAENDS

STACKSSEGMENT

DB100DUP(?

STADW512DUP(?

TOPEQULENGTHSTA

STACKSENDS

CODESEGMENT

;ASSUMECS:

CODE,DS:

DATA,SS:

STACKS,ES:

DATA

START:

;ENABLELOCALINTERRUPTINPUT

.386

CLI

MOVAX,DATA

MOVDS,AX

MOVES,AX

MOVAX,STACKS

MOVSS,AX

CALLFINDTPC;查找TPC卡资源并显示

MOVAH,0

INT1AH;时间中断,保存到DX中

MOVBX,DX

T1:

MOVAH,0

INT1AH

CMPBX,DX

JZT1

MOVBX,DX

MOVSI,0

T2:

MOVAH,0

INT1AH

MOVAX,800H

T3:

DECAX;循环800H次

JNZT3

INCSI

CMPBX,DX

JZT2

MOVAX,30H

MOVBX,SI

MULBX

MOVBX,56H

DIVBX

MOVWORDPTRCONST1,AX

MOVDX,WORDPTRIO_BASE_ADDRESS;初始化8253

ADDDX,TIM_CTL;控制口

MOVAL,MODE03;36H==00110110;计数器0工作在模式3(方波发生器),计数值采用二进制格式

OUTDX,AL

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,TIMER0;计时器0

MOVAL,00H

OUTDX,AL

MOVAL,02H

OUTDX,AL

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,TIM_CTL;74H==01110100;设置计数器1工作在模式2(分频器),计数值采用二进制格式

MOVAL,MODE12

OUTDX,AL

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,TIMER1

MOVAL,0AH

OUTDX,AL

MOVAL,00

OUTDX,AL

MOVDX,OFFSETMES

MOVAH,09

INT21H

MOVDX,WORDPTRIO_9054BASE_ADDRESS

ADDDX,68H;设置TPC卡中9054芯片IO口,使能中断

INAX,DX

ORAX,0900H

OUTDX,AX

MOVBX,WORDPTRINTERRUPT_LINE;保存原中断向量

MOVAL,BYTEPTR[IRQ_VECT+BX]

MOVAH,35H

INT21H

MOVAX,ES

MOVCSREG,AX

MOVIPREG,BX

MOVBX,WORDPTRINTERRUPT_LINE;设置新中断向量

MOVAL,BYTEPTR[IRQ_VECT+BX]

MOVCX,CS

MOVDS,CX

MOVDX,OFFSETINT_PROC

MOVAH,25H

INT21H

MOVAX,DATA

MOVDS,AX

MOVES,AX

INAL,21H;设置中断掩码

MOVBX,WORDPTRINTERRUPT_LINE

MOVAH,BYTEPTR[IRQ_MASK_0_7_TABLE+BX]

ANDAL,AH

OUT21H,AL

INAL,0A1H

MOVBX,WORDPTRINTERRUPT_LINE

MOVAH,BYTEPTR[IRQ_MASK_8_15_TABLE+BX]

ANDAL,AH

OUT0A1H,AL

STI;开中断

;**********************非规定的按键时继续等待*************

;*********************************************************

EXIT:

CLI

MOVBX,WORDPTRINTERRUPT_LINE;恢复中断掩码

MOVAH,BYTEPTR[IRQ_MASK_0_7_TABLE+BX]

NOTAH

INAL,21H

ORAL,AH

OUT21H,AL

MOVBX,WORDPTRINTERRUPT_LINE

MOVAH,BYTEPTR[IRQ_MASK_8_15_TABLE+BX]

NOTAH

INAL,0A1H

ORAL,AH

OUT0A1H,AL

MOVBX,WORDPTRINTERRUPT_LINE;恢复原中断向量

MOVAL,BYTEPTR[IRQ_VECT+BX]

MOVDX,IPREG

MOVCX,CSREG

MOVDS,CX

MOVAH,25H

INT21H

MOVAX,DATA;设置TPC卡中9054芯片IO口,关闭中断

MOVDS,AX

MOVDX,WORDPTRIO_9054BASE_ADDRESS

ADDDX,68H

INAX,DX

ANDAX,0F7FFH

OUTDX,AX

MOVAX,4C00H

INT21H;退出

CLI

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

PUSHDS

MOVAX,DATA;INTERRUPTTODO

MOVDS,AX

DEC[COUNT]

JNZDDD

MOV[COUNT],20

MOVDI,OFFSETCTIME

MOVAL,[DI+4]

MOVAH,0AH

MULAH

ADDAL,[DI+5]

CMPAX,59;先判断秒钟是否等于59秒,是则判断分钟,否则加1

JZFENZHONG

INCBYTEPTR[DI+5]

CMPBYTEPTR[DI+5],0AH

JNZDDD

MOVBYTEPTR[DI+5],00H

INCBYTEPTR[DI+4]

JMPDDD

FENZHONG:

MOVWORDPTR[DI+4],0000H;先将秒钟置为0,再转换分钟为十进制形式

MOVAL,[DI+2]

MOVAH,0AH

MULAH

ADDAL,[DI+3]

CMPAX,59;判断是否应该向时钟进位

JZSHIZHONG

INCBYTEPTR[DI+3]

CMPBYTEPTR[DI+3],0AH

JNZDDD

MOVBYTEPTR[DI+3],00H

INCBYTEPTR[DI+2]

JMPDDD

SHIZHONG:

MOVWORDPTR[DI+2],0000

MOVAL,[DI]

MOVAH,0AH

MULAH

ADDAL,[DI+1]

CMPAH,23;判断时钟该不该循环了

JNZQQQ

MOVWORDPTR[DI],0000H

JMPDDD

QQQ:

INCBYTEPTR[DI+1]

CMPBYTEPTR[DI+1],0AH

JNZDDD

MOVBYTEPTR[DI+1],00H

INCBYTEPTR[DI]

DDD:

;将闹铃功能键与闹铃条件的判断放在20次中断计数条件满足后的执行代码中

;有效缩短延迟时间以及误差时间

CMPBYTEPTRMYBELL,00H;检测闹铃有没有开,

JZZZZ

LEADI,CTIME

LEASI,CLOCK

MOVCX,5

CHECK:

;检测门铃时间是否到了

MOVAL,[DI]

MOVBL,[SI]

CMPAL,BL

JNZZZZ

INCDI

INCSI

LOOPCHECK

;**************闹铃时的检测输出

MOVDL,07H

MOVAH,02H

INT21H

LEADX,MESS1

MOVAH,09H

INT21H

MOVBYTEPTRMYBELL,00H

ZZZ:

MOVAL,20H;SENDEOI

OUT0A0H,AL

OUT20H,AL

MOVCX,0FFFFH

LOOPX:

NOP

LOOPLOOPX;延时

POPDS

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

STI

IRET

INT_PROCENDP

;------------------------------------------------------------------

KEYPROCNEAR;AB口端口读取的控制,是对小键盘的控制

PUSHCX

KST:

MOVAL,82H

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,P55CTL

OUTDX,AL

MOVAL,00H

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,PA55

OUTDX,AL

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,PB55

INAL,DX

ORAL,0F8H

CMPAL,0FFH

JZDELAY

PUSHAX

MOVCX,0A00H;两重循环

DLY:

MOVAX,WORDPTRCONST1

DLY1:

DECAX

JNZDLY1

DECCX

JNZDLY

POPAX

MOVCL,08H

MOVAH,0FEH

SCAN1:

MOVDX,WORDPTRIO_BASE_ADDRESS;行列扫描,得到小键盘输入

ADDDX,PA55

MOVAL,AH

OUTDX,AL

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,PB55

INAL,DX

ORAL,0F8H

CMPAL,0FFH

JNZKEYN

ROLAH,1

DECCL

JNZSCAN1

JMPKST

KEYN:

PUSHAX

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,PB55

RELEA:

INAL,DX

ORAL,0F8H

CMPAL,0FFH

JNZRELEA

POPAX

NOTAX

MOVSI,OFFSETTABLE1

MOVDI,OFFSETCHAR

MOVCX,24

TT:

CMPAX,[SI]

JZNN

DECCX

JZKST

ADDSI,02

INCDI

JMPTT

NN:

MOVDL,[DI]

MOV[CHAR1],DL

MOVAH,02H

INT21H

POPCX

JMPYANG

DELAY:

CALLDISPLY

JMPKST

YANG:

RET

KEYENDP

;---------------------------------------------------------------

DISPLYPROCNEAR;LED的显示部分

PUSHCX

MOVBX,OFFSETLED

MOVCX,0006

MOVSI,OFFSETCTIME

MOVAH,01H

DISPLY1:

CLD

LODSB

XLAT

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,PORTSEG

OUTDX,AL

MOVAL,AH

MOVDX,WORDPTRIO_BASE_ADDRESS

ADDDX,PORTBIT

OUTDX,AL

SHLAH,1

MOVAL,00

OUTDX,AL

LOOPDISPLY1

POPCX

RET

DISPLYENDP

;---------------------------------------------------------------

CPROPROCNEAR;C键按下时执行的过程,显示预设时间

CLI

MOVWORDPTR[CTIME],0201H

MOVWORDPTR[CTIME+2],0504H

MOVWORDPTR[CTIME+4],0703H

RET

CPROENDP

;---------------------------------------------------------------

GPROPROCNEAR;G键按下时执行的过程,开

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2