8086可调时钟仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- .MODEL SMALL
- .8086
- .stack
- .code
- .startup
- NMI_init: push es ;NMI不可屏蔽中断向量表初始化
- xor ax, ax
- mov es, ax
- mov al, 02h
- xor ah, ah
- shl ax, 1
- shl ax, 1
- mov si, ax
- mov ax, offset NMI_service
- mov es:[si], ax
- inc si
- inc si
- mov bx, cs
- mov es:[si], bx
- pop es
- ;定时/计数器初始化
- mov al,00110111b ;T0 16位 mode3 bcd
- mov dx,0406h ;控制口地址
- out dx,al
- mov dx,0400h ;T0地址
- mov ax,0100h ;100KHz 100分频 1KHz
- out dx,al
- mov al,ah ;高字节
- out dx,al
- mov al,10110101b ;T2 16位 mode2 bcd
- mov dx,0406h
- out dx,al
- mov dx,0404h
- mov ax,1000h ;1KHz 1000分频 1Hz
- out dx,al
- mov al,ah ;高字节
- out dx,al
- loop0: ;主任务
- call key
- call disp
- jmp loop0
-
- NMI_service: ;中断服务程序
- push ax
- mov al,sec
- add al,1
- daa
- mov sec,al
- cmp sec,60h
- jb exit
- mov sec,0
- mov al,min
- add al,1
- daa
- mov min,al
- cmp min,60h
- jb exit
- mov min,0
- mov al,hou
- add al,1
- daa
- mov hou,al
- cmp hou,12h
- jb exit
- mov hou,0
- exit: pop ax
- iret
- disp proc near
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov bl,sec
- and bx,000fh
- mov si,bx
- mov al,situation[si] ;段码
- mov dx,0200h
- out dx,al
- mov al,0feh ;秒个位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov bl,sec
- and bx,00f0h
- mov cl,4
- shr bx,cl
- mov si,bx
- mov al,situation[si] ;段码
- mov dx,0200h
- out dx,al
- mov al,0fdh ;秒十位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov al,40h ;段码
- mov dx,0200h
- out dx,al
- mov al,0fbh ;秒个位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov bl,min
- and bx,000fh
- mov si,bx
- mov al,situation[si] ;段码
- mov dx,0200h
- out dx,al
- mov al,0f7h ;分个位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov bl,min
- and bx,00f0h
- mov cl,4
- shr bx,cl
- mov si,bx
- mov al,situation[si] ;段码
- mov dx,0200h
- out dx,al
- mov al,0efh ;分十位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov al,40h ;段码
- mov dx,0200h
- out dx,al
- mov al,0dfh ;秒个位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov bl,hou
- and bx,000fh
- mov si,bx
- mov al,situation[si] ;段码
- mov dx,0200h
- out dx,al
- mov al,0bfh ;时个位
- mov dx,0201h
- out dx,al
- call delay
- mov al,0ffh ;不显示
- mov dx,0201h
- out dx,al
- mov bl,hou
- and bx,00f0h
- mov cl,4
- shr bx,cl
- mov si,bx
- mov al,situation[si] ;段码
- mov dx,0200h
- out dx,al
- mov al,07fh ;时十位
- mov dx,0201h
- out dx,al
- call delay
- ret
- disp endp
- key proc near
- mov dx,0600h
- in al,dx
- test al,01h
- jnz nexthou
- call disp ;消抖
- call disp
- call disp
- mov dx,0600h
- in al,dx
- test al,01h
- jnz nexthou
- mov al,min
- add al,1 ;分调整
- daa
- mov min,al
- cmp min,60H
- jb nexthou
- mov min,0
- nexthou: mov dx,0600h
- in al,dx
- test al,02h
- jnz exitkey
- call disp ;消抖
- call disp
- call disp
- mov dx,0600h
- in al,dx
- test al,02h
- jnz exitkey
- mov al,hou
- add al,1
- daa ;时调整
- mov hou,al
- cmp hou,12H
- jb nexthou
- mov hou,0
- exitkey:ret
- key endp
-
- delay proc near
- push bx
- push cx
- mov bx,1
- lp1: mov cx,469
- lp2: loop lp2
- dec bx
- jnz lp1
- pop cx
- pop bx
- ret
- delay endp
- .data
- sec db 00h
- min db 00h
- hou db 11h
- situation db 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40h ;共阴
- sit_end=$
- END
复制代码
所有资料51hei提供下载:
_8253A_可调时钟.rar
(60.62 KB, 下载次数: 81)
|