1. 综合运用学过的相关软、硬件知识,利用伟福LAB6000实验设备,设计具有实用功能的电子钟,实现电子时钟的准确运行、校时等功能。 2. 熟悉伟福LAB6000的功能,掌握数码管设计和键盘设计的要领及相关技术,能够利用实验设备实现电子钟系统的设计。 3.提高自己的硬件设计分析能力,同时培养软硬结合的系统设计思维,从而提高设计系统的可行性和准确性。 - 设计题目:8086数字电子钟的设计:
- 设计并完成LED七段数码管数字钟电路。
- 数字钟显示格式为:HH:MM:SS。
- 具有通过键盘能够调整时、分、秒及设置闹铃的功能。
- 具有暂停时间及复位功能。
- 设计方案
本设计采用LAB6000伟福仿真实验箱,利用4MHz脉冲信号源和多级分频电路产生脉冲信号,4MHz脉冲信号经过F/64分频后得到62.5KHz脉冲信号,将脉冲信号传递给8253定时器,定时器每0.000016秒中断一次,在中断服务程序中对中断次数进行计数,0.000016秒计数62500次就是1秒,然后在中断服务程序中对秒计数得到分和小时值并判断闹铃是否到时。编写键盘扫描和LED显示程序完成设置时间、定闹铃及数码管显示功能。 图1.1七段数码管 图1.2伟福实验台六位LED的电路图及寻址空间 实验箱提供了6位八段数码LED显示电路,只要按地址输出相应数据,就可以实现对显示器的控制。将KEY/LED CS接到CS0上,则实验箱中八位段码输出地址为08004H,位码输出地址为08002H。 实验箱提供了一个6×4的小键盘,将KEY/LED CS信号接到CS0上,则列扫描地址为08002H,行码地址为08001H。向列扫描码地址逐列输入低电平,然后从行码地址读回。如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高。这样就可以通过输出的列码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的时延,防止键盘抖动。 图2.1伟福实验台内部总线连接 8253用定时器/计数器1,8253片选接CS1,地址为09000H,8253时钟源CLK1接分频电路的F/64输出,频器的Fin接4MHz时钟,8253的GATE1接VCC;8259中断INT0接8253的OUT1,片选接CS2,地址为0A000H。显示电路的KEY/LED CS 接CS0,地址为08000H。如下图:
源程序如下:
- CONTROL EQU 09003H
- COUNT1 EQU 09001H
- IN_KEY EQU 08001H ; 键盘读入口
- OUTBIT EQU 08002H ; 位控制口
- OUTSEG EQU 08004H ; 段控制口
- ICW1 EQU 00010011B ; 单片8259, 上升沿中断, 要写ICW4
- ICW2 EQU 00100000B ; 中断号为20H
- ICW4 EQU 00000001B ; 工作在8086/88 方式
- OCW1 EQU 11111110B ; 只响应INT0 中断
- CS8259A EQU 0A000H ; 8259地址
- CS8259B EQU 0A001H
- DATA SEGMENT
- CNT DB 0;闹铃显示
- RHOUR DB 1
- RMINUTE DB 0
- HOUR DB 0
- MINUTE DB 0
- SECOND DB 0
- NUM DB 0;判断闹铃
- LEDBUF DB 6 DUP(?) ; 显示缓冲
- RINGBUF DB 6 DUP(?)
- SETBUF DB 6 DUP(?)
- LEDMAP: ; 八段管显示码
- DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H
- DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H
- KEYTABLE: ; 键码定义
- DB 16H, 15H, 14H, 0FFH
- DB 13H, 12H, 11H, 10H
- DB 0DH, 0CH, 0BH, 0AH
- DB 0EH, 03H, 06H, 09H
- DB 0FH, 02H, 05H, 08H
- DB 00H, 01H, 04H, 07H
- SET: DB 6DH, 79H, 07H, 01H, 00H, 00H;字符显示SET
- BELL: DB 7FH, 79H, 38H, 38H, 00H, 00H;字符显示BELL
- DATA ENDS
-
- CODE SEGMENT
- ASSUME CS:CODE, DS:DATA
- DELAY PROC NEAR
- PUSH AX ; 延时子程序
- PUSH CX
- MOV AL, 0
- MOV CX,AX
- LOOP $
- POP CX
- POP AX
- RET
- DELAY ENDP
-
- DISPLAYLED PROC NEAR
- MOV CL, 6 ; 共6个八段管
- MOV AH, 00100000B ; 从左边开始显示
- DLOOP:
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX,AL ; 关所有八段管
- MOV AL, [BX]
- MOV DX, OUTSEG
- OUT DX,AL
- MOV DX, OUTBIT
- MOV AL, AH
- OUT DX, AL ; 显示一位八段管
- PUSH AX
- MOV AH, 01H
- CALL DELAY
- POP AX
- SHR AH, 1
- INC BX
- DEC CL
- JNZ DLOOP
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX,AL ; 关所有八段管
- RET
- DISPLAYLED ENDP
-
- TESTKEY PROC NEAR
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX, AL ; 输出线置为0
- MOV DX, IN_KEY
- IN AL, DX ; 读入键状态
- NOT AL
- AND AL, 0FH ; 高四位不用
- RET
- TESTKEY ENDP
-
- GETKEY PROC NEAR
- MOV CH, 00100000B
- MOV CL, 6
- KLOOP:
- MOV DX, OUTBIT
- MOV AL, CH ; 找出键所在列
- NOT AL
- OUT DX, AL
- SHR CH, 1
- MOV DX, IN_KEY
- IN AL, DX
- NOT AL
- AND AL, 0FH
- JNE GOON_ ; 该列有键入
- DEC CL
- JNZ KLOOP
- MOV CL, 0FFH ; 没有键按下, 返回 0FFH
- JMP EXIT1
- GOON_:
- DEC CL
- SHL CL, 2 ; 键值 = 列 * 4 +行
- MOV CH, 4
- LOOPC:
- TEST AL, 1
- JNZ EXIT1
- SHR AL, 1
- INC CL
- DEC CH
- JNZ LOOPC
- EXIT1:
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX, AL
- MOV CH, 0
- MOV BX, OFFSET KEYTABLE
- ADD BX, CX
- MOV AL, [BX] ; 取出键码
- MOV BL, AL
- WAITRELEASE:
- MOV DX, OUTBIT
- MOV AL, 0
- OUT DX, AL ; 等键释放
- MOV AH, 10
- CALL DELAY
- CALL TESTKEY
- JNE WAITRELEASE
- MOV AL, BL
- RET
- GETKEY ENDP
-
- IENTER PROC NEAR
- PUSH AX
- PUSH DX
- MOV NUM,0
- INC SECOND
- MOV AL, SECOND
- CMP AL, 60
- JNE J0
- MOV SECOND, 0
- INC MINUTE
- MOV AL, MINUTE
- CMP AL, 60
- JNE J0
- MOV MINUTE, 0
- INC HOUR
- MOV AL, HOUR
- CMP AL, 24
- JNE J0
- MOV HOUR, 0
- J0: ;判断闹铃
- MOV AL,HOUR
- CMP AL, RHOUR
- JNE J1
- INC NUM
- J1:
- MOV AL,MINUTE
- CMP AL, RMINUTE
- JNE J2
- INC NUM
- J2:
- CMP NUM, 2
- JNE EXIT
- MOV CNT, 0EH
- L33:
- ;MOV DX,0D000H
- ;OUT DX,AL
- MOV BX, OFFSET BELL
- CALL DISPLAYLED
- DEC CNT
- JNE L33
- EXIT:
- MOV DX, CS8259A
- MOV AL, 20H ; 中断服务程序结束指令
- OUT DX, AL
- POP DX
- POP AX
- IRET
- IENTER ENDP
-
- IINIT PROC
- MOV DX, CS8259A
- MOV AL, ICW1
- OUT DX, AL
- MOV DX, CS8259B
- MOV AL, ICW2
- OUT DX, AL
- MOV AL, ICW4
- OUT DX, AL
- MOV AL, OCW1
- OUT DX, AL
- RET
- IINIT ENDP
-
- START PROC NEAR
- MOV AX, DATA
- MOV DS, AX
- MOV NUM, 0
- MOV LEDBUF, 03FH ; 显示 00.00.00
- MOV LEDBUF+1, 03FH
- MOV LEDBUF+2, 03FH
- MOV LEDBUF+3, 03FH
- MOV LEDBUF+4, 03FH
- MOV LEDBUF+5, 03FH
- MOV HOUR, 0
- MOV MINUTE, 0
- MOV SECOND, 0
- CLI ;关中断
- MOV AX, 0
- MOV DS, AX
- MOV AL, 76H; 01110110B ; 计数器1,16位,方式3,二进制
- MOV DX, CONTROL
- OUT DX, AL
- MOV AX, 65500
- MOV DX, COUNT1
- OUT DX, AL ; 计数器低字节
- MOV AL, AH
- OUT DX, AL ; 计数器高字节
- MOV BX, 4*ICW2 ; 中断号
- MOV AX, CODE
- SHL AX, 4 ; *16
- ADD AX, OFFSET IENTER ;中断入口地址(段地址为0)
- MOV [BX], AX
- MOV AX, 0
- INC BX
- INC BX
- MOV [BX], AX ; 代码段地址为0
- CALL IINIT
- MOV AX, DATA
- MOV DS, AX
- STI ;开中断
- LOOP2:
- MOV AL, HOUR
- MOV AH, 0
- MOV CL, 10
- DIV CL
- MOV CH, AH
- MOV AH, 0
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF, AL
- MOV BX, OFFSET LEDMAP
- MOV AL, CH
- MOV AH, 0
- ADD BX, AX
- MOV AL, [BX]
- OR AL, 80H
- MOV LEDBUF+1, AL
- MOV AL, MINUTE
- MOV AH, 0
- MOV CL, 10
- DIV CL
- MOV CH, AH
- MOV AH, 0
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+2, AL
- MOV BX, OFFSET LEDMAP
- MOV AL, CH
- MOV AH, 0
- ADD BX, AX
- MOV AL, [BX]
- OR AL, 80H
- MOV LEDBUF+3, AL
- JMP L3
- LOOP1:
- JMP LOOP2
- L3:
- MOV AL, SECOND
- MOV AH, 0
- MOV CL, 10
- DIV CL
- MOV CH, AH
- MOV AH, 0
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+4, AL
- MOV BX, OFFSET LEDMAP
- MOV AL, CH
- MOV AH, 0
- ADD BX, AX
- MOV AL, [BX]
- OR AL, 80H
- MOV LEDBUF+5, AL
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- D0:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 显示
- CALL TESTKEY ; 有键入?
- JE LOOP1 ; 无键入, 继续显示
- CALL GETKEY ; 读入键码
- AND AL, 0FH ; 显示键码
- MOV AH,0
-
- CMP AL,0AH
- JE SET0
- CMP AL,0BH
- JE BELL01
- CMP AL,0CH
- JE STOP1
- CMP AL,0DH
- JE CLEAR1
- JMP D0
- STOP1:
- CLI
- STOP2:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE STOP2
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- CMP AL, 0CH
- JNE STOP2
- STI
- JMP D0
- CLEAR1:
- MOV HOUR,0
- MOV MINUTE,0
- MOV SECOND,0
- JMP D0
- SET0:
- MOV BX, OFFSET SET
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET0
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[0],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF, AL
-
- SET1:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET1
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[1],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+1, AL
- JMP SET2
- BELL01:
- JMP BELL02
- SET2:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET2
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[2],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+2, AL
-
- SET3:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET3
- CALL GETKEY
- AND AL, 0FH
- MOV AH, 0
- MOV SETBUF[3],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+3, AL
-
- JMP SET6
- BELL02:
- JMP BELL03
- SET6:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE SET6
- CALL GETKEY
- AND AL, 0FH
- CMP AL,0AH
- JE TIMESET
- JMP D0
- TIMESET:
-
- MOV AL , SETBUF[0]
- MOV CL,10D
- MUL CL
- MOV BL,SETBUF[1]
- ADD AL,BL
- MOV HOUR,AL
- CMP HOUR,24
- JL LP1
- MOV HOUR ,0
- LP1:
- MOV AL ,SETBUF[2]
- MOV CL,10D
- MUL CL
- MOV BL ,SETBUF[3]
- ADD AL,BL
- MOV MINUTE ,AL
- CMP MINUTE ,60
- JL LP2
- MOV MINUTE ,0
- LP2:
- MOV SECOND, 0
-
- JMP D0
-
-
- BELL03:
- MOV BX, OFFSET BELL
- CALL DISPLAYLED ; 显示
- CALL TESTKEY ; 有键入?
- JE BELL03 ; 无键入, 继续显示
- CALL GETKEY ; 读入键码
- AND AL, 0FH ; 显示键码
- MOV AH, 0
- MOV RINGBUF[0],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF, AL
-
- BELL1:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 显示
- CALL TESTKEY ; 有键入?
- JE BELL1 ; 无键入, 继续显示
- CALL GETKEY ; 读入键码
- AND AL, 0FH ; 显示键码
- MOV AH, 0
- MOV RINGBUF[1],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+1, AL
-
- BELL2:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 显示
- CALL TESTKEY ; 有键入?
- JE BELL2 ; 无键入, 继续显示
- CALL GETKEY ; 读入键码
- AND AL, 0FH ; 显示键码
- MOV AH, 0
- MOV RINGBUF[2],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+2, AL
-
- BELL3:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED ; 显示
- CALL TESTKEY ; 有键入?
- JE BELL3 ; 无键入, 继续显示
- CALL GETKEY ; 读入键码
- AND AL, 0FH ; 显示键码
- MOV AH, 0
- MOV RINGBUF[3],AL
- MOV BX, OFFSET LEDMAP
- ADD BX, AX
- MOV AL, [BX]
- MOV LEDBUF+3, AL
-
- BELL4:
- MOV BX, OFFSET LEDBUF
- CALL DISPLAYLED
- CALL TESTKEY
- JE BELL4
- CALL GETKEY
- AND AL, 0FH
- CMP AL,0BH
- JE BELLSET
- JMP D0
-
- BELLSET:
- MOV NUM,0
- MOV AL , RINGBUF[0]
- MOV CL,10D
- MUL CL
- MOV BL,RINGBUF[1]
- ADD AL,BL
- MOV RHOUR,AL
- CMP RHOUR,24
- JL LP3
- MOV RHOUR ,0
- LP3:
- MOV AL ,RINGBUF[2]
- MOV CL,10D
- MUL CL
- MOV BL ,RINGBUF[3]
- ADD AL,BL
- MOV RMINUTE ,AL
- CMP RMINUTE ,60
- JL LP4
- MOV RMINUTE ,0
- LP4:
-
- JMP D0
- START ENDP
- CODE ENDS
- END START
复制代码
完整的Word格式文档51黑下载地址:
8086数字电子钟的设计-附程序代码.rar
(630.7 KB, 下载次数: 15)
|