最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

微机原理课程设计电子时钟的设计

来源:动视网 责编:小OO 时间:2025-09-29 02:25:22
文档

微机原理课程设计电子时钟的设计

《微机原理》课程设计——电子时钟的设计(2005-6-24)山东科技大学机电学院js02-220号一.课程设计题目:电子钟1.设计目的:了解定时/计数器和中断的使用。2.设计所需设备:PC机。3.设计任务:编写程序,在PC机上显示时间。二.程序内容:第一部分:定义显示界面。第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入内存区。第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。第四部分:获取键盘的按键值,判断键值并退出系统。三.程序设计原理:
推荐度:
导读《微机原理》课程设计——电子时钟的设计(2005-6-24)山东科技大学机电学院js02-220号一.课程设计题目:电子钟1.设计目的:了解定时/计数器和中断的使用。2.设计所需设备:PC机。3.设计任务:编写程序,在PC机上显示时间。二.程序内容:第一部分:定义显示界面。第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入内存区。第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。第四部分:获取键盘的按键值,判断键值并退出系统。三.程序设计原理:
《微机原理》课程设计

——电子时钟的设计(2005-6-24)

山东科技大学机电学院js02-2 20号

一.课程设计题目:电子钟

1.设计目的:了解定时/计数器和中断的使用。

2.设计所需设备:PC机。

3.设计任务:编写程序,在PC机上显示时间。

 二.程序内容:

第一部分:定义显示界面。

第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入内存区。

第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。

第四部分:获取键盘的按键值,判断键值并退出系统。

三.程序设计原理:

首先在数据段开辟一显示缓冲区,用来存储系统时间。调用DOS中断,返回系统时间,并将来返回的二进制时间转换成ASCII码,方便时间显示时的调用。分别将来小时数、分钟数、秒数存入显示缓冲区,并最终存入一结束字符号’$’。调用DOS字符串显示功能将时间显示出来。并调用屏幕I/O中断,定位光标的开始位置,结合着将时间显示在我们预先定义好的位置上。由于获取了的系统时间不会自动刷新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子钟了。时间显示的刷新要配合延时程序进行,为了得到良好的显示效果,延时程序要尽量接近1秒,但又不能超过一秒,所以本程序调用了一段较精确的时间延迟程序,屏幕显示延迟一段时间后再跳回到初始位置,再显示,由此循环下去。程序的最后还设计一了个按“ESC”键就退出的功能,采取了判断键值的方法。为了显示的美观,还设计一个字符图界面,通过显示字符串的方法显示出来。本程序具有很强的扩展功能,我们可以在此基础上进行一些输入、输出扩展,显示的扩展,比如可以做成计时器,并设计一个精美的运动的图形界面,时间到了会自动调用PC喇叭发出报警声等等。。但是由于时间的原因,所以只做了核心的部分,这不得不说是一个遗憾。本程序使用了未来汇编,与VISUAL ASM开发平台。

四.程序设计心得:

本程序虽然只花了一天的时间,但是也收获颇多。其实本程序的设计思路并不难想,核心代码的设计所花的时间也不长。但是调试的时间却占了差不多70%的时间,在本程序设计的初期曾经走了不少弯路碰见过不少难题,所幸的是在我们的坚持下最终把难题一一击破。下面就列举下我们遇见过的比较繁琐的难题:

1.进制转换问题。开始我们的思路是想将AL的内容除于10,然后分别讲除数跟商分别加上30H转换成ASCII码并保存在AH跟AL里面。但是写完调试的时候系统自动弹出一个对话框,要求关闭,可是用自带的编译器却可以通过,百思不得其解,最后上网找了资料才发现是编译系统跟操作系统不兼容的问题,本人的操作系统是最新的WIN2003,纯32位的系统,跟16位的软件有不兼容也是有可能的。但我本人又不想重装个WIN98来调试程序,于是就放弃这种方法,改用逻辑移位,调整的方式来实现了。

