单片机定时器程序

发布者:RadiantBeauty最新更新时间:2018-01-22 来源: eefocus关键字:单片机  定时器 手机看文章 扫描二维码
随时随地手机看文章

;******************;
 ;    定时器程序    ;
 ;    采用89c2051   ;

;******************;
 ;
      ;******************
     ;      伪定义     ;
     ;******************
     SL     EQU   30H           ;SL存放秒的个位数
     SH    EQU   31H           ;SH存放秒的十位数
     ML    EQU   32H            ;ML存放分的个位数
     MH    EQU   33H           ;MH存放分的十位数
     HL     EQU   34H           ;HL存放时的个位数
     HH    EQU   35H            ;HH存放时的十位数
     ;
     L0     EQU   36H           ;L0~L3:显示数据存储器
            L1    EQU   37H
     L2     EQU   38H
     L3    EQU   39H
     DSPLYP    EQU   3AH         ;显示数据指针(DISPLAY-POINT)
     PLYTS     EQU   3BH         ;显示次数计数器(DISPLAY-TIMES)
     ;
     LPLMOD   BIT   39H          ;低两位显示方式(LOW-PLAY-MOD)
     HPLMOD   BIT   3AH         ;高两位显示方式(HIGH-PLAY-MOD)
     BRIGHT    BIT   3BH         ;DISPLAY子程序参数:亮灭指示位
        ;
        TCOUNT   EQU   3CH         ;时间计数器(TIME-COUNT)
        ;
        ADDRES  EQU   3DH           ;加1子程序参数
        MAX     EQU   3EH           ;加1子程序参数
     IFDEC    BIT   20H            ;BCD加法子程序参数
            ;
        R_MOD  EQU   3FH          ;响铃方式参数
     ;
     LED4     BIT   30H            ;发光管状态位
     BELL     BIT   P1.7           ;蜂鸣器
     SWITCH  BIT   P3.7           ;继电器
     FKEY     BIT   P3.0           ;功能键 (S1)
     MKEY    BIT   P3.1           ;修改键 (S2)
     ;
     WORKIN BIT   38H            ;工作状态指示位
     ;

            ;******************
            ;     中断入口    ;
         ;******************
      ORG    0000H
