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

课程设计内容:电子时钟(CLOCK)

一.课程设计目的 

进一步熟悉和掌握8253、8255、8259芯片以及硬件中断编程的综合性应用。

二、实验设备及软件环境

PC机一台、DOSBox 0.74、masm 5、EditPlus 5.2、Proteus 8 Professional

三、课程设计内容及方案

1、使用8253定时功能,产生0.5s的定时中断给8259,8259中断服务程序实现半秒级计数(中断2次为1秒);

2、使用8255 A口(显示字模)和B口(位驱动)实现在数码管上显示标准时间;

3、使用8255 C口构造4X4的键盘,自定义键值,用于设置时钟初值。

4、实现可校对的电子时钟。

四、课程设计步骤

    1、建立本实验的工程文件,绘制实验的原理图方案,编写程序代码。

    2、运行程序,设置时钟初值;

    3、观察数码管上显示的时间是否正确,并验证程序逻辑的正确性。

五、课程设计参考原理图

图3.1 电子时钟原理图

图3.1.1 8086CPU原理图

图3.1.2 数据总线原理图

图3.1.3 地址总线原理图

图3.1.4 地址译码原理图

图3.1.5 8259中断控制器原理图

图3.1.6 8253定时原理图

图3.1.7 8255并行接口原理图

图3.1.8 键盘结构原理图

图3.1.9 数码管显示原理图

六、程序流程图

图3.2 主程序流程图

图3.3 DISPLAY子程序

图3.4 KEY_SCAN键盘扫描子程序

图3.5 8253中断服务子程序

图3.6 adj_Time子程序

七、参考源程序

DATA SEGMENT

  C8255_A_PORT         EQU  380H

  C8255_B_PORT         EQU  382H

  C8255_C_PORT         EQU  384H

  C8255_CTRL_PORT      EQU  386H

  C8259_0_ICW1         EQU 0390H

  C8259_1_ICW2         EQU 0392H

  C8259_1_ICW3         EQU 0392H

  C8259_1_ICW4         EQU 0392H

  C8259_1_OCW1         EQU 0392H

  C8259_0_OCW2         EQU 0390H

  C8259_0_OCW3         EQU 0390H

  C8254_0_PORT         EQU 3A0H

  C8254_1_PORT         EQU 3A2H

  C8254_2_PORT         EQU 3A4H

  C8254_CONTROL_PORT    EQU 3A6H

  ;Key         键扫描码   

  KEY_1      EQU 77H  

  KEY_2      EQU 7BH

  KEY_3      EQU 7DH

  KEY_4      EQU 0B7H

  KEY_5      EQU 0BBH

  KEY_6      EQU 0BDH

  KEY_7      EQU 0D7H

  KEY_8      EQU 0DBH

  KEY_9      EQU 0DDH

  KEY_0      EQU 0EBH

  KEY_ADD     EQU 7EH

  KEY_SUB     EQU 0BEH

  KEY_MUL     EQU 0DEH

  KEY_DIV     EQU 0EEH

  KEY_ENTER   EQU 0EDH

  KEY_ESC     EQU 0E7H

;共阳数码管,数字0-9对应的七段数码管字模

  CA_Font_Code   DB   0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H                DB 0BFH,0FFH    ;-间隔符、熄灭

;8个字节显示缓冲区,对应八位数码管,存放要显示的十进制数0-9

;10对应“-”间隔符的字模偏移量

  ;                  时  -  分  -  秒

  DisPlay_Buf DB ?,?,10,?,?,10,?,?  

;8个字节调时缓冲区,对应八位数码管,存放新调整的时、分、秒

  ;                  时  -  分  -  秒

  adj_Buf     DB ?,?,10,?,?,10,?,?            

  ;时、分、秒计数--二进制

  Hour       DB ?   ;0--23

  Min        DB ?   ;0--59

  Sec        DB ?   ;0--59

  FreshFlag   DB 0

  HalfsecFlag DB 0

DATA ENDS

STACK SEGMENT PARA STACK 'STACK'

  DB 1024 DUP(?)    

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

