×
嵌入式 > 技术百科 > 详情

EM78P153定时器的应用

发布时间:2020-06-16 发布时间:
|
义隆单片机的定时器的使用,以EM78P153为例,练习了下TCC内部定时的使用。选了个现成的电路做调试来做练习。

具体电路如下:

 

 

源程序:

/*******************************************************

em78p153  TCC内部定时器的学习

DAT=P61 CLK=P60 KON=P62  K_UP K_DOWN  LED1=P51 LED2=P52

*******************************************************/

;*********************寄存器及变量定义****************************

R0      EQU 0X00   ;间接地址寄存器

TCC     EQU 0X01   ;计时,计数器

CONT    EQU 0X01   ;控制寄存器

PC      EQU 0X02   ;程序计数器

STATUS  EQU 3     ;状态寄存器

Z_FLAG  EQU 2     ;零标志位

C_FLAG  EQU 0     ;进位标志位

;***************************************************************

IOC5      EQU 0X05

PORT5     EQU 0x05

;**************************************************************

IOC6      EQU  0X06

PORT6     EQU  0x06

;**************************************************************

IOCB    EQU 0X0B    ;下拉控制寄存器

IOCC    EQU 0X0C    ;开漏控制寄存器

IOCD    EQU 0X0D    ;上拉控制寄存器

IOCE    EQU 0X0E    ;WDT控制寄存器

RF      EQU 0X0F    ;中断屏蔽寄存器

IOCF    EQU 0X0F

NUM==0X20 

LP_CNT0==0X21 

LP_CNT1==0X22

DATA==0X23

SEND_BIT_NUM==0X24

LEDH==0X26

LEDL==0X25

TCC_Count  EQU 0X2F

;************************************************************

BACC      EQU 0X2D                ;ACC备份寄存器

BSTATUS   EQU 0X2E        ;STATUS备份寄存器

;**********************************************************

            ORG     00H

            JMP      START    

            ORG     0008H

            JMP      INT_TCC    ;进入中断

                                

TABLE:      

            ADD     PC,A

            RETL    0X11;0

                RETL    0XDB;1

                RETL    0X23;2

                RETL    0X43;3

                RETL    0XC9;4

                RETL    0X45;5

                RETL    0X05;6

               RETL    0XD3;7

                RETL    0X01;8

                RETL    0X41;9

                RETL    0X11;9

                               

START:     

   CALL  INITAITE    ;程序开始前的初始化

   BS PORT5,1

   BS PORT5,2

   MOV A,@0X00       ;give the first data to TB_NUM

   MOV LEDH ,A 

   MOV LEDL ,A                    

;;;;;;;;;;;;;;;;;;;;;

ST:  

   BS PORT5,1

   BC PORT5,2

   MOV  A,LEDH

   CALL TABLE

   MOV  DATA,A 

   CALL SEND

   CALL DELAYMS

   BS PORT5,2

   BC PORT5,1 

   MOV  A,LEDL

   CALL TABLE

   MOV  DATA,A 

   CALL SEND

   CALL DELAYMS

   BC STATUS,C_FLAG  ;进位清零

;;;;;judge TB_NUM'Data;;;;;;;;

   MOV A,LEDL

   SUB A,@0x09    

   JBS STATUS,C_FLAG 

   JMP RESET

   JMP ST

;;;;;;;;;;;;;;;

RESET: 

   MOV A,@0X00       ;give the first data to TB_NUM

   MOV LEDL ,A 

   INC LEDH  

   JMP ST

;;***********************************************

;;***********74hc164 send*************************

SEND:           MOV     A,@8                ;one data=8 Bit

                       MOV     SEND_BIT_NUM,A

SEND_LOOP:                                        

                       RLC     DATA        ;Send The Data

                       JBC     STATUS,0       ;DATA=1

                       BS          PORT6,1        

                       JBS     STATUS,0       ;DATA=0

                       BC         PORT6,1

                      

                       BC      PORT6,0                   ;do Clock

                       NOP

                       BS      PORT6,0       

                       DJZ     SEND_BIT_NUM   ;for 8 loops

                       JMP       SEND_LOOP

            RET