START:  LJMP  MAIN           ; 0000H  引向主程序
      LJMP  ERR            ; 0003H
      NOP
      NOP
      LJMP  ERR            ; 引向出错处理程序
      LJMP  PGT0           ; 000BH  引向中断处理程序PGT0
      NOP
      NOP
      LJMP  ERR            ; 引向出错处理程序
      LJMP  ERR            ; 0013H  INT1
      NOP
      NOP
      LJMP  ERR
      LJMP  ERR            ; 001BH  T1
      NOP
      NOP
      LJMP  ERR
      LJMP  ERR            ; 0023H
      NOP
      NOP
      LJMP  ERR
      LJMP  ERR            ; 002BH
      NOP
      NOP
         ;
      ;************
       ;   主程序  ;
      ;************
        MAIN:   MOV   IE,  #00H            ;关中断
                    MOV   SP,  #57H            ;设置堆栈指针
                    MOV   PSW,  #00H          ;选用寄存器组0
                    MOV   TMOD, #11H          ;设定中断工作方式为T0和T1
            ;
                    MOV   A, 56H
                    CJNE  A, #0AAH, CSTART     ;判上电复位标志,无标志转冷启动
                    MOV   A, 57H
                    CJNE  A, #55H,  CSTART      ; 无标志转冷启动
                    AJMP  HSTART               ;有上电复位标志转热启动
                    NOP
                   NOP
                    LJMP  ERR                  ;软件陷阱,引向出错处理程序
    CSTART: MOV   P1, #0FFH             ;冷启动,全面初始化
                    MOV   P3, #0FFH
                    MOV   TCON,  #00H          ;计时停止
                    MOV   TL0, #0B0H            ;赋中断T0初值
                    MOV   TH0, #3CH
                    MOV   TCOUNT, #0AH          ;赋定时器初值
                    MOV   R5, #00H              ;R5为一空单元(备用)
                    MOV   R4, #00H              ; R4 为工作模式选择寄存器
                    MOV   SL, #00H              ;定时单元清零
                    MOV   SH, #00H              ;秒
                    MOV   ML, #00H             ;
                    MOV   MH, #00H             ;分
                    MOV   HL, #00H             ;
                    MOV   HH, #00H             ;时
                    MOV   PLYTS,  #64H         ;赋显示次数初值为100次
                     MOV   DSPLYP,  #L0  ;显示指针指向显存单元
                    MOV   L0,  #0AH           ;送显示数据"-----"
                    MOV   L1,  #0AH
                    MOV   L2,  #0AH
                    MOV   L3,  #04H
                    SETB   LED4                 ;LED4为数码管之间的发光二极管
                    SETB   LPLMOD              ;设定显示方式为闪烁
                    SETB   HPLMOD              ;
                    SETB   BRIGHT               ;允许显示
      CLR    WORKIN              ;清工作标志 , 待命
                    AJMP  SETUP                ;转开始工作
                    NOP
      NOP
                    LJMP  ERR          ;软件陷阱
         HSTART:    MOV   SCON, #00H    ; 有上电标志,热启动,清串行口控制寄存器
                    MOV   IP,  #00H      ; 清中断优先控制寄存器
                    SETB   FKEY           ;重设按键
                    SETB   MKEY
                    SETB   EA              ;开中断
                    AJMP  BEGIN           ;转向继续工作
                    NOP
      NOP
                    LJMP   ERR            ;软件陷阱
            SETUP:  SETB  EA               ;开中断
            ;
       MAIN1:   ACALL  DISPLY          ;调用显示
              JB    FKEY,  JUDGE    ;按键扫描
       ACALL  KEYDLY        ;延时消抖动
       JB    FKEY,  JUDGE    ;无键按下转向判断是否到点
       CLR   ET0              ;功能键被按下,则
       CLR   TR0          ;暂停计时
                     ACALL MENU           ; 调用菜单设置程序
               BEGIN:  SETB  WORKIN          ;置工作标志位,开始工作
              SETB  ET0              ;开中断
   SETB  TR0              ;开始计时
   MOV   A, R4            ;移入工作模式选择
   RL    A           ;指针放大
                     MOV   DPTR,  #M_TAB
       JMP   @A+DPTR        ;根据工作模式跳转到相应程序段
                M_TAB:  AJMP  WORK1
       AJMP  WORK2
       AJMP  WORK3
              AJMP  WORK4
              NOP
              NOP
              LJMP  ERR               ;软件陷阱
WORK1:  ;
  WORK2:  CLR   SWITCH            ;工作方式1和2:开继电器
          AJMP  MAIN2
          NOP
   NOP
          LJMP  ERR                ;软件陷阱
  WORK3:  ;