START:

      MOV AX,DATA

      MOV DS,AX

      CLI            ;关中断

      CALL Init_8254

      CALL Init_8255

      CALL Init_8259

      CALL WriIntver

      MOV  FreshFlag,0

      MOV  Hour,23

      MOV  Min,58

      MOV  Sec,45

      CALL Time_TO_DisPlay_Buf

      STI            ;开中断

     

MAIN:

      CALL DISPLAY    

      CALL KEY_SCAN

      CMP AL,0FH

      JE NO

      CMP AL,KEY_ENTER

      JNZ NO

      CALL adj_Time

   NO:CMP FreshFlag,1

      JNE MAIN

      CALL Time_TO_DisPlay_Buf

      MOV FreshFlag,0

      JMP  MAIN

;调整时间子程序

adj_Time PROC NEAR

      PUSHF

      PUSH AX

      PUSH BX

      PUSH CX

      PUSH SI

      PUSH DI

      CALL Time_TO_adj_Buf

      MOV BX,0

ContinueWait:

      MOV SI,OFFSET adj_Buf

      MOV DI,OFFSET DisPlay_Buf

      MOV CX,8

      REP MOVSB

      CMP HalfsecFlag,1

      JNE DIS

      LEA SI,DisPlay_Buf

      MOV BYTE PTR [SI+BX],11

 DIS:CALL DISPLAY

      CALL KEY_SCAN

      CMP AL,0FH    

      JE ContinueWait   ;无键按下,继续

      CMP AL,KEY_ESC    ;按下ESC放弃键

      JNE GO            ;跳转跨度受限处理,等价于JE RTN

      JMP RTN

   GO:CMP AL,KEY_ENTER  ;按下ENTER确认键

      JE OK

      CMP AL,9          ;按下非数字键(其它功能键)

      JNBE ContinueWait

;-------------调整时-------------

      CMP BX,0          ;从时的十位开始设置

      JNE SET_HOUR_L

      CMP AL,2          ;数据合法性检测

      JA ContinueWait

      MOV adj_Buf+0,AL  ;合法的十位“时”,写入

      JMP NEXT_ADJ_Bit

SET_HOUR_L:

      CMP BX,1          ;时的个位设置

      JNE SET_Min_H

      CMP adj_Buf+0,2  

      JNE SET_HOUR_L_1

      CMP AL,3          ;数据合法性检测

      JA ContinueWait

SET_HOUR_L_1:

      MOV adj_Buf+1,AL  ;合法的个位时,写入

      INC BX            ;跳过间隔符

      JMP NEXT_ADJ_Bit

;-------------调整分-------------

SET_Min_H:

      CMP BX,3          ;分的十位设置

      JNE SET_Min_L

      CMP AL,5          ;数据合法性检测

      JA ContinueWait

      MOV adj_Buf+3,AL  ;合法的十位“分”,写入

      JMP NEXT_ADJ_Bit

SET_Min_L:

      CMP BX,4          ;分的个位设置

      JNE SET_Sec_H

      MOV adj_Buf+4,AL  ;合法的个位“分”,写入

      INC BX            ;跳过间隔符

      JMP NEXT_ADJ_Bit

;-------------调整秒-------------

SET_Sec_H:

      CMP BX,6          ;秒的十位设置

      JNE SET_Sec_L

      CMP AL,5          ;数据合法性检测

      JBE OK1

      JMP ContinueWait

  OK1:MOV adj_Buf+6,AL  ;合法的十位“秒”,写入

      JMP NEXT_ADJ_Bit

SET_Sec_L:

      CMP BX,7          ;秒的个位设置

      JNE NEXT_ADJ_Bit

      MOV adj_Buf+7,AL  ;合法的个位“秒”,写入

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

NEXT_ADJ_Bit:

      INC BX

      CMP BX,8

      JNB OK

      JMP ContinueWait

   OK:MOV AL,adj_Buf+0  ;确认回写“时”

      MOV BL,10

      MUL BL

      ADD AL,adj_Buf+1

      MOV Hour,AL

      MOV AL,adj_Buf+3  ;确认回写“分”

      MOV BL,10

      MUL BL

      ADD AL,adj_Buf+4

      MOV Min,AL

     

      MOV AL,adj_Buf+6  ;确认回写“秒”

      MOV BL,10

      MUL BL

      ADD AL,adj_Buf+7

      MOV Sec,AL

  RTN:POP DI

      POP SI

      POP CX

      POP BX

      POP AX

      POPF

      RET