2.屏幕显示问题。开始做完程序的时候由于采用了光标定位的方法,发现运行了程序后显示光标不停地跳动,而且在不同的位置上跳动,严重影响了程序的可观赏性。检查发现原来光标的跳动跟程序的刷新频率跟人眼的视觉残象成影原理有关,只要系统的刷新频率大于1/25秒,那么人眼就会认为图象在改变,这跟电影为什么要设成25帧/秒的播放速率的原理是一样的。这样一来,就必须设计一较为精确的延时程序来改善画面的显示了,只要不让屏幕刷新得太快就可以打到要求了,具体的显示时间是通过延时程序里的DX值决定的,通过调整DX的值,我们发现当DX等于04FF的时候显示效果是最好的。

3.系统退出问题。开始本程序是使用了DOS中断的键盘功能调用,可是当我们加了比较跳转指令后整个程序就停了在那里,具体原因不是很清楚。最后换成了键盘I/O功能调用,问题迎刃而解了。希望能跟老师一起探讨这个问题。

我的心得体会

我们所设计的程序原理是:程序先调用系统时间,然后将返回的二进制数转化成ASCII码,再通过dos显示功能显示出来,并通过循环不断刷新显示的时间.

我从这次程序设计过程中学会,理解了几点我以前不熟悉的知识:

首先在二进制转化成ASCII码的过程中,我进一步地了解到,在转化过程中,二进制数首先转化为双四位的BCD码,再将高四位低四位分别相加30H,从而转化为ASCII码,此时要对照书本P416的附录1了解电脑cup如何将ASCII码的信息转换成显示字符。

其次,了解了如何对其他经典程序的灵活应用。我们的程序是不断对显示屏进行刷新的,所以我们调用了bctd程序,这是一个精确的计时程序,计数时间约为1秒,然后我们用了jmp   display指令,刷新显示屏,从而达到时间的每秒显示。

通过了这次程序设计,使我更深刻地理解了微机的原理与应用技术,特别是在对中断技术的理解与应用方面,更好地理解了微机的工作情况与运行方式。

可以这样说,如果没有此课程设计,我对微机的原理与应用技术,仍旧停滞于表面了解、一知半解甚至不知其解的状态,这样就谈不上学知识、长见闻、提高自身学术素质与理论水平的方方面面。但也让作者感到自身的知识和理论水平要作更高层次的课程设计,远远不足,还需要不懈地学习与提高,更需要指导老师与在此方面的高手不吝赐教!

参考资料:

《微型计算机原理及应用》第四版 周明德  清华大学出版社

《微机原理及接口技术实验指导书》岳克宁  主编

《全国计算机等级考试辅导教程与同步试题训练(3级PC技术)》  冶金工业出版社

五.流程图:

Y

六.程序源码:

;name: ELECTRONIC CLOCK

                         ;design by zengqingyu class1 and moxiaolei class3

data  segment

mess1   db  '                                   \\\\\\|///                                              ',0ah,0dh

        db  '                                \\\ .-.- //                                            ',0ah,0dh

        db  '                                 ( .@.@ )                                             ',0ah,0dh

        db  '                +-----------oOOo-----(_)-----oOOo-------------+                         ',0ah,0dh

        db  '                +               ASM   ASSIGNMENT              +                         ',0ah,0dh

        db  '                +               ELECTRONIC CLOCK              +                         ',0ah,0dh

        db  '                +             Design by Kevin & Ray           +                         ',0ah,0dh

        db  '                +                                 version:1.0 +                         ',0ah,0dh

        db  '                +                                             +                         ',0ah,0dh

        db  '                +                                             +                         ',0ah,0dh

        db  '                +                    Press ESC button to quit +                         ',0ah,0dh

        db  '                +-------------------------Oooo----------------+                         ','$'

mess2   db  'The time is now:',0ah,0dh,'$'

t_buff  db 20            ;在数据段开辟一时间显示缓冲区

data  ends

stack segment

      db 100 dup(?)

stack ends

code  segment

      assume cs:code,ss:stack,ds:data

main:

      call clear         ;调用清屏子程序