WORK4:  SETB  SWITCH             ;工作方式3和4:不开继电器
  MAIN2:  CLR   BELL                 ;蜂鸣器短鸣一声,以示开始工作
           ACALL  DL05S
           SETB  BELL
   JUDGE:  JNB WORKIN, MAIN1           ;判断是否在定时之中
            MOV   A, SL                  ;判断秒是否为零
            JNZ   MAIN1
            MOV   A, SH                ;判断秒是否为零
            JNZ   MAIN1
            MOV   A, ML                ;判断分是否为零
            JNZ   MAIN1
            MOV   A, MH                ;判断分是否为零
            JNZ   MAIN1
            MOV   A, HL                ;判断时是否为零
            JNZ   MAIN1
            MOV   A, HH                ;判断时是否为零
            JNZ   MAIN1                ;若时分秒全为零则
            CLR   ET0                  ; 停止计时
            CLR   TR0                  ;
            ACALL ACTION              ; 调用到点工作子程序
            AJMP  MAIN                ; 返回
            NOP
     NOP
            LJMP ERR                   ;软件陷阱
     ;
        ;******************
     ;    倒计时程序   ;
     ;******************
            PGT0:   CLR   EA               ;关中断
                    PUSH  ACC           ;保护现场
      PUSH  PSW
      PUSH  DPL
      PUSH  DPH
      MOV   PSW, #08H         ;选用寄存器组1
      CLR   TR0                  ;暂停计时
      MOV   A,#0B7H             ;中断同步修正
      ADD   A,TL0
      MOV   TL0,A
      MOV   A,#3CH
      ADD   A,TH0
      MOV   TH0,A
                    SETB  TR0                  ;恢复计时
                    DEC   TCOUNT               ;定时器T0每50 000毫秒溢出一次,则
      MOV   A,  TCOUNT           ; 溢出10次为0.5秒
             JNZ   OUTT0             ;判断是否到半秒
      MOV   TCOUNT, #0AH         ;
      CPL   LED4               ; 若到半秒LED取反
      JNB   LED4, OUTT0         ;LED每闪烁一次是一秒
      MOV   R0, #SH             ;移入秒位的地址
      SETB  IFDEC                ;BCD子程序参数,使其做减法
      ACALL ADDBCD            ;调用BCD子程序, 秒减1
      CJNE  R3, #99H, OUTT0      ;判断秒要否借位
                    MOV   SH, #05H            ;要借位则
                    MOV   SL, #09H            ; 送数据59(否则显示99)
      MOV   R0, #MH             ;移入分位的地址
      ACALL ADDBCD            ;分减1
      CJNE  R3, #99H, OUTT0     ;判断分要否借位
                    MOV   MH, #05H
                    MOV   ML, #09H
      MOV   R0, #HH
      ACALL ADDBCD
            OUTT0:  POP   DPH           ;恢复现场
      POP   DPL
      POP   PSW
      POP   ACC
      SETB  EA
      RETI                    ;中断返回
                    NOP
      NOP
                    LJMP ERR                    ;软件陷阱
 ;
 ;
            ;**************************
     ;   BCD子程序(加1或减1 )  ;
            ;**************************
   ADDBCD: MOV   A, @R0           ;移入被操作数的高位
            DEC   R0                ;指针减一
            SWAP  A
            ORL   A, @R0            ;移入被操作数的低位
            MOV   B, #01H           ;B寄存器送立即数#01H
            MOV   C, IFDEC          ;若 减法标志位为1,则
            MOV   B.3,  C           ;
            MOV   B.4,  C           ; B寄存器的值被改为#99H
            MOV   B.7,  C           ;
           ADD   A, B              ; 对一个压缩的BCD码加#99H等于对其减一
           DA    A                 ;BCD码调整
           MOV   R3, A             ;暂存结果
           ANL   A, #0FH           ;取低位码
           MOV   @R0, A           ;存数
           MOV   A, R3             ;取回结果
           INC   R0                ;指针加一
           SWAP  A                ;交换
           ANL   A, #0FH          ;取结果数的高位
            MOV   @R0, A          ;存数
            RET
            NOP
            NOP
            LJMP  ERR             ;软件陷阱
     ;
        ;**************
 ;   加1程序   ;
        ;**************
 ADDONE: MOV  R0, ADDRES   ;移入被加数单元的地址
                  CLR   IFDEC         ;设定BCD子程序做加法
                   ACALL ADDBCD      ;调用BCD子程序
                  CLR   C             ;判断被加数是否大于
                  MOV   A,  R3       ;最大值"MAX"
                  CJNE  A,  MAX, JGOVER
  JGOVER: JC    ENDADO
                  CLR   A            ;若大于"MAX",则清零
                  MOV   @R0, A
                  DEC   R0
                  MOV   @R0, A
 ENDADO: RET
                  NOP
                  NOP
                  LJMP   ERR       ;软件陷阱
     ;
        ;******************
     ;   调时快进程序  ;
        ;******************
   QUICK:    CLR   LPLMOD    ;设定显示方式不闪烁
                  CLR   HPLMOD
                  ACALL ADDONE      ;调用加1子程序
                  MOV   L0,  R4       ;将工作模式选择数移入显存
                  INC   L0             ;加1转化成显示值
                  ACALL KEYDLY       ;延时
                  ACALL DL100
                  JNB   MKEY, QUICK      ;判断键是否松开
                  SETB  LPLMOD          ;若松开则恢复闪烁显示方式
                  CJNE  R6, #02H, ENDQUK
                  SETB  HPLMOD
                  CLR   LPLMOD
  ENDQUK: RET
                  NOP
                  NOP
                  LJMP ERR             ;软件陷阱
     ;