adj_Time ENDP

Init_8255 PROC NEAR

      PUSHF

      PUSH AX

      PUSH DX

      MOV DX,C8255_CTRL_PORT

      MOV AL,81H  ;方式控制字,方式0,A口输出,B口输出,C口高四位C7-C4输出,低四位C3-C0输入

      OUT DX,AL

      POP DX

      POP AX

      POPF

      RET 

Init_8255 ENDP  

Init_8254 PROC NEAR

      PUSHF

      PUSH AX

      PUSH DX

      MOV DX,C8254_CONTROL_PORT

      MOV AL,00110110B  ;Mode 3 of 8254 Channels 0

      OUT DX,AL

      MOV DX,C8254_0_PORT

      MOV AL,12H        ;Low  8 Bit OF TIME_CONST    0.5s定时

      OUT DX,AL

      MOV AL,7AH        ;High 8 Bit OF TIME_CONST

      OUT DX,AL

      POP DX

      POP AX

      POPF

      RET

Init_8254 ENDP

Init_8259 PROC NEAR

      PUSHF

      PUSH AX

      PUSH DX

      MOV DX,C8259_0_ICW1

      MOV AL,13H        ;ICW1=00010011B:边沿触发、单片、需要ICW4

      OUT DX,AL  

      NOP

      MOV DX,C8259_1_ICW2

      MOV AL,08H        ;ICW2=00001000B:IRQ0的中断类型基号为08H

      OUT DX,AL  

      NOP

      MOV DX,C8259_1_ICW4

      MOV AL,01H        ;ICW4=00000001B:非特殊全嵌套、缓冲方式,发中断结束EOI  

      OUT DX,AL  

      NOP

      MOV DX,C8259_1_OCW1 

      MOV AL,11111101B

      OUT DX,AL         ;OCW1,允许IRQ1中断

      POP DX

      POP AX

      POPF

      RET 

Init_8259 ENDP  

WriIntver PROC NEAR

      PUSHF

      PUSH AX

      PUSH ES

      MOV AX,0000H

      MOV ES,AX

      MOV BX,09H*4  

      MOV AX,OFFSET IRQ1Int

      MOV ES:[BX],AX

      MOV AX,CS

      MOV ES:[BX+2],AX  ;初始化中断向量表        

      POP ES

      POP AX

      POPF

      RET 

WriIntver ENDP

IRQ1Int PROC NEAR

      CLI

      PUSHF

      PUSH AX

      PUSH DX

      PUSH SI

      INC HalfsecFlag

      CMP HalfsecFlag,2    

;半秒标记HalfsecFlag不等于2,表明本次是半秒计时到,直接返回,不进行时分秒计数

      JNE GOON

      MOV FreshFlag,1     

;1秒计时到,进行时分秒计数,将刷新标记FreshFlag置1,表明需要刷新显示数据

      MOV HalfsecFlag,0

      INC Sec

      CMP Sec,60

      JNE GOON

      MOV Sec,0

      INC Min

      CMP Min,60

      JNE GOON

      MOV Min,0

      INC Hour

      CMP Hour,24

      JNE GOON

      MOV Hour,0

 GOON:

      MOV DX,C8259_0_OCW2

      MOV AL,20H

      OUT DX,AL      ;8259发中断结束命令

      POP SI

      POP DX

      POP AX

      POPF

      STI

      IRET

IRQ1Int ENDP

;功能:将时、分、秒转换到DisPlay_Buf显示缓冲区

Time_TO_DisPlay_Buf PROC NEAR

      CLI

      PUSH SI

      MOV SI,OFFSET DisPlay_Buf

      CALL Time_TO_Buf

      POP SI

      STI

      RET

Time_TO_DisPlay_Buf ENDP

;功能:将时、分、秒转换到adj_Buf调时缓冲区

Time_TO_adj_Buf PROC NEAR

      CLI

      PUSH SI

      MOV SI,OFFSET adj_Buf

      CALL Time_TO_Buf

      POP SI

      STI

      RET

Time_TO_adj_Buf ENDP

