求高手举例说明一下51中断的using使用注意事项

2020-01-15 19:27发布

看了51的通用寄存器,不明白里面的工作原理,以下是我在网上看到的例子51单片机中断函数using问题  

2012-04-24 00:24:15|  分类: 单片机 |  标签:4组工作寄存器   |举报|字号 订阅
看郭天祥的第4课,一开始有个例子,就是发光二极管每1秒(循环加1消耗时间)亮一次,每二秒(定时器0中断)所有数码管转一次,从0转到F  我的源程序如下:

#include<reg52.h>
#include<intrins.h>

unsigned int i;
unsigned int icount;
void delay(unsigned int ) ;
unsigned char code  table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};

sbit wei=P2^7;
sbit duan=P2^6;
sbit beep=P2^3;

void main ()
{  
icount=0;
i=0;
  P1=0xfe;

wei=1;
P0=0xc0;
wei=0;
    duan=1;
P0=0x00;
duan=0;

  //定时器1,方式1
TMOD=0x01;
EA=1;
ET0=1;
TH0=15536/256;
TL0=15536%256;
TR0=1;

    while(1)
    {
    delay(1000);
     P1=_cror_(P1,1);
  beep=~beep;





   }

  
}

void t0() interrupt 1 using 2
{
TH0=15536/256;
TL0=15536%256;
icount++;
  /*
if(icount%20==0)
{  beep=~beep;
   P1=_cror_(P1,1);
}
*/
if(icount%40==0)
{

if(i==16) i=0;
duan=1;
P0=table[i];
duan=0;
i++;

}


}

void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}



以上程序经调试时,2秒的数码管是正常的,但是跑马灯去在不停的闪,而不是1秒,无意中将  中断函数 using 0  改为了using 1就正常了,去掉 using 0,也是正常的,之前的程序也有用过using 0,不知是否因为  RAM 段0中有什么指令有叠加,导致存入寄存器数据有误!!!


如果我仍然用 using 0,但是把dealy 函数中的内容直接入到while(1)中去,也是正常的!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
su33691
1楼-- · 2020-01-16 12:05
最近码了一段代码,用了INT0,T0,INT1三个中断。为了加速运行,用了using 1/2/3。中断里尽量不要调用其它函数。运行还正常。
sandeant
2楼-- · 2020-01-16 16:02
学习了,以前不懂。

一周热门 更多>