;
        ;******************
     ;   功能菜单程序  ;
     ;******************
   MENU: MOV   R6,  #00H         ; 初始化;  R6 计功能键按键次数
               MOV   ADDRES,  #05H   ; 将 R5 的地址送入,以便于改变 R4 的值
               MOV   MAX, #04H        ; 定义工作模式选择寄存器R4 的最大值
               MOV   DSPLYP, #L0       ;定义显示指针指向显存
               SETB  LPLMOD       ;设定低两位数闪烁
               CLR   HPLMOD
               MOV   L0,  R4           ;送显示数据"F-0X"
               INC    L0
               MOV   L1,  #00H
               MOV   L2,  #0BH
               MOV   L3,  #00H
               SETB  LED4
            ;
  WAITFK: ACALL DISPLY              ;等待F键释放
                JNB   FKEY,  WAITFK
  MENU1:  ACALL DISPLY
                JB    MKEY,  JGFKEY       ;M键扫描
                ACALL KEYDLY             ;延时消抖动
                JB    MKEY,  JGFKEY       ; 未按下则转F键扫描
                CJNE  R6, #00H, NEXT1      ;
                MOV   SL, #00H            ;若中途改变定时方式,则清除原计时数据
                MOV   SH, #00H
                MOV   ML, #00H
                MOV   MH, #00H
                MOV   HL, #00H
                MOV   HH, #00H
  NEXT1:  MOV   R2,  #00H            ;R2用于判断按键时间是否超过0.5秒
  NEXT2:  ACALL ADDONE             ;调用加1程序
                MOV   L0,  R4              ;移入工作方式选择数
                INC    L0
                ;
  WAITMK: ACALL DISPLY             ;等待M键释放
                INC   R2                    ;R2自增一
                CLR   C
                CJNE  R2, #0C8H, JGQUIC    ;若R2大于等于200则调用快进子程序

  JGQUIC:  JC    WATMK1
                 ACALL QUICK
 WATMK1: JNB   MKEY,  WAITMK      ; R2小于200则等待M键释放
                ;
JGFKEY: JB    FKEY,  MENU1        ;功能(F)键扫描
               ACALL KEYDLY             ;延时消抖动
               JB    FKEY,  MENU1        ;键未按下则转修改(M)键扫描
               INC   R6                   ;F键按键次数加1
               MOV   A,  R6              ;移入按键次数
               RL    A                ;指针放大
               MOV   DPTR,  #FUNTAB
               JMP   @A+DPTR            ;根据按键次数跳转到相应的程序段

 

 FUNTAB: AJMP  WAITFK
                AJMP  SETLOW
                AJMP  SETHI
                AJMP  ENDMEN
                NOP
                NOP
                AJMP  ENDMEN
 ;STWKMD:                             ;工作模式设定,不需另外改变菜单
 ;
 SETLOW:  MOV   MAX, #60H         ;设置低位(秒位或分位)
                  MOV   A,  R4             ;移入工作模式选择数
                  RL    A                ;指针放大
                  MOV   DPTR,  #FTAB1
                  JMP   @A+DPTR          ;根据工作模式选择数跳转到相应的程序段
    FTAB1:  AJMP  SETSS
                  AJMP  SETM60
                  AJMP  SETSS
                  AJMP  SETM60
                  NOP
                  NOP
                  AJMP  WAITFK