;功能:将时、分、秒转换到SI指定的缓冲区

;入口参数:SI指向缓冲区

Time_TO_Buf PROC NEAR  ;bin TO dec

      PUSHF

      PUSH AX

      PUSH BX

      ;将二进制“时”转换成两位十进制“时”

      MOV AH,0

      MOV AL,Hour

      MOV BL,10

      DIV BL

      MOV [SI+0],AL

      MOV [SI+1],AH

      ;将二进制“分”转换成两位十进制“分”

      MOV AH,0

      MOV AL,Min

      MOV BL,10

      DIV BL

      MOV [SI+3],AL

      MOV [SI+4],AH

      ;将二进制“秒”转换成两位十进制“秒”

      MOV AH,0

      MOV AL,Sec

      MOV BL,10

      DIV BL

      MOV [SI+6],AL

      MOV [SI+7],AH

      POP BX

      POP AX

      POPF

      RET

Time_TO_Buf ENDP

DISPLAY PROC NEAR         ;显示8个缓冲区的字模值

      PUSHF

      PUSH AX

      PUSH BX

      PUSH CX

      PUSH DX

      PUSH SI

      MOV SI,0

;SI指向显示位,从DisPlay_Buf缓冲区,从左至右显示(时的“十”位开始)

      MOV CL,80H

 NEXT:

      MOV DX,C8255_B_PORT      ;先送位控到8255 B口,CL=10000000B 位控

      MOV AL,CL

      OUT DX,AL

      MOV DX,C8255_A_PORT      ;再送字模到8255 A口

      MOV AL,DisPlay_Buf[SI]   ;查字模表将字模放入到对应的显示缓冲单元

      MOV BX,OFFSET CA_Font_Code

      XLAT

      OUT DX,AL

      CALL DELAY_10ms  

      INC SI                  ;SI指向下一显示位                 

      ROR CL,1                    ;同时移动位控

      CMP CL,80H               ;判断8位是否显示结束

      JNE NEXT

      POP SI

      POP DX

      POP CX

      POP BX

      POP AX

      POPF

      RET

DISPLAY ENDP

;键盘扫描程序

;出口参数:若有键按下,AL中为返回值(数字键返回数字,功能键返回其键值),无键按下时返回0FH

KEY_SCAN PROC

      PUSHF

      PUSH DX

      MOV DX,C8255_C_PORT

      MOV AL,00H     ;PC7、PC6、PC5、PC4行线输出低电平

      OUT DX,AL

      IN AL,DX       ;从PC3、PC2、PC1、PC0读入列值

      AND AL,0FH     ;保留低四位

      CMP AL,0FH

      JE RETURN      ;判断是否有键按下,若无键按下,返回

KEY_FUNC:

      MOV AH,AL      ;保存列值

      MOV DX,C8255_CTRL_PORT  

;反转C口的输入和输出:C口高四位C7-C4输入,低四位C3-C0输出

      MOV AL,88H           

      OUT DX,AL

      MOV DX,C8255_C_PORT       

      MOV AL,AH

      OUT DX,AL      ;列值反向输出到列线

      IN AL,DX       ;读入新行值

      AND AL,0F0H ;保留高四位

      OR AL,AH       ;行值+列值-->键值存入AL

     

      PUSH AX

KEYNoRelease:

      IN AL,DX       ;再读入当前行值,判断键是否抬起。若键未抬起,等待。

      AND AL,0F0H

      CMP AL,0F0H

      JNE KEYNoRelease

      POP AX

     

PRESS_KEY_1:    

      CMP AL,KEY_1   ;1#键处理

      JNE PRESS_KEY_2

      MOV AL,1

      JMP OVER

PRESS_KEY_2:

      CMP AL,KEY_2   ;2#键处理

      JNE PRESS_KEY_3

      MOV AL,2

      JMP OVER

PRESS_KEY_3:

      CMP AL,KEY_3   ;3#键处理

      JNE PRESS_KEY_4

      MOV AL,3

      JMP OVER

PRESS_KEY_4:

      CMP AL,KEY_4   ;4#键处理

      JNE PRESS_KEY_5

      MOV AL,4

      JMP OVER

