定时器TMR0调试遇到问题,请高手帮忙解决【恢复】

2020-02-10 08:46发布

RD口接LED灯,程序如下,在proteus上仿真时可以正常运行,LED会闪,下载到单片机上时LED灯就一直亮着了,好像是定时器没有产生溢出,请帮忙分析下,谢谢了。



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

;在程序中调用定时器TMR0实现的延时程序完成点灯功能

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

STATUS                EQU                03H                ;定义状态寄存器

PORTD                EQU                08H                ;定义端口D的数据寄存器地址

TRISD                EQU                88H                ;定义端口D的方向寄存器



RP1                        EQU                06H                ;定义状态寄存器中的页选位RP1

RP0                        EQU                05H                ;定义状态寄存器中的页选位RP0



TMR0                EQU                01H                ;定义定时器/计数器0寄存器地址

PCL                        EQU                02H                ;定义程序计数器低字节寄存器地址

POTION_REG        EQU                81H                ;定义选项寄存器地址



INTCON                EQU                0BH

DATA1                EQU                6                ;定义TMR0寄存器初始值(250=256-6)

COUNT                EQU                20H                ;存放延时次数

;*****************主程序开始****************

        ORG                00H

        GOTO        MAIN

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

MAIN

        NOP                                        ;设置一条ICD必须的空操作

;*****************初始化********************

        BSF                STATUS, RP0        ;转到体1

        BCF                STATUS,        RP1



        MOVLW        07H                        ;设置选项分频寄存器内容

        MOVWF        POTION_REG        ;分频值设为1:256



        MOVLW        00H

        MOVWF        TRISD                ;设置端口D为输出

        BCF                STATUS,        RP0        ;转到体0

        BCF                STATUS,        RP1        

;***************初始化结束******************

START

        MOVLW        0FFH                ;将0FFH送到W

        MOVWF        PORTD                ;点亮端口D上所有的灯

        CALL        DELAY                ;延时1280ms



        MOVLW        0FH                        ;将0FH送到W

        MOVWF        PORTD                ;只点亮端口D低4位上所有的灯        

        CALL        DELAY

        MOVLW        0F0H                ;将0F0H送到W

        MOVWF        PORTD                ;只点亮端口D上的高4位所有的灯

        CALL        DELAY



        MOVLW        00H

        MOVWF        PORTD                ;灭端口D上的所有灯

        CALL        DELAY

        GOTO        START                ;循环

;*****************延时程序开始***************

DELAY

        MOVLW        14H                        ;设置循环延时64MS的次数为20次

        MOVWF        COUNT

LOOP1

        BCF                INTCON, 2        ;清除TMR0溢出标志位

        MOVLW        DATA1                ;TMR0赋初值

        MOVWF        TMR0                ;启动定时器

LOOP

        BTFSS        INTCON, 2        ;检测TMR0溢出标志位

        GOTO        LOOP                ;没有溢出,继续检测

        DECFSZ        COUNT                ;判断计数次数是否满20次

        GOTO        LOOP1                ;计数没结束,继续



        RETURN                                ;返回主程序

;*************************延时程序结束*******************

;************************程序结束***********************

        END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
yech
2020-02-10 12:10
我是用查询的方法判断定时器有没有溢出的,没有使用中断功能,因此不用下面两语句吧

MOVLW   0xa0 ;

MOVWF   INTCON  ;全局中断允许,定时器中断使能



另外,为什么我的程序仿真就可以正常运行呢?搞不明白

一周热门 更多>