SETSS:      MOV   DSPLYP, #SL          ;设定显示区域为MM:SS
                  MOV   ADDRES, #SH
                  AJMP  WAITFK
 SETM60:  MOV   DSPLYP,  #ML       ; 设定显示区域为HH:MM
                 MOV   ADDRES,  #MH
                AJMP  WAITFK
     ;
 SETHI:          CLR   LPLMOD               ;设置高位(分位或时位)
                     SETB  HPLMOD              ;高两位数码管闪烁
                     MOV   MAX, #31H           ;最大数为30
                     MOV   A,  R4              ;移入工作模式选择数
                     RL    A                    ;指针放大
                     MOV   DPTR,  #FTAB2      ;移入表首地址
                     JMP   @A+DPTR           ;根据工作模式选择数跳转到相应的程序段
 FTAB2:        AJMP  SETM30
                     AJMP  SETHH
                     AJMP  SETM30
                     AJMP  SETHH
                     NOP
                     NOP
                     AJMP  WAITFK           ;返回等待键释放
   SETM30:    MOV   ADDRES,  #MH   ;移入分位的地址
                     AJMP  WAITFK           ;转向等待键释放
      SETHH:   MOV   ADDRES,  #HH   ;移入时位的地址
                     AJMP  WAITFK          ;转向等待键释放
                    ;
   ENDMEN:  CLR   HPLMOD         ;恢复不闪烁显示方式
                    RET
                    NOP
                    NOP
                    LJMP ERR              ;软件陷阱
     ;
     ;****************
     ;  到点工作程序 ;
     ;****************
 ACTION: MOV   L0,  R4           ;移入工作模式选择数


关键字:单片机  定时器 引用地址:单片机定时器程序

上一篇:用AT89C2051制作的快速充电器
下一篇:51单片机设计测距仪原理及其应用

推荐阅读最新更新时间:2024-03-16 15:53