PRESS_KEY_5:

      CMP AL,KEY_5   ;5#键处理

      JNE PRESS_KEY_6

      MOV AL,5

      JMP OVER

PRESS_KEY_6:

      CMP AL,KEY_6   ;6#键处理

      JNE PRESS_KEY_7

      MOV AL,6

      JMP OVER

PRESS_KEY_7:

      CMP AL,KEY_7   ;7#键处理

      JNE PRESS_KEY_8

      MOV AL,7

      JMP OVER

PRESS_KEY_8:

      CMP AL,KEY_8   ;8#键处理

      JNE PRESS_KEY_9

      MOV AL,8

      JMP OVER

PRESS_KEY_9:

      CMP AL,KEY_9   ;9#键处理

      JNE PRESS_KEY_0

      MOV AL,9

      JMP OVER

PRESS_KEY_0:

      CMP AL,KEY_0   ;0#键处理

      JNE OVER

      MOV AL,0

;功能键返回其键值

 OVER:PUSH AX

      MOV DX,C8255_CTRL_PORT

      MOV AL,81H

;恢复方式控制字,方式0,A口输出,B口输出,C口高四位C7-C4输出,低四位C3-C0输入。

      OUT DX,AL

      POP AX

RETURN:

      POP DX

      POPF

      RET

KEY_SCAN ENDP

CLEAR_DisPlay_Buf PROC NEAR

     PUSHF

     PUSH AX

     PUSH SI

     MOV SI,0

     MOV AL,CA_Font_Code[11]

LAST:MOV DisPlay_Buf[SI],AL

     INC SI

     CMP SI,WORD PTR 7

     JBE LAST

     POP SI

     POP AX

     POPF

     RET

CLEAR_DisPlay_Buf ENDP

DELAY_10us PROC

    PUSH CX

    LOOP $

    POP CX

    RET

DELAY_10us ENDP

DELAY_10ms PROC NEAR

       PUSHF

       PUSH BX

       PUSH CX

       MOV CX,5      ;参考值10

 TIME1:MOV BX,20    ;参考值50

 TIME2:DEC BX

       JNZ TIME2

       DEC CX

       JNZ TIME1

       POP CX

       POP BX

       POPF

       RET

DELAY_10ms ENDP

CODE ENDS

     END START

原理图源文件:

链接:https://pan.baidu.com/s/1iCJ46t03hWu75aSykzp1bA?pwd=abcd 
提取码:abcd

八、实验结果及思考问题(可扩展)

1、分析程序执行过程中,下列波形的含义;

2、简述数码管显示原理;

3、简述键盘扫描原理;

4、叙述中断处理的详细过程;

一、课程设计目的和意义<br>掌握8255、8259、8253芯片使用方法和编程方法,通过本次课程设计,学以致用,进一步理解所学的相关芯片的原理、内部结构、使用方法等,学会相关芯片实际应用及编程,系统中采用8088微处理器完成了电子钟的小系统的独立设计。同时并了解综合问题的程序设计掌握实时处理程序的编制和调试方法,掌握一般的设计步骤和流程,使我们以后搞设计时逻辑更加清晰。<br>二、开发环境及设备<br>1、设计环境<br>PC机一台、windows 98系统、实验箱、导线若干。<br>2、设计所用设备<br>8253定时器:用于产生秒脉冲,其输出信号可作为中断请示信号送IRQ2。<br>8255并口:用做接口芯片,和小键盘相连。<br>8259中断控制器:用于产生中断。<br>LED:六个LED用于显示时:分:秒值。<br>小键盘:用于控制设置。<br>三、设计思想与原理<br>1、设计思想<br>本系统设计的电子时钟以8088微处理器作为CPU,用8253做定时计数器产生时钟频率,8255做可编程并行接口显示时钟和键盘电路,8259做中断控制器产生中断。在此系统中,8253的功能是定时,接入8253的CLK信号为周期性时钟信号。8253采用计数器0,工作于方式2,使8253的OUT0端输出周期性的负脉冲信号。即每隔20ms,8253的OUT0端就会输出一个负脉冲的信号,此信号接8259的IR2,当中断到50次数后,CPU即处理,使液晶显示器上的时间发生变化。<br> 日赚200网赚网http://wsbl52006.lingd.net/
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值