如何利用单片机设计一个计时器

控制/MCU

1883人已加入

描述

程序效果:利用单片机的定时/计数器设计一个计时器,按key0后启动,要求精确显示到百分之一秒。

发挥部分:

1:定时结束后有提示音报警,并可重新定时

2:定时时间可设置,最多30s

3:定时过程中可暂停

4:按下key1暂停计时,并记下此刻数值

5:按下key2显示第一次按下key1的数值(按下第一次有效,其它均无效)

ORG 0000H

LJMP START //主程序必须避开地址000BH

ORG 000BH //定时器0的中段服务程序,起始地址为000BH

LJMP IT00

ORG 0030H

START: MOV TH0,#0EBH //装入初始值,定时时间为10ms

MOV TL0,#64H

MOV TMOD,#01H //工作方式1

MOV 40H,#00

MOV 41H,#00

MOV 42H,#00

MOV 43H,#00

MOV 33H,#00 //显示初值为0

MOV 32H,#00

MOV 31H,#00

MOV 30H,#00

MOV R1,#00

MOV R2,#00

SETB ET0 //打开定时0

SETB EA //开总中断

HERE: JNB P3.4,KEY0 //扫描是否有按键按下

JNB P3.5,KEY1

JNB P3.6,KEY2

LCALL DISPLAY //此处是为了防止掉显

LJMP HERE

KEY0: LCALL DELAY1 //延时10ms

JB P3.4,HERE //判断key0是否真的按下去了

LKOP: LCALL DISPLAY //真的按下去了

JNB P3.4, LKOP //检查是否松手,没有则继续循环,别忘了要显示

MOV A,R2

CJNE A,#01,LSP //判断key2 是否按下去过(只能按一次)

MOV R2,#00 //清零

MOV 30H,34H //真的按下去了

MOV 31H,35H //显示key2按下前的值

MOV 32H,36H

MOV 33H,37H

LSP: SETB TR0 //启动定时器

LJMP HERE

KEY1: LCALL DELAY1 //显示消抖

JB P3.5,HERE

CLR TR0 //关闭定时器

LKOP1: LCALL DISPLAY

JNB P3.5,LKOP1

INC R1

MOV A,R1

LEP: CJNE A,#01,HERE //判断key2是否按下(只能按一次)

MOV 40H,30H //暂存key2按下去前的值

MOV 41H,31H

MOV 42H,32H

MOV 43H,33H

LJMP HERE

KEY2: LCALL DELAY1

JB P3.6,HERE

CLR TR0

LKOP2: LCALL DISPLAY

JNB P3.6,LKOP2

INC R2 //加1,为标志,用于判断key2是否按下去了

MOV A,R2 //此处写的是一个通用形式,只暂存一个数值

LEP2: CJNE A,#01,HERE //此语句大可不写

MOV 34H,30H

MOV 35H,31H //保存码表当时的数值,便于回复到原值

MOV 36H,32H

MOV 37H,33H

MOV 30H,40H //保存key1第一次按下的数值

MOV 31H,41H

MOV 32H,42H

MOV 33H,43H

LJMP HERE

//每10ms加1子程序

ADD1: INC 30H //百分位减1

MOV A,30H

CJNE A,#00AH,LOOP2 //判断百分位减到0之后是否再减1

MOV 30H,#00 //是,装入初值9

INC 31H //十分位减1

MOV A,31H

CJNE A,#0AH,LOOP2 //判断百分位减到0之后是否再减1

MOV 31H,#00

INC 32H

MOV A,32H

CJNE A,#0AH,LOOP2

MOV 32H,#00

INC 33H

MOV A,33H

CJNE A,#0AH,LOOP2

MOV 33H,#00

SETB P2.0 //关闭蜂鸣器

LCALL DELAY //延时

LCALL DELAY

CLR P2.0 //从15s减到0s后,驱动蜂鸣器

MOV 33H,#00 //装入初值15s

MOV 32H,#00

MOV 31H,#00

MOV 30H,#00

CLR TR0 //关闭定时器,

LP1: JB P3.4,LP //判断KEY0是否按下

SETB TR0 //按下,则启动定时器 ,这里我没有消抖

SJMP LOOP2

LP: LCALL DISPLAY //没有按下,调用显示,防止掉显

SJMP LP1

LOOP2: NOP //空指令

RET //返回

//显示子程序

DISPLAY: MOV DPTR,#TAB //赋表首地址

MOV A,#0FBH

MOV P2,A //亮最左边的数码管

XCH A,R0 //暂存A的值

MOV A,33H

MOVC A,@A+DPTR //根据表值查找所需的值

MOV P0,A //显示值

LCALL DELAY //延时

XCH A,R0 //恢复原值

RL A //循环左移,为下次做准备

MOV P2,A

XCH A,R0

MOV A,32H

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

XCH A,R0

RL A

MOV P2,A

XCH A,R0

MOV A,31H

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

XCH A,R0

RL A

MOV P2,A

XCH A,R0

MOV A,30H

MOVC A,@A+DPTR

MOV P0,A

LCALL DELAY

RET

TAB: DB 3FH,06H,5BH,4FH,66H ;数码管显示的数值

DB 6DH,7DH,07H,7FH,6FH

IT00: MOV TH0,#0EBH //装入初值,时间为10ms

MOV TL0,#64H

LCALL ADD1 //减10ms

RETI //返回

DELAY: MOV R7,#04 //延时子程序,时间大约为:2us*4*250

DEL2: MOV R6,#250

DEL1: DJNZ R6,DEL1

DJNZ R7,DEL2

RET

DELAY1: MOV R5,#20

DEL3: MOV R4,#250

DEL4: DJNZ R4,DEL4

DJNZ R5,DEL3

RET

END //结束
责任编辑;zl

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分