基于51单片机的超声波测距系统设计
功能: 超声波测距仪,测量距离,用LCD12864显示信息。 lcd_writestr(0,0, 超声波测距仪 ); lcd_writestr(1,0, ******** ); lcd_writestr(2,0, 当前被测距离为: ); lcd_writestr(3,0, 厘米 ); 程序运行图: 原理图: 部分程序: /***************************************************** * 功能:超声波测距 ******************************************************/ #include reg52.h #include
[单片机]
STC12C5A32S2单片机之1602渐入显示
基本框架根据郭天祥Lesson8中的程序来编写,但是渐入显示的时候郭用的指令是write_com(0x18); 可我用的时候就是显示不出来,于是根据1602的说明书,用了另外一个指令write_com(0x07) //当写一个字符,整屏显示左移 程序如下: 可直接运行,已调试OK #include reg51.h sbit LCD_rs=P1^0; sbit LCD_rw=P1^1; sbit LCD_en=P2^5; unsigned char num; unsigned char code table = I Love ZYN ; unsigned char code table1 = 0123
[单片机]
STC12C5A32S2<font color='red'>单片机</font>之1602渐入显示
[单片机框架][bsp层][AT32F415][bsp_tim] tim定时器配置和使用
9 定时器(TIMER) 9.1 通用定时器(TMR2到TMR5) 9.1.1 TMRx简介 通用定时器是一个通过可编程预分频器驱动的 16 位自动装载计数器构成。它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM) 。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 每个定时器都是完全独立的,没有互相共享任何资源。它们可以一起同步操作,参见 9.2.3.15 节。 9.1.2 TMRx主要功能 通用 TMRx(TMR2、TMR3、TMR4 和 TMR5)定时器功能包括: 16位向上、向下、向上/向下自动装载计数器 注意:
[单片机]
[<font color='red'>单片机</font>框架][bsp层][AT32F415][bsp_tim] tim<font color='red'>定时器</font>配置和使用
兆易创新RISC-V内核MCU登场,布局新赛道
8月22日,向来低调的兆易创新(GigaDevice)在北京召开了一场盛大的、主题为“智领全球,芯动未来”的发布会,这次会议的主角是:基于RISC-V内核的32位通用MCU——GD32V系列。新品一经发布,技术微信群便自发开启了讨论模式: “RISC-V 芯片量产了?” “是不是和兆易F103系列引脚兼容啊?底层库兼容吗?” “期待,兆易速度真快!一整套开发环境,还有那么多demo !“ 无疑,越来越受欢迎的 RISC-V 内核及落地产品,成了全场关注的焦点。 为何是 RISC-V? 众所周知, 作为国内首家推出 ARM 系列的32位通用 MCU 产品公司,兆易创新拥有非常全面的产品线,可以满足各种应用需求。据
[单片机]
兆易创新RISC-V内核<font color='red'>MCU</font>登场,布局新赛道
AVR单片机的串口转FSK的通信模块设计
随着信息技术与网络技术的飞速发展,信息交互应用业务给人类生活带来更多的便利,信息终端表现出巨大的市场潜力。但是由于终端用户环境不同,用户信息交互方式可能不同,目前常用的有IP方式、FSK方式以及无线通信方式等。为了能够提高终端市场竞争力,减少系统开发成本投入,通信模块与终端程序独立设计是较为理想的解决方案。本文采用ATmega48芯片及CMX865芯片实现FSK通信模块,基于此模块,用户与业务平台之间进行FSK信息交互,相对于终端来说就是简单的串口通信。 1 ATmega48介绍 ATmega48是基于AVR增强型RISC(精简指令集)结构的高性能、低功耗的8位CMOS微控制器。微控制器具有可控制的上电复位和可编程的掉电检测
[单片机]
AVR<font color='red'>单片机</font>的串口转FSK的通信模块设计
基于AT89C51和DS18B20的最简温度测量系统
l引 言 温度的测量和控制在激光器、光纤光栅的使用及其他的工农业生产和科学研究中应用广泛。温度检测的传统方法是使用诸如热电偶、热电阻、半导体PN结之类的模拟温度传感器。信号经取样、放大后通过模数转换,再交自单片机处理。被测温度信号从温敏元件到单片机,经过众多器件,易受干扰、不易控制且精度不高。因此,本文介绍一种新型的可编程温度传感器DS18B20,他能代替模拟温度传感器和信号处理电路,直接与单片机沟通,完成温度采集和数据处理。DS18B20与AT89C51结合实现最简温度检测系统,该系统结构简单,抗干扰能力强,适合于恶劣环境下进行现场温度测量,有广泛的应用前景。 2温度测量系统硬件 系统结构图如图1所示 。这里通过上拉电阻直
[测试测量]
C8051F单片机在远端测控装置中的应用
摘 要 :本文介绍了C8051F系列单片机在远端测控装置中的应用,给出了整个系统的结构,包括硬件配置和系统网络构成,对一些技术问题也做出了详尽的说明。 关键词: C8051F ;远端测控;硬件配置 C8051F单片机是完全集成的混合信号系统芯片(SoC),具有与8051指令集完全兼容的CIP-51内核和高速、高性能、高集成度等特点。在本文设计的一套远端测控装置中取得了较好的效果。 系统简介 远端测控装置是一种现场可编程的控制器,它能完成数据的采集控制,而通过远程通信的方式(如电台、CDMA、拨号等)将数据上传至中心站或接收中心站的遥控指令。它往往被安装在比较分散、环境比较恶劣、无电源保障(经常断电或使用太阳能)且无人值
[单片机]
C8051F<font color='red'>单片机</font>在远端测控装置中的应用
基于单片机8251和MODEM设计的远程通信系统
1 前言 我国中大型石油化工企业大都采用小电流接地系统来供电,电力系统较为庞大。这类系统一般拥有几座乃至十几座35kV级的总降压站,几十座6~10kV级的高压配电室,分布范围较广,有的变电站离开总调有十几km之远。因此,各变电站的电量参数(电压、电流、相位、功率因数等)的准确、可靠传送,对总调及时决策、对提高供电质量和确保电力运行安全尤为重要。这里,我们采用单片微型计算机控制调制解调器进行远程实时数据传送,获得了满意的效果。 2 硬件系统设计  系统网络图如图1所示。本系统的上位机采用PII微机,通过MODEM←→交换网←→MODEM与作为下位机的单片机系统相连接。电力传感器采集的数据信号输入单片机系统,经软件程序处理后
[工业控制]
基于<font color='red'>单片机</font>8251和MODEM设计的远程通信系统
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved