|
单片机提高 WWW.51C51.COM
自学单片机的网站:作中国单片机编程技术普及推广第一站!倚天一出宝刀屠龙
返回主页
给我留言 单片机教学 单片机提高
品质技术 软件下载 学液晶显示
产品介绍 如何购买
;倒计时器 开机默认为15秒,p32启动键,p34个位调整,p35十位调整
;***************************************************************************
;* E-mail:sxj1974@163.com (51c51 test web) 51单片机学习网,自学单片机的网站
*
;* Create by :石学军 www.51c51.com
www.8951.com 更多例程请登陆网站 *
;***************************************************************************
;p26,个位数数码管,p27十位数数码管
;K1采用中断和查询结合的工作方式。先采用外部中断INTO,电平触发,当发生中断后,K1、K2、K3均采;用查询方式,当查询到K2被按下时
;(P35=0),“十位数缓冲区”数据加1(1~9变化),当查询到K3被;按下时(P34=0),“个位数缓冲区”数据加1(1~9变化),
;当查询到K1;;被按下时(P32=0)则启动定;时器,退出中断。全部设定和启动工作在中断服务程序中完成。
;2采用定时器TO,工作于方式2(常数自动装入的8位定时器),产生1秒(1s)和1分(1min)的定;时信号。1s信号的产生:
;机器周期T=12/fc。8位定时器的最大定时时;间为510μs。因此用TO产生500μs的定时,然后用20H单元;对TO发生中断的次数进行计数,
;发生200次中断则为100ms,因此在20H单元中放入#200D(#C8H),每发生一次TO中断时,20H 的数减1,减到零时为定时100ms。
;在21H单元中放入#10D(0AH),定时到;100ms时,21H单元中的;数减1,减到零时为定时1s。同理在22H单元中放入#60D(3CH),
;定时到1s时,22H单元中的数减1,减到零时为定时1min。TO产生500μs的定;时初值#5(255-250=5)。

ORG 0000H ;程序入口地址
AJMP MAIN
ORG 0003H ;外部中断INT0入口地址
AJMP PINT0 ;转中断服务子程序
ORG 000BH ;T0中断入口
AJMP WT0 ;定时器T0入口地址
ORG 20H
MAIN: MOV SP,#40H ;设置栈指针
MOV 20H,#0H ;把定时数据单元清零
MOV 21H,#0
MOV 22H,#0
MOV 23H,#15
MOV 24H,#0
MOV TH0,#5 ;装入定时初值
MOV TL0,#5
MOV TMOD,#02H ;设T0为方式2
SETB EA ;开CPU中断
SETB ET0 ;允许T0中断
CLR TR0 ;启动T0计数
SETB IT0 ;设定INT0触发方式
SETB EX0 ;INT0请求中断
MOV 34H,#1
MOV 35H,#5
NOP ;第二位显示数据 │
M: NOP
ACALL LED
ACALL SON
JNB 00H,M
MM: NOP
ACALL ZH1
ACALL DSP
ACALL LED
AJMP M
;显示子程序
DSP: MOV R7,#0AFH
DSP0: MOV R0,#30H
MOV DPTR,#TAB
NOP
MOV A,@R0
MOVC A,@A+DPTR
RX1: MOV P0,A
CLR P2.6
DJNZ R7,RX1
MOV R7,#0afh
INC R0
MOV P0,#0FFH
SETB P2.6
MOV A,@R0
MOVC A,@A+DPTR
RX2: MOV P0,A
CLR P2.5
DJNZ R7,RX2
MOV R7,#8
SETB P2.5
; DJNZ R7,DSP0
RET
DSP1: MOV R7,#0FH
DSP01: MOV R0,#34H
MOV DPTR,#TAB
MOV A,@R0
MOVC A,@A+DPTR
RX01: MOV P0,A
CLR P2.5
DJNZ R7,$
MOV R7,#0FH
INC R0
SETB P2.5
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
DJNZ R7,$
SETB P2.6
RET
ZH1: MOV R2,#0
MOV R3,23H
ACALL BCD
MOV A,R6
ANL A,#0FH
MOV 30H,A
MOV A,R6
ANL A,#0F0H
SWAP A
MOV 31H,A
RET
;十进制转换为二进制子程序
DTOB:
MOV 32H,#0
MOV 33H,#0
MOV R0,#32H
MOV R2,#3
ACALL IDTB
MOV A,R4
MOV 23H,A
RET
IDTB: MOV R3,#0
MOV A,@R0
MOV R4,A
IDTL: MOV A,R4
MOV B,#10
MUL AB
MOV R4,A
MOV B,#10
XCH A,B
XCH A,R3
MUL AB
ADD A,R3
XCH A,R4
INC R0
ADD A,@R0
XCH A,R4
ADDC A,#0
MOV R3,A
DJNZ R2,IDTL
RET
;二进制数转换为十进制数子程序
BCD: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#16
IBTL2: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,IBTL2
RET
;延时子程序
DL: MOV R7,#02H
DL1: MOV R6,#0FFH
DL2: DJNZ R6,DL2
DJNZ R7,DL1
RET
;外部中断服务子程序
PINT0: CLR EX0
PUSH ACC
PUSH PSW
SETB P1.0
ACALL DSP1
PK: JB P3.2,TOEXT
pk0: acall dsp1
JNB P3.2,pk0
PK2: JB P3.5,PK3 ;判K2按下否,未按则转到判K3状态
ACALL DSP1
INC 34H
MOV A,34H
CJNE A,#0AH,PK22
MOV 34H,#0
PK22: ACALL DSP1 ;K2按下,30H加1
JNB P3.5,PK22
AJMP PK2
PK3: ACALL DSP1
JB P3.4,PK1 ;判K3按下否,未按则转到判K1状态
INC 35H
MOV A,35H
CJNE A,#0AH,PK33
MOV 35H,#0
PK33: ACALL DSP1
JNB P3.4,PK33
AJMP PK3
PK1: ACALL DSP1
JB P3.2,PK2 ;K1未按则转判K2和K3
pk10: acall dsp1
JNB P3.2,pk10
ACALL DTOB
SETB 00H
TOEXT: SETB EX0 ;开中断
SETB TR0
POP PSW ;恢复现场
POP ACC
RETI
LED: JB 01H,LED0
CLR P1.0
RET
LED0: SETB P1.0
RET
SON: JB 02H,SON0
CLR P3.3 ;
RET
SON0: SETB P3.3 ;
RET
;段码表
TAB: DB 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h
;定时中断服务子程序
WT0: PUSH ACC
PUSH PSW
INC 21H ;0.5ms
MOV A,21H
CJNE A,#0C8H,TORETI ;200D=C8H
MOV 21H,#0
INC 22H ;100ms
MOV A,22H
CJNE A,#10,TORETI
MOV 22H,#0
DEC 23H
MOV A,23H
; CJNE A,#60,TORETI
; MOV 23H,#0
; DEC 24H
CPL 01H
; MOV A,24H
CJNE A,#0,TORETI
CLR TR0
SETB 02H
CLR 01H
CLR 00H
TORETI: POP PSW
POP ACC
RETI
END
|