单片机。。帮我看看中断里面控制P1口的if语句为什么执行不了

#include<reg51.h>
#define uchar unsigned char
uchar codeled_data[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar timer[]={0x00,0x00};
uchar dis[]={0x00,0x00};
uchar scan[]={0x02,0x01};
int tl=0,con1s=0;
delay(int ms)
{ inti,j;
for(i=0;i<ms;i++)
for(j=0;j<125;j++);

}
init()
{ intk;
for(k=0;k<2;k++)
{ dis[k]=timer[k];
}
P1=0x21;
TMOD=0x01;
TH0=0x3C; TL0=0xB0;
EA=1;ET0=1; TR0=1;

}
display()
{ intk;
for(k=0;k<2;k++)
{ P0=led_data[dis[k]];
P2=scan[k];
delay(1);
P2=0x00;

}

}

main()
{ init();
while(1)
{
display();
}
}
void time0(void) interrupt 1
{ ET0=0;
TH0=0x3C; TL0=0xB0;
con1s++; tl++;
if(con1s==20)
{ con1s=0;
timer[0]++;
if(timer[0]==10)
{ timer[0]=0;
timer[1]++;
if(timer[1]==2)
{ timer[1]=0;
timer[0]=0;
P1=0x00;
delay(100);
P1=0x12;
delay(10);
P1=0x00;
delay(100);
P1=0x12;
delay(10);
if(tl==1) { P1=0x0c; }
if(tl==2)
{ P1=0x21;
tl=0;
}
}

}
dis[0]=timer[0];
dis[1]=timer[1];

}
ET0=1;

}

第1个回答  2012-12-30
if(tl==1) { P1=0x0c; }
if(tl==2)
{ P1=0x21;
tl=0;
}
这个是进不了的,因为你是在 if(con1s==20)时才进入函数,这时tl也已经等于20了,而且越加越大,只有出现con1s=20,tl=1或2才可能出现。本回答被提问者采纳

各位单片机高手,哪位帮我分析一下下面这个程序,问题出...
回答:首先给你解释一下“<<”位移符的作用: 因为你的P1=0xfe,二进制数据就是11111110,左移一位之后为11111100,0往左移了一位,但是最低位系统自动以0补齐,而0x7f的二进制数据位01111111,所以if语句是永远进入不了的。 当然,针对此问题,C51给出了一个解决方案: 使用_crol_()函数可解决此问题...

单片机中断函数不工作了?咋回事呀?
你把定时清零 it =0 放到P1=0xff后面试试,LedCycl();这里面有延时,当执行完的时候it的值早就大于二十了,但是没有再被清零,所以只进一次

c语言单片机在中断后执行do while程序,一直在执行do里面的循环体,不进...
do while语句是这样的。do { 程序代码 } while(判断条件)当while中的判断条件为真时,一直执行do里面的代码。看看你的代码就知道原因了。在你的do语句里面,首先是把P0的值赋给key,接着循环七次,然后每次都对应一个switch语句。不管是switch中的哪个case执行了,改变的都是P1口的值。执行完for循环...

单片机中断函数不工作了?咋回事呀?
it 没有初始化,可能一出来就大于20了。还有比较的时候用 if( it >= 20 ){ it = 0;} 比较妥。

51 单片机 程序出错 不执行定时器中断1 同时delay函数也有错 求高手...
1.独立按键的判断在程序中如果没有用sbit定义过不能写为 P2^n 的形式,在程序体内这种写法表示的是异或 2.中断程序里,进入中断程序以后如果不是特殊需要,先关断自身的中断控制位,退出中断的时候再打开 3.在单片机里写程序的时候能省资源就省,52单片机是8位的,如果变量范围不超过255就不要用int...

单片机调试的时候出错了 求大神
错误一、按键检测函数内,赋值语句被你写成判断语句了,如下图这里 就是说多写了一个等于号,并且这几个按键的检测部分否存在此错误,另外还有第一行的if判断语句也要使用方括号 错误二、中断函数部分,在中断内不能使用局部变量的声明,否则相当于每次进入中断都重新声明一个变量,之后再累加,始终是从...

51单片机IF使用
if{p1=p2} 这条指令是错误的。如果不是0时候 我给P2信号 P1会输出吗?根据你这句话的意思,你应该写:if(P2){p1=p2} 此时,如果P2不是0时候,你给P2信号,P1会输出P2的值。

为什么51单片机开发板,p1口 p1.6和p1.7的灯不受程序控制,一直亮着?
如果51单片机发狂的话这里面一直亮着那就说明里面出现的短路了这个问题如果出现短路了一般情况就会出现这样的一种情况所以呢无论从哪个角度讲把方方面面来说的话这个里边这个电其前

...为什么进入中断后出不来,一直在中断里面运行
检查下你是用什么方式中断的,如果外部触发一直存在肯定就跳不出来,如果怀疑是程序问题,在DJNZ R0,LOOP3上面把R0设为1,只执行一次就应该出来,如果还是没出来,肯定就是外部触发的问题了。。。

单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了...
这句是多余的 根本不m会执行 INT_0: PUSH ACC ;由于p中1断中1A被设为10所以5中7断返回后对A移位没有意义o A一e直为10 ,并不d是只 能中4断一i次 MOV A,#0FFH MOV P0,A LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY MOV A,#00H MOV P0,A LCALL DELAY LCALL DELAY LCALL ...

相似回答