当前位置: 代码迷 >> 单片机 >> 新手PIC单片机流水灯有关问题
  详细解决方案

新手PIC单片机流水灯有关问题

热度:57   发布时间:2016-04-28 15:03:12.0
新手求助PIC单片机流水灯问题!
型号是PIC18F452,用proteus仿真的。流水灯延时是用T0实现的。代码:
#include<p18f452.h>

unsigned int num=0;

void init();
void high_isr();
void low_isr();

#pragma code high_vector_section=0x08
void high_vector()
{
_asm goto high_isr _endasm
}

#pragma code low_vector_section=0x18
void low_vector()
{
_asm goto low_isr _endasm
}
#pragma code

#pragma interrupt high_isr
void high_isr()
{
num++;
TMR0L=56;
        if(num==50000)
{
num=0;
LATD=LATD<<1;
}
}

#pragma interruptlow low_isr
void low_isr()
{
}



int main(void)
{
init();
while(1)
{

}
}

void init()
{     
INTCONbits.GIE=0;

RCONbits.IPEN=1;     //使能中断优先级


T0CON=0x42; //TMR0设置:停止运行、8位定时,预分频1:8
TMR0L=56; //  0.4ms  晶振频率16MHZ
INTCONbits.TMR0IF=0;
INTCONbits.TMR0IE=1;
INTCON2bits.TMR0IP=1;
T0CONbits.TMR0ON=1;     //启动TMR0 

INTCONbits.GIE=1;      //开全局中断


TRISD=0x00;            //亮第一盏灯
PORTD=0x01;
}

疑问:
if(num==50000)
{
num=0;
LATD=LATD<<1;
}
   这里,1. 如果写num==50000的话,总共有8个灯,亮到第5个灯的时候就会重新从第1个灯亮起来
            如果写num==25000的话,能8个灯轮流亮,但是不稳定,有时候会跳过1个灯亮

         2. 要是在if语句结束后加上INTCONbits.TMR0IF=0,那就灯只永远亮着第1个灯

         3.要是在if语句结束后加上 if(LATD==0)
                          {
                    LATD=0x01;
                          }
           流水灯还是会不稳定的流水1轮半就重新开始。

          4.写LAT和PORT到底有什么区别啊?为什么推荐写LAT?

   请问下这些问题都是为什么啊?  INTCONbits.TMR0IF=0,标志位清0不是一定要加的吗?
------解决方案--------------------
unsigned int num=0;
num=50000,超过32167了
关于LAT和PORT,好好看datasheet吧,英文的有点别扭,个人也不是很的很懂,听同事讲的大概意思是LAT写进去什么读就是什么,PORT你写了之后,如果这个口接有上拉或者下拉什么的,你写进去的值会受到影响,
仅供参考
------解决方案--------------------
既然只有8个灯,num 计数到50000有什么特别意义吗?
建议试一下:
if(num == 8) num = 0;
LATD = 1<<num;
  相关解决方案