单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 236|回复: 0
收起左侧

简单的C8051F310单片机实现倒计时功能源代码

[复制链接]
w2472659957 发表于 2019-6-5 12:09 | 显示全部楼层 |阅读模式
任务要求
利用C8051F310单片机设计一个倒计时定时器,功能要求及主要技术指标要求如下:
1.  定时时间为9秒,定时精度为1秒 。
2.  在LED数码管上显示剩余时间。
3.  时间到0时,蜂鸣器鸣响1次(0.5秒钟)。
4.  通过KINT键实现启动和暂停功能,暂停时D9灯亮。
        5.  利用单片机内部定时器定时,KINT键输入和定时器控制均要求采用中断方式。

以1秒定时器及相关循环构成的倒计时模块为整个程序的核心,再根据其他要求设计分支模块实现目标。1秒定时器以0.125s延时中断为基础,执行8次循环构成1s定时器,同时对1s定时器进行9次循环,完成倒计时定时器的基本内容。
分支模块包括:段码转换输出、KINT启动/暂停、蜂鸣器定时鸣响以及D9灯控制。
段码转换输出:不需要多余逻辑,通过计算得出0~9对应段码,然后直接通过MOV指令进行转换输出即可。
KINT启动/暂停:已知KINT键按下为低电平,则选择任意位置输入电平,利用JB指令进行判断,同时设置外部中断0,并将其设为最高优先级。最后添加15ms消抖。
蜂鸣器定时鸣响:不需要多余逻辑,已知蜂鸣器高电平下鸣响,则在MAIN函数中首先通过CLR P3.0使其关闭,再在倒计时结束后使其鸣响,并添加一个0.5s定时器使其延时0.5s。
D9灯控制:不需要多余逻辑,已知D9独立指示灯低电平点亮,则将其与KINT联系,KINT键按下时点亮D9,再次按下KINT即关闭,相当于D9作为暂停指示灯,D9点亮则程序中断,D9熄灭则正常运行。
;------------------------------------
;-  Generated Initialization File  --
;------------------------------------

$include (C8051F310.inc)

public  Init_Device

                TH EQU 06H
                TL EQU 0C6H

                ORG 0000H
                LJMP MAIN

                ORG 0003H
                LJMP KINT

                ORG 000BH
                LJMP CLOCK

                ORG 001BH
                LJMP CLOCK1

                ORG 0100H
MAIN:        LCALL Init_Device
                SETB EA
                SETB ET0
                SETB ET1
                SETB EX0
                SETB PX0
                SETB IT0

                CLR P0.6
                CLR P0.7                   ;点亮数码管0

                MOV TH0,#TH
                MOV TL0,#TL
                MOV TH1,#TH
                MOV TL1,#TL

                MOV R1,#9
                MOV R2,#8
                MOV  DPTR, #TAB  ;确保9以段码输出.
        MOV  A, R1
        MOVC A, @A+DPTR  
        MOV  P1, A      

                MOV 50H,#0

                CLR P0.0
                CLR P3.1

                SJMP $

CLOCK:        CJNE R2,#0,LOOP
                MOV R2,#8
                DEC R1                                         
                MOV  DPTR, #TAB  ;段码表地址.
        MOV  A, R1
        MOVC A, @A+DPTR  ;查表.
        MOV  P1, A       ;送到P1去显示.
                CJNE R1,#0,LOOP         ;判断是否为0

                MOV 50H,#0

                CLR P0.0                 ;点亮D9
                SETB P3.1                 ;鸣响蜂鸣器
                CLR TR0
                SETB TR1
                MOV R1,#10

LOOP:         MOV TH0,#TH
                MOV TL0,#TL

                DEC R2
                RETI

KINT:        MOV A,50H
                INC 50H                        
                MOV R6,#250                  ;KINT消抖延时
L4:                MOV R7,#30
L5:                DJNZ R7,L5
                DJNZ R6,L4
                JB ACC.0,STOP
                SETB P0.0
                SETB TR0
                RETI

STOP:        CLR P0.0
                CLR TR0
                RETI

CLOCK1:        CJNE R0,#0,LOOP1
                MOV R0,#4                                         ;0.5s定时器1
                CLR P3.1                             ;停止蜂鸣器
                CLR TR1                                                 ;关闭定时器

LOOP1:         MOV TH1,#TH
                MOV TL1,#TL

                DEC R0
                RETI

TAB:    DB  0xfc,0x60,0xda,0xf2,0x66  ;共阴极段码 0~4
        DB  0xb6,0xbe,0xe0,0xfe,0xf6  ;共阴极段码 5~9

INIT SEGMENT CODE
    rseg INIT

; Peripheral specific initialization functions,
; Called from the Init_Device label
PCA_Init:
    anl  PCA0MD,    #0BFh
    mov  PCA0MD,    #000h
    ret

Timer_Init:
    mov  TMOD,      #001h
    mov  CKCON,     #002h
    ret
Oscillator_Init:
    mov  OSCICN,    #083h
    ret
Port_IO_Init:
    ; P0.0  -  Unassigned,  Open-Drain, Digital
    ; P0.1  -  Unassigned,  Open-Drain, Digital
    ; P0.2  -  Unassigned,  Open-Drain, Digital
    ; P0.3  -  Unassigned,  Open-Drain, Digital
    ; P0.4  -  Unassigned,  Open-Drain, Digital
    ; P0.5  -  Unassigned,  Open-Drain, Digital
    ; P0.6  -  Unassigned,  Open-Drain, Digital
    ; P0.7  -  Unassigned,  Open-Drain, Digital

    ; P1.0  -  Unassigned,  Open-Drain, Digital
    ; P1.1  -  Unassigned,  Open-Drain, Digital
    ; P1.2  -  Unassigned,  Open-Drain, Digital
    ; P1.3  -  Unassigned,  Open-Drain, Digital
    ; P1.4  -  Unassigned,  Open-Drain, Digital
    ; P1.5  -  Unassigned,  Open-Drain, Digital
    ; P1.6  -  Unassigned,  Open-Drain, Digital
    ; P1.7  -  Unassigned,  Open-Drain, Digital
    ; P2.0  -  Unassigned,  Open-Drain, Digital
    ; P2.1  -  Unassigned,  Open-Drain, Digital
    ; P2.2  -  Unassigned,  Open-Drain, Digital
    ; P2.3  -  Unassigned,  Open-Drain, Digital

    mov  XBR1,      #040h
    ret

; Initialization function for device,
; Call Init_Device from your main program
Init_Device:
    lcall PCA_Init
    lcall Timer_Init
    lcall Port_IO_Init
    lcall Oscillator_Init
    ret

end


回复

使用道具 举报

无效楼层,该帖已经被删除
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表