PIC16f73定时器中断

2020-02-09 09:30发布

#include<pic16f7x.h>
unsigned int i=0,j=0,temp=0,t=0;
void tmint()                                                                          //TMR0初始化程序,使TMR0工作于定时器方式
        {
                T0CS = 0;                                                                 //TMR0时钟源选择,内部指令周期时钟
                PSA = 1;                                                                  //TMR0不分频,分配给WDT
                T0IF = 0;                                                                 //清除TMR0的中断标志
                T0IE = 1;                                                                 //TMR0中断允许
        }
main()
        {
                        GIE                = 1                ;                                        //        関总中断
                        PEIE        = 0                ;                                        //        関外設中斷
                        ADCON1        = 0x07        ;                                        //        A口全部配置為數字端口
                        TRISA        = 0x00        ;                                        //        A端口6路輸出       
                        tmint()        ;
                        while(1)
                                {
                                        if(t==1)
                                                {
                                                        t=0;
                                                        temp=~temp;
                                                        PORTA = temp;
                                                }
                                }
        }

void        interrupt MR0 ()
{


        if(T0IF==1)
        {       
                TMR0 = 0X08;                                                 //对TMR0写入一个调整值。因为与入TMR0后接着的
                                                                                        //两个周期能增量,中断需要别3个周期的响应时间,
                                                                                        //自动进行现场保护要消耗周期
                T0IF = 0;
                i=i+1;
                if(i==10000)
                        {
                                i=0;
                                t=1;
                        }
        }
       
}

请问,此方法是否正确,我在用SIM仿真时是PORTA口在680ms跳变一次。我把程序下到硬件里面,去点亮一个发光管,但没有反应。
请高手指点!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
qqrenzhi
2020-02-10 11:03
回复【楼主位】qqrenzhi  
-----------------------------------------------------------------------

我不解你写的程序有以下:
在定时器初始化应该设定TMR0的值吧,还有定时器的启动位呢?PEIE为什么置0?这样能进入中断服务程序里面吗?
设定数字端口不是用ADCON1吧,ANSEL和ANSELH吧。
还有就是你的LED是连在PORTA哪个脚呢?看你的程序应该是RA0,如果是其他的肯定有问题。temp=~temp,只能是1位。

我是按我用的PIC18来分析这个程序的。
希望对你有帮助,不当之处还望之处,相互进步。
---------------------------------------
按理说我的LED接在哪个脚都是可以跳变的啊!我用SIM仿真时,是0x00与0x3f的跳变化啊!

ADCON1配制 (原文件名:ADCON1配制.jpg)
-----------------------------------------
回复 【9楼】 portx 腾飞

........似乎没有看见__CONFIG(XXX);函数,确认下晶振配置位是否正常
---------------------
__CONFIG(XXX);我用软件里面配制的可以吗?

一周热门 更多>