初学单片机,下面是一个外部中断程序,看中断程序,按照我的理解,led灯应该是一盏一盏亮起来,而不会熄灭

(接上面)但为什么会出现流水式的亮灭呢?

/*

学习内容:外部中断1的设置以及中断服务程序编写,外部中断0应用与此类似。
程序效果:按一下INT1按键,会看到LED流水顺序亮灭。
*/

#include<reg51.h>

sbit led1=P0^0;
sbit led2=P0^1;
sbit led3=P0^2;
sbit led4=P0^3;
sbit led5=P0^4;
sbit led6=P0^5;
sbit led7=P0^6;
sbit led8=P0^7;
sbit led_k=P1^4;

void delayms(unsigned int i);
void int1() interrupt 2 using 2//外部中断1服务程序
{
// delayms(10);

led1=1;
delayms(100);
led2=1;
delayms(100);
led3=1;
delayms(100);
led4=1;
delayms(100);
led5=1;
delayms(100);
led6=1;
delayms(100);
led7=1;
delayms(100);
led8=1;
delayms(100);
led1=0;
delayms(100);
led2=0;
delayms(100);
led3=0;
delayms(100);
led4=0;
delayms(100);
led5=0;
delayms(100);
led6=0;
delayms(100);
led7=0;
delayms(100);
led8=0;
delayms(100);

}

main()
{
EA=1;//中断总允许位
EX1=1;//开启外部中断1
IT1=1;//IT1指中断1类型控制位,通过软件置位/清零该位来选择外部中断1以下降沿/低电平方式触发。
led_k=0;/*打开8个led的总开关*/
while(1)
{

}

}

void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

我试了一下 你的程序没什么问题,只是用的是P0口,记得要加上拉电阻,而且在主程序开始就要先把P0置为0x00;然后按键之后就会先一盏接着一盏亮起来在灭掉
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-23
理解错啦,应该是一盏一盏的亮起来,然后再一盏一盏的灭掉

单片机工作总结
11. 面对一个新的项目,要先自己想下怎么做,而不是单单地找别人的代码,这是很重要的,因为只有这样做,自己才能独立去思考一个新的东西,也更有可能创造出一个更好的程序。 有时候单片机的学习很单调,有些知识学起来很抽象,不容易理解,只能慢慢适应,一边学习理论知识,一边编写程序,将程序刷入单片机进行调试,通过这...

单片机间隔点亮一led灯的C语言程序
上述程序的作用是在单片机的P1口上间隔点亮一盏LED灯,每隔1秒钟灯的状态会发生一次变化,即由点亮状态变为熄灭状态,再由熄灭状态变为点亮状态。

求深度解析单片机C语言中的下列程序(部分),我实在看不懂。能不能帮我...
if(P1==0x00)如果第八个灯亮了 后;就要重新赋予P1口的值;{ P1=0xff;P1口从新赋值;for(x=0;x<8;x++)这个语句和上面的类似,就是顺序反过来了,他是从第八个灯开始亮的;{ P1<<=1;左移一位第一灯亮了,依次亮 delayxms(500);延迟函数 } } } }大概就是这样了 不明白在问我 ...

单片机点亮一盏led灯代码
用MCS51单片机汇编语言编写的点亮一只LED灯源程序LED1.ASM,代码如下:ORG 0000H AJMP MAIN ORG 0030H MAIN:MOV A,#FEH MOV P1,A AJMP END

单片机程序翻译
START: MOV P3,#0FFH (P3口输出高电平,因为没电路图,所以只能从后面的程序推断:所有的灯灭!!也就是电路图的灯的一端接电源,另一端接P3口。下面的程序以全灭处理(当然也可能所有灯亮,具体看电路图是怎么样的))MOV A,#0FEH (A置初值,只有最左边或最右边灯亮)JNB P1.2,LOOP ...

51单片机一个IO口只能控制一盏LED灯吗?
1. 一般而言,如果不接其他IC在中间,只能控制一个灯:进制里有“码”的概念,使用二进制的单片机的一个I\/O口只能输出高电平或低电平,那么就只有开关两种状态。既然如此,使用一个IO口便只能控制外围的一个开关状态。开关则对应led灯的亮暗。2. 引申一下,多个io口则是可以控制多个开关,如果简单点...

arduino编程单片机 控制让两盏led灯各自闪烁,一盏灯亮1秒然后灭1秒,并...
; \/\/ 设置为每1ms调用一次TimerCbk函数。 MsTimer2::set(1, TimerCbk); MsTimer2::start();}void loop(){ if (timerCntA >= TM_MS(1000)) { digitalWrite(LED_PIN_A, !digitalRead(LED_PIN_A)); timerCntA = 0; } if (...

...实现LED灯循环左移。为什么我的程序只亮一盏灯啊。。。没有循环啊...
你的led灯是共阳的,从你给的条件可以判断。p1=0xfe,即最低位为‘0’,故点亮的是p1.0引脚所对应的led灯,也就是你所谓的c0。所以你的程序没有问题啊。

单片机,按键控制一盏灯的程序
设按钮状态(高\/低)输入某个IO口;找到读取这个IO口的数据地址;程序不断读取这个地址,并比较相应位是否有变化;(要有去抖处理,否则一次按键会产生多个变化)设指示灯对应的IO口数据地址;根据按键发生与否设置这个IO口相应位进行翻转。

51单片机中如何用汇编语言编写流水灯
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:ORG 0000H;复位启动AJMP START;ORG 001BH;T1中断AJMP T1INT;;定义变量===YSJSEQU 30H;延时计数器LEDEQU 31H;LED控制缓冲器 ;主程序===START:MOV LED,#0FEH;初始化数据MOV YSJS,#0;MOV TMOD,#10H;定时器1工作于方式1,16位定时...

相似回答