看了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)中去,也是正常的!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>