微机原理课程设计-电子钟的设计.doc_第1页
微机原理课程设计-电子钟的设计.doc_第2页
微机原理课程设计-电子钟的设计.doc_第3页
微机原理课程设计-电子钟的设计.doc_第4页
微机原理课程设计-电子钟的设计.doc_第5页
免费预览已结束,剩余24页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要数字闹钟1、通过8253定时器产生秒脉冲定时中断。在中断服务程序中实现秒、分、小时的进位(24小时制)。2、将当前时分秒在七段led显示器上显示(如:091132)。3、可设置闹钟的时间当前值(对准时间),设置闹铃时间,闹铃功能的关闭和开放.关键词:数字闹钟,8253定时器,led显示器,8255a并行口目 录1.实验线路12.设计思想23.功能流程图44.结果讨论85.源程序以及注释9参考文献26271.实验线路实验线路如图1所示。图1 实验线路图2.设计思想一、概述:程序主体设计:本程序共有分端口设置模块,计数模块,显示模块等几个模块。c-display 12, 45, 37 -将闹钟设置为12:45: 37;g-go ahead-开中断,闹钟恢复走时d-stop to display-关中断,闹钟停止走时e-exit to dos-返回dosm-set the clock -设置闹铃时间f-open the clock-设置闹钟功能为开b-close the clock-设置闹钟功能为关p-position the beninning date-设置闹钟的时间二、计时器软件的设计:主程序中,要对各个用到的芯片进行初始化,目的是使其每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上同时见到数字显示。程序中,用8255a的pa口作为输出,输出扫描信号,pb口作为输入,读进列值。本程序用行扫描法来识别键盘的闭合键。先使第0行接地,其余行为高电平,然后看第0行是否有键闭合,这是通过检查列线电位来实现的,即在第0行接地时看是否有哪条列线变成低电平。如果有某条列线变为低电平,则表示第0行和此列线位置上的键被按下如果没有,则说明第0行上没有键被按下。此后,再将第1行接地,然后检测列线中是否有变为低电平的线。如此往下逐行扫描,直到最后一行。为消除键的抖动,所以调用延迟程序,然后再判断具体按下的到底是哪个键,如果得到的是ffh,则程序在循环中等待。计数部分:见流程图时间设定模块对于输入的检测,若超出范围,则对其置f-,3.功能流程图一、程序主流程控制图(如图2所示)d键?p键?m键?f键?b键?e键?nnnnnnyyyyyyg键?nyc键?y显示初始化时间开始计时停止计时开启闹铃设置闹铃设置时间关闭闹铃退出回到dosn图2 程序主流程控制图二、中断服务子程序流程图(如图3所示)收到50次中断?进位处理部分(下)闹铃开?计数值减一(初值为50)yn闹铃时间到?中断进入yyn响铃退出中断服务图3 中断服务子程序流程图图三、进位处理部分流程图(如图4所示)开始秒钟是否到59(此部分的转换从略)秒加1秒十位和各位赋值为0 0ny分钟是否到59(此部分的转换从略)分钟加1ny分钟十位和各位赋值为0 0分钟是否到23(此部分的转换从略)小时加1ny小时十位和各位赋值为0 0闹铃判断响铃部分图4进位处理部分流程图4.结果讨论本程序共有分端口设置模块,计数模块,显示模块等几个模块。经过调试,本程序可以实现题目的要求。时、分、秒都分两位。个位满十后就向前进一位。分秒的十位满六十后也向前进一位。显示小时两位在满二十四后重新计数。在置数时,使用者可置任意值,但如果有某位超过计数值,则在led显示器上输出出错信息。程序中设置压c键为led显示器清0,压e键为退出,压d键为计数暂停,压p键为设置led显示器初始值。应该注意的是,程序中设定的键值为实验台上的小键盘的键值,并非计算机键盘。经测试,程序中设置的功能全都可以良好运行。本程序参照实验室电脑中16bit文件中的kl.asm编制定时器/计数器8253计数初值的设定。下面对几个重点部分的调试过程和遇到的问题作一定的讨论:修改后的中断服务子程序(改变进位的条件)(1)其中进位的条件判断以及后面的闹铃的程序段位置的设置都与程序结果有很大的关系.进位判断特别要注意仔细,编程实现前应该画个流程图,直接再源文件上改不但不能节省时间,反而更加浪费时间.(2)此中断服务子程序的类型设置为far调用,这里要特别注意.因为相对于中断发生时的运行状态,此程序段与之不在同一代码段,所以应该定义为far类型.这样产生了另外一个问题,在此程序段中若想调用此code段中以他过程,则那个过程也应该被定义为far调用,当然可以简单的通过不使用过程调用解决.以解决此中断子程序过程和其他普通过程对对应过程的调用冲突.5.源程序以及注释;此程序实现数字闹钟的设定,闹铃时间得设定,闹铃功能的开关;试验硬件平台是tpc-1型试验培训系统;386以上微机适用;纯dos下才能使用;tasm4.1或以上编译;*;* 键盘显示 8255led *;*; io_plx_device_id equ 05406h;tpc卡设备id io_plx_vendor_idequ 010b5h;tpc卡厂商id io_plx_sub_id equ 0905410b5h;tpc卡子设备及厂商id pa55 equ 218h-200h;8255端口地址 pb55 equ 219h-200h p55ctl equ 21bh-200h portseg equ 211h-200h;led端口地址 portbit equ 210h-200h tim_ctl equ 203h-200h;8253端口地址 timer0 equ 200h-200h timer1 equ 201h-200h mode03 equ 36h ;0011-0111 mode12 equ 74h ;0111-0101data segment csregdw? ipregdw? ;旧中断向量保存空间 io_9054base_addressdb 4 dup(0);tpc卡pci接口芯片i/o基地址暂存空间 io_base_address db 4 dup(0);tpc卡i/o基地址暂存空间 interrupt_line db 2 dup(0);tpc卡中断号暂存空间 pcicardnotfinddb 0dh,0ah,tpc pci card not find or address/interrupt error !,0dh,0ah,$ io9054baseaddressdb 0dh,0ah,tpc pci card 9054 chip i/o base address : ,$ iobaseaddressdb 0dh,0ah,tpc pci card i/o base address : ,$ intnumber db 0dh,0ah,tpc pci card interrupt line : ,$ enter_return db 0dh,0ah,$ mess db 8253a timer0 in mode3! count=0200h,0ah,0dh db 8253a timer1 in mode2! count=0ah,0ah,0dh,$ mess1 db i am ringing,0ah,0dh,$ irq_vectdb 08h,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_tabledb 011111110b,011111101b,011111011b,011110111bdb 011101111b,011011111b,010111111b,001111111bdb 011111011b,011111011b,011111011b,011111011bdb 011111011b,011111011b,011111011b,011111011b;新的中断掩码,中断0-7时从低至高相应位为零,中断8-15时第2位为零 irq_mask_8_15_tabledb 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffhdb 011111110b,011111101b,011111011b,011110111bdb 011101111b,011011111b,010111111b,001111111b;新的中断掩码,中断0-7时全一,中断8-15时从低至高相应位为零count db 15ctime db 00h,00h,00h,00h,00h,00hclock db 0ah,0ah,0ah,0ah,0ah,0ahbuf db 00h,00h,00h,00h,00h,00h;*mybell db 00h;*off*initializemonth3 db 0day3 db 0char1 db ?intmask db ?const1 dw ?led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,40h,79h,00htable1 dw 0101h,0201h,0401h,0801h,1001h,2001h,4001h,8001h dw 0102h,0202h,0402h,0802h,1002h,2002h,4002h,8002h dw 0104h,0204h,0404h,0804h,1004h,2004h,4004h,8004hchar db cdefba9845673210 rpmg;maxday db 00h,1fh,1ch,1fh,1eh,1fh,1eh,1fh,1fh,1eh,1fh,1eh,1fhmes db in small keyrord,0ah,0dh db c-display 12, 45, 37 ; g-go ahead,0ah,0dh db d-stop to display ; e-exit to dos,0ah,0dh db m-set the clock ; f-open the clock,0ah,0dh db b-close the clock,0ah,0dh db p-position the beninning date,0ah,0dh,$data endsstacks segmentdb 100 dup (?)sta dw 512 dup (?)top equ length stastacks endscode segment ;assume cs:code,ds:data,ss:stacks,es:datastart:;enable local interrupt input.386 cli mov ax,data mov ds,ax mov es,ax mov ax,stacks mov ss,ax callfindtpc;查找tpc卡资源并显示 mov ah,0 int 1ah ;时间中断,保存到dx中 mov bx,dxt1: mov ah,0 int 1ah cmp bx,dx jz t1 mov bx,dx mov si,0t2: mov ah,0 int 1ah mov ax,800ht3: dec ax ;循环800h次 jnz t3 inc si cmp bx,dx jz t2 mov ax,30h mov bx,si mul bx mov bx,56h div bx mov word ptr const1,axmov dx,word ptr io_base_address;初始化8253add dx,tim_ctl ;控制口mov al,mode03 ;36h=0011 0110 ;计数器0工作在模式3(方波发生器),计数值采用二进制格式out dx,almov dx,word ptr io_base_addressadd dx,timer0 ;计时器0mov al,00hout dx,almov al,02hout dx,almov dx,word ptr io_base_addressadd dx,tim_ctl ;74h=0111 0100 ;设置计数器1工作在模式2(分频器),计数值采用二进制格式mov al,mode12out dx,almov dx,word ptr io_base_addressadd dx,timer1mov al,0ahout dx,almov al,00out dx,almov dx,offset mesmov ah,09int 21hmov dx,word ptr io_9054base_addressadd dx,68h ;设置 tpc 卡中9054芯片io口,使能中断 in ax,dx or ax,0900h out dx,ax mov bx,word ptr interrupt_line ;保存原中断向量mov al,byte ptr irq_vect+bxmov ah,35h int 21hmov ax,esmov csreg,axmov ipreg,bx mov bx,word ptr interrupt_line ;设置新中断向量 mov al,byte ptr irq_vect+bx mov cx,cs mov ds,cxmov dx,offset int_procmov ah,25h int 21hmov ax,datamov ds,axmov es,ax in al, 21h ;设置中断掩码 mov bx,word ptr interrupt_linemov ah,byte ptr irq_mask_0_7_table+bxandal,ah out 21h, al in al, 0a1h mov bx,word ptr interrupt_linemov ah,byte ptr irq_mask_8_15_table+bxandal,ah out 0a1h, alsti ;开中断;*;*小键盘的查询过程*lkey: call key ;获得tpc键盘输入值 mov dl,char1 ;c-display 12, 45, 37 cmp dl,c jnz lgy call cpro jmp lkeylgy: cmp dl,g; g-go ahead jnz ldy call gpro jmp lkeyldy: cmp dl,d; d-stop to display jnz lpy call dpro jmp lkeylpy: cmp dl,p; p-position the beninning jnz lmy call ppro jmp lkeylmy: cmp dl,m ;set the clock time jnz lfy call mpro jmp lkeylfy: cmp dl,f ;belling on/off jnz lby mov mybell,01h;on jmp lkeylby: cmp dl,b;b-close the clock jnz ley mov mybell,00h;off jmp lkeyley: cmp dl,e; exit to dos jnz lkey;*非规定的按键时继续等待*;*exit: cli mov bx,word ptr interrupt_line;恢复中断掩码 mov ah,byte ptr irq_mask_0_7_table+bx not ah inal, 21h oral, ah out21h, al mov bx,word ptr interrupt_line mov ah,byte ptr irq_mask_8_15_table+bx not ah inal, 0a1h oral, ah out0a1h, al mov bx,word ptr interrupt_line;恢复原中断向量 mov al,byte ptr irq_vect+bx mov dx,ipreg mov cx,csreg mov ds,cx mov ah,25h int 21h mov ax,data;设置 tpc 卡中9054芯片io口,关闭中断 mov ds,ax mov dx,word ptr io_9054base_address add dx,68h in ax,dx and ax,0f7ffh out dx,ax mov ax,4c00h int 21h;退出;-int_proc proc far ;修改后的中断服务子程序(改变进位的条件);此中断服务子程序的类型设置为far调用,这里要特别注意.因为相对于中断发生时的运行;状态,此程序段与之不在同一代码段,所以应该定义为far类型.这样产生了另外一个问题,;在此程序段中若想调用此code段中以他过程,则那个过程也应该被定义为far调用,当然;可以简单的通过不使用过程调用解决.以解决此中断子程序过程和其他普通过程对对应过程;的调用冲突 cli push ax push bx push cx push dx push si push di push ds mov ax,data ;interrupt to do mov ds,ax dec count jnz ddd mov count,20 mov di,offset ctime mov al,di+4 mov ah,0ah mul ah add al,di+5 cmp ax,59 ;先判断秒钟是否等于59秒,是则判断分钟,否则加1 jz fenzhong inc byte ptr di+5 cmp byte ptr di+5,0ah jnz ddd mov byte ptr di+5,00h inc byte ptr di+4 jmp dddfenzhong: mov word ptr di+4,0000h ;先将秒钟置为0,再转换分钟为十进制形式 mov al,di+2 mov ah,0ah mul ah add al,di+3 cmp ax,59 ;判断是否应该向时钟进位 jz shizhong inc byte ptr di+3 cmp byte ptr di+3,0ah jnz ddd mov byte ptr di+3,00h inc byte ptr di+2 jmpdddshizhong: mov word ptr di+2,0000 mov al,di mov ah,0ah mul ah add al,di+1 cmp ah,23 ;判断时钟该不该循环了 jnz qqq mov word ptr di,0000h jmp dddqqq: inc byte ptr di+1 cmp byte ptr di+1,0ah jnz ddd mov byte ptr di+1,00h inc byte ptr diddd:;将闹铃功能键与闹铃条件的判断放在20次中断计数条件满足后的执行代码中;有效缩短延迟时间以及误差时间 cmp byte ptr mybell,00h ;检测闹铃有没有开, jz zzz lea di,ctime lea si,clock mov cx,5check: ;检测门铃时间是否到了 mov al,di mov bl,si cmp al,bl jnz zzz inc di inc si loop check ;* 闹铃时的检测输出 mov dl,07h mov ah,02h int 21h lea dx,mess1 mov ah,09h int 21h mov byte ptr mybell,00h zzz: mov al,20h ;send eoi out 0a0h,al out 20h,al mov cx,0ffffhloopx: nop loop loopx ;延时 pop dspop di pop si pop dx pop cx pop bx pop ax sti iretint_proc endp;-key proc near ;ab口端口读取的控制,是对小键盘的控制 push cxkst: mov al,82h mov dx,word ptr io_base_address add dx,p55ctl out dx,al mov al,00h mov dx,word ptr io_base_address add dx,pa55 out dx,al mov dx,word ptr io_base_address add dx,pb55 in al,dx or al,0f8h cmp al,0ffh jz delay push ax mov cx,0a00h ;两重循环dly: mov ax,word ptr const1dly1: dec ax jnz dly1 dec cx jnz dly pop ax mov cl,08h mov ah,0fehscan1: mov dx,word ptr io_base_address;行列扫描,得到小键盘输入 add dx,pa55 mov al,ah out dx,al mov dx,word ptr io_base_address add dx,pb55 in al,dx or al,0f8h cmp al,0ffh jnz keyn rol ah,1 dec cl jnz scan1 jmp kstkeyn: push ax mov dx,word ptr io_base_address add dx,pb55relea: in al,dx or al,0f8h cmp al,0ffh jnz relea pop ax not ax mov si,offset table1 mov di,offset char mov cx,24tt: cmp ax,si jz nn dec cx jz kst add si,02 inc di jmp ttnn: mov dl,di mov char1,dl mov ah,02h int 21h pop cx jmp yangdelay: call disply jmp kstyang: retkey endp;-disply proc near ;led的显示部分 push cx mov bx,offset led mov cx,0006 mov si,offset ctime mov ah,01hdisply1: cld lodsb xlat mov dx,word ptr io_base_address add dx,portseg out dx,al mov al,ah mov dx,word ptr io_base_address add dx,portbit out dx,al shl ah,1 mov al,00 out dx,al loop disply1 pop cx retdisply endp;-cpro proc near ;c键按下时执行的过程,显示预设时间 cli mov word ptr ctime,0201h mov word ptr ctime+2,0504h mov word ptr ctime+4,0703h retcpro endp;-gpro proc near ;g键按下时执行的过程,开中断,计时开始 sti retgpro endp;-dpro proc near ;d键按下时执行的过程,关中断,计时停止 cli retdpro endp;-ppro proc near ;时间设置的过程 cli push ax push bx mov word ptr ctime,0c0ch mov word ptr ctime+2,0c0ch mov word ptr ctime+4,0c0ch call disply call key mov dl,char1 cmp dl,2 ;首位判断是否小于2 jng next1 jmp err1next1: cmp dl,2 ;第一位是否为1,是则判断第二位是否小于3 jnz normal sub dl,30h mov ctime,dl call key mov dl,char1 cmp dl,3 jng next2 jmp err1normal: sub dl,30h mov ctime,dl call disply call key mov dl,char1 cmp dl,9 ;第三位的判断,如此直到第六位 jng next2 jmp err1next2: sub dl,30h mov ctime+1,dl call disply call key mov dl,char1 cmp dl,5 jng next3 jmp err1next3: sub dl,30h mov ctime+2,dl call disply call key mov dl,char1 cmp dl,9 jng next4 jmp err1next4: sub dl,30h mov ctime+3,dl call disply call key mov dl,char1 cmp dl,5 jng next5 jmp err1next5: sub dl,30h mov ctime+4,dl call disply call key mov dl,char1 cmp dl,9 jng next6 jmp err1next6: sub dl,30h mov ctime+5,dl call disply jmp ww err1: mov word ptr ctime,0a0bh ;输入不全规范时输出,e mov word ptr ctime+2,0a0ah mov word ptr ctime+4,0a0ah call displyww: pop bx pop ax retppro end

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论