你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

利用单片机设计计时器

[复制链接]
gaosmile 发布时间:2020-3-21 14:43
程序效果:利用单片机的定时/计数器设计一个计时器,按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 //结束

收藏 评论0 发布时间:2020-3-21 14:43

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版