;;*******************************************            

INITAITE:                                                                                                                               

MOV     A,@0B00000100                         ;预分频器分给TCC,分频比为 1:8

                            CONTW                     ;上升沿触发,内部时钟源,中断屏蔽。

                                                        ;P54当I/O口用时,TS_bit5必须为0

                            MOV     A,@0B11111000    ;P5口定义为输出,输入口:  1为输入 ,0为输出

                            IOW     IOC5                          

                       MOV     A,@0B00111100   ;P6口定义为输出口:   0为输出 ,1为高阻状态

                            IOW     IOC6                   

                            MOV     A,@0B11111111   ;设置P60口,为下拉:    0为下拉使能   1为下拉禁止

                            IOW     IOCB            ;bit0_P50  bit1_P51   bit2_P52

                                                      ;bit4_P60  bit5_P61   bit6_P62              

                 MOV     A,@0B00000000  ;开漏控制寄存器:   1为使能 ,0为禁止  

                            IOW     IOCC                                                                 

                            MOV     A,@0B00110001  ;上拉控制寄存器: 0为使能 ,1为禁止

                            IOW     IOCD           ;bit0=P60  ,bit1=P61  ,bit2=P62  ,bit3

                                                     ;bit4=P64  ,bit5=P65  ,bit6=P66  ,bit7=P67                                          

                            MOV     A,@0B00000000  ;WDT控制寄存器

                            IOW     IOCE           ;WDTE_bit7  看门狗使能控制:   0为禁止,1为使能

                                                   ;EIS_bit6   P60引脚功能定义: 0表示为P60为双向IO口

                                                  ;   1表示外部中断输入引脚,此时引脚必须设置为输入状态                    

                      MOV     A,@0B00000001  ;中断屏蔽寄存器:  0禁止中断,1允许中断

                      IOW     IOCF            

                                                    ; EXIE_bit2=0  ICIE_bit1=0    TCIE_bit0=1

                                                    ;开定时器中断

                      MOV     A,@6

                      MOV     TCC,A                                                                                            

            BC      RF,0          ;清零定时器中断溢出标志位         

            ENI                   ;开中断

            ;DISI

            RET

                                   

;**********************TCC中断处理**************************************           

INT_TCC:           DISI    ;先关闭中断

              MOV     BACC,A            ;保护ACC和STATUS

                       SWAPA   STATUS

                       MOV             BSTATUS,A

                       JBS     RF,0              ;判断是否为计数器中断,如果是得话进入

                       JMP     INTQUIT     ;计数器中断服务程序,不是则退出                                            

                            MOV     A,@6

                       MOV     TCC,A

                       BC      RF,0       ;清中断标志位              

              INC     TCC_Count

              JBS     STATUS,Z_FLAG

              JMP     INTQUIT

                            MOV A,@200

                       MOV TCC_Count,A

                       ;;;;;;;;;;;;;;;;;;;;;;;;;;;;

                            MOV A,@001000000B

                      XOR PORT6,A   ;蜂鸣器取反

                            INC LEDL ;LED加1                                                                      

INTQUIT:           SWAPA   BSTATUS       ;恢复寄存器

                       MOV     STATUS,A

                       SWAP        BACC

                       SWAPA   BACC                   

                RETI        

 ;;******************************************

DELAYMS:     

MOV         A, @200

MOV         LP_CNT0, A

NOP

P0_DLY:

NOP

MOV         A, @20

MOV         LP_CNT1, A

P0_LP:

NOP

NOP

NOP

DJZ  LP_CNT1

JMP  P0_LP

DJZ  LP_CNT0

JMP  P0_DLY

RET

 END    




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
越南制造.会成为中国制造的最大敌手吗?