display: ;----------------------------时间显示部分--------------

      mov ax,seg data

      mov ds,ax

      mov bx,offset t_buff      ;送t_buff的偏移地址到BX

      mov ah,2ch                 ;调用DOS时间调用功能,功能号:2cH,小时,分钟,秒数分别保存在CH,CL,DH中

      int 21h

      mov al,ch                ;小时数设定

      mov ah,0

      call bctd                 ;调用进制转换子程序

      push ax

      and al,0f0h                ;选取al高四位

      mov cl,4                   ;设置右循环的次数

      rol al,cl                   ;右循环

      or al,30h                    ;加30h得到ACSII码

      mov [bx],al                 ;将得到的结果送到t_buff缓冲区

      inc bx                       ;BX自加1,指针指向下一个缓冲区的下一个地址

        

        

      pop ax

      and al,0fh                 ;选取低四位,道理同上

      or al,30h

      mov [bx],al                 ;将转换后的低四位值送入缓冲区的第二个地址

      inc bx

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

      mov al,':' ;显示分号

      mov [bx],al

      inc bx

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

      mov ah,2ch

      int 21h

        

      mov al,cl                ;分钟数设定

      mov ah,0

      call bctd

      push ax

      and al,0f0h

      mov cl,4

      rol al,cl

      or al,30h

      mov [bx],al

      inc bx

      pop ax

      and al,0fh

      or al,30h

      mov [bx],al

      inc bx

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

      mov al,':'                    ;显示;号

      mov [bx],al

      inc bx

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

        

      mov ah,2ch                    ;秒设定

      int 21h

      mov al,dh

      mov ah,0

      call bctd

      push ax

      and al,0f0h

      mov cl,4

      rol al,cl

      or al,30h

      mov [bx],al

      inc bx

      pop ax

      and al,0fh

      or al,30h

      mov [bx],al

      inc bx

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

      mov al,'$'      ;将字符串的结束位送至显示缓冲区的最后一位

      mov [bx],al

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

      push  bx      ;置光标位置 ,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BX

      mov ah,2

      mov bh,0

      mov dh,17

      mov dl,41

      int 10h

      pop bx

      lea dx,t_buff  ;送t_buff偏移地址到DX,并调用DOS显示功能,功能号为9

      mov ah,9

      int 21h

      push  bx      ;置光标位置

      mov ah,2

      mov bh,0

      mov dh,0

      mov dl,0

      int 10h

      pop bx

      lea dx,mess1

      mov ah,9

      int 21h

        

      push  bx      ;置光标位置

      mov ah,2

      mov bh,0

      mov dh,17

      mov dl,21

      int 10h

      pop bx

      lea dx,mess2

      mov ah,9

      int 21h

        

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

      call delay1

      mov ah,1              ;按任意键结束,调用键盘I/O中断功能号1,获取键值到AL

      int 16h

      cmp al,1bh

      jz   quit          ;是ESC键的话就跳转

      jmp   display

      

quit:

     mov ah,4ch

     int 21h

     ret

      

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

bctd proc near;二进制转BCD码子程序

;AX输入参数

;AX输出参数,存放调整过的BCD码

;

      mov   dx,ax

      mov   ax,0

      mov   cx,16        ;设循环次数

bctd1:

      clc               ;清进位标志C

      rcl   dx,1        ;通过进位的循环右移

      adc   al,al       ;带进位加法

      daa               ;加法的十进制调整

      xchg  al,ah       ;交换高,低八位

      adc   al,al

      daa

      xchg  al,ah

      loop  bctd1        ;循环,次数保存在CX里

      ret

bctd   endp

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

clear proc near

      push  ax     ;入栈保护现场

      push  bx

      push  cx

      push  dx

      mov ax,0600h;ah=06(滚动)al=00(全屏空白)

      mov bh,3fh  ;背景颜色(3),白色前景(f)

      sub cx,cx

      mov dx,5f5fh

      int 10h

      pop dx        ;出栈恢复现场

      pop cx

      pop bx

      pop ax

      ret

clear endp

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

delay1 PROC ;精确延迟时间子程序

    MOV DX,04ffh    ;循环次数

up:    XOR CX,CX

a:    NOP

    LOOP a

    DEC DX

    JNZ up

    RET

delay1 ENDP

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

code  ends

      end main

程序运行截图:

文档

微机原理课程设计电子时钟的设计

《微机原理》课程设计——电子时钟的设计(2005-6-24)山东科技大学机电学院js02-220号一.课程设计题目:电子钟1.设计目的:了解定时/计数器和中断的使用。2.设计所需设备:PC机。3.设计任务:编写程序,在PC机上显示时间。二.程序内容:第一部分:定义显示界面。第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间数存入内存区。第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。第四部分:获取键盘的按键值,判断键值并退出系统。三.程序设计原理:
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top