拿流水灯来说,我们来看图二,LED灯,也就是二极管,八只LED的正极通过一根总线接在+5V的电压上,再看图一,可知八只LED灯的负极接在LED、P2的8个I/O口上。根据二极管的导通条件可知,在单片机的IO口输出低电平时,才能

includevoid main(){ P1=0xFE; EA=1; EX0=1; TCON=0X01; while(1);}void External_Tnterrupt_0() interrupt 0{ P1=P1>>1;}

delay();P3=0xdf;//第六个灯亮 delay();P3=0xbf;//第七个灯亮 delay();P3=0x7f;//第八个灯亮 delay();} }

TH0=0x00; //重新赋值,方式1是16位计数器,不能硬件重装初始值 TL0=0x00;LED=~LED; //指示灯反相,可以看到闪烁 }

开放两个外部中断源,把两个按键分别接在外部中断信号输入端,中断方式设置为边沿触发方式。在中断服务子程序中,可以采取每次循环移动两位的方式来驱动外接LED

用中断方法来控制流水灯的,,,教教我 是8个LED低电平灯亮接P2口,开始时D1到D8循环亮

如下即可:ORG 0000H SJMP START ORG 000BH SJMP T0_INT START:MOV TMOD, #01H MOV TH0, #3CH ; (65536 - 50000) / 256;MOV TL0, #0B0H ; (65536 - 50000) % 256;S

如下即可:;ORG 0000H LJMP MAIN DJNZ R7,DJNZ R6, $ - 2 JB P3.2, $ + 8 CPL P1.0 ;LED JNB P3.2,RETI MAIN:MOV IE, #81H SJMP END

MOV R2,#20 SETB LED SETB KEY1 CLR KEY2 CLR TR0 LCALL InitTimer0 LOOP:;add your code here!JNB KEY1,DELAY10MS JB KEY1,CPL TR0 JNB TR0,D1 CLR LED MOV TH0,#3CH;50MS MOV TL0,

out gicr, temp ; 允许INT0、INT1中断 out gifr, temp ; 清除INT0、INT1中断标志位 clr counter clr flag sei ; 使能中断 state: ldi zl, low(led_7 * 2)ldi zh, high(led_7 * 2) ; Z寄存器取得7段码

用汇编怎么实现利用中断控制LED灯定时!S的亮和灭.

用89S52单片机构件建一个彩灯控制系统,系统用P1口外接8个发光二极管,没有键按下时,8支彩灯每隔0.5s全亮全灭一次。按K1时,8支彩灯从左至右循环点亮。按K2时,8支彩灯从右至左循环点亮。按K3时,8支彩灯先右循环

给个四路:定意一个变量;if(按键1按下)变量为1;if(按键2按下)变量为2;if(变量==1){ 左移控制;} else if(变量==2){ 右移控制;}

3 当软件计数器减到0时,表示0.5秒时间到 这时可以判断开关状态 开关合上 可以让8个LED左移一位 开关断开 可以让8个LED右移一位 呵呵 按上诉算法 编写程序 就可以实现你的要求(指导可以见百度知道的消息

既可用外部中断方式来实现;也可以用查询方式读键处理.灯的亮灭,就是对P1口的赋值操作,每次多一盏,可以让初值为0xff.此后,每次左移或右移实现.每次少一盏,可以与前面相反,右移或左移,并在移入位补1.注意去抖动处理,

P1=_crol_(P1,1);delay();} }

P1口是输入:如果你用的是89C51单片机的话,外部中断是在P3.2和P3.3引脚,P1口是没有的。所以,如果你既想用外部中断又想用P1口做控制输入端,就需要用“与(或)”逻辑电路从P1口导出中断信号给P3.2和P3.3引脚。

EX0=1;//开外部中断0 3.2口,默认的是电平触发方式,如果需要用跳变沿触发,请设置下,INT0为P3.2口// num1=0;num2=0;num3=0;num4=0;while(1) //程序大循环// { wela=0x80;delay(100); //选择个

用外部中断1控制LED灯:单片机P1端口的8个LED做右移,不断循环,当按外部中断INT1开关时,循环停止,转而

2、能够进行信息格式的转换,例如串行和并行的转换。3、能够协调CPU和外设两者在信息的类型和电平的差异,如电平转换驱动器、数/模或模/数转换器等。4、协调时序差异。5、地址译码和设备选择功能。6、设置中断和DMA控制逻辑

通用IO端口控制寄存器”,还有一个是存放数据的“通用I/O端口数据寄存器”。数据寄存器的每一位是和GPIO的硬件引脚对应的,而数据的传递方向是通过控制寄存器设置的,通过控制寄存器可以设置每一位引脚的数据流向。

首先把IO端口设为输出模式,若IO端口接led的正极,led负极接地,让单片机输出高电平led就能亮,输出低电平led就灭了。当然还要考虑led两端电压和流过led的电流要合适。

如果只是控制亮和灭,控制IO口输出0或1就可以了。如果需要控制LED的亮度,可采用PWM控制,也就是通过高速切换LED的开启和关闭,开启的时间越长(占空比越大),亮度越高,反之,亮度越低。

第一功能是普通I/O口,其中P0口需外接上拉电阻;第二功能各不相同,分别为:P0口:作外部三总线的地址总线(低8位)/数据总线;P1口:作扩展型芯片的外部引脚,例如52的C/T2外部信号输入,S52之WDT的报警输出等;P2口

外部中断控制LED的亮灭用到了IO端口的什么功能?

判断开关对应的端口电平,改变led对应端口即可。交替闪烁就是在循环中让两个LED端口交替高低电平。循环中加入延时。延时函数我用循环实现。题目没有要求精准延时,如精准需用中断。include define uInt unsigned int

;led1 = ~led1;//KEY1按一下LED1亮 再按一下LED1灭 } } if(!key2) { Delay(10);if(!key2) { while(!key2) led1 = 1; //按下KEY2时LED1灭 led2 = ~led2;//KEY2也是这样 } } } }

单片机控制led灯亮和灭,led灯初始状态从左到右两个灯间隔一个灯循环亮灭,然后从右到左循环亮灭,,当按下按键,led灯全亮,然后全灭。然后再恢复循环。二、实验过程 (一)实验项目的方案分析 1.设计原理 STC12C5A

1、首先打开桌面上的keil软件,在进行对51单片机进行编程时最常用的就是keil软件。2、编写相应的代码:#include //定义单片机的头文件sbit led=P2^0; //定义单片机的管脚,void main(void) //主函数

LED1=1;} if(i==100) // 第二个灯延时熄灭 { i=0;LED2=1;} }

按键位置:P0.1;功能:1,当第一次按键按下,第一个灯亮,按键放开灯灭 2,当第二次按键按下,第二个灯亮,按键放开灯灭 3,重复执行前面两个步骤 灯的位置:P2口;/ include define uint unsigned

P2IFG =0; //中断标志清除,防止配置过程中出现中断标志为1 _EINT(); //开总中断 LPM4; //进低功耗4 } /***端口中断程序***/ pragma vector = PORT2_VECTOR __interrupt void port2(void){ switch

用外部中断,按一次键,两个LED灯点亮,再按一次,两个LED灯熄灭,循环。用Keil(C语言)编译

单片机控制led灯亮和灭,led灯初始状态从左到右两个灯间隔一个灯循环亮灭,然后从右到左循环亮灭,,当按下按键,led灯全亮,然后全灭。然后再恢复循环。二、实验过程 (一)实验项目的方案分析 1.设计原理 STC12C5A

while(1);} void lignt() interrupt 0 { led=0;delay(100);} 以上,把P3^7改为led=0; void lignt() interrupt 0中的led=0改为led=1; 另,延时可以不要。按住不放可实现LED一直亮。

flag是用来记忆按键状态,按下key3,flag置1,程序中检测到flag是1才闪烁,松手后LED仍然闪烁,同时下一轮还可以检测另外两个按键 while(1){ if(key1==0)//判断按键是否按下 { Delay1ms(10);//延时消抖 if(key1=

1、首先打开桌面上的keil软件,在进行对51单片机进行编程时最常用的就是keil软件。2、编写相应的代码:#include //定义单片机的头文件sbit led=P2^0; //定义单片机的管脚,void main(void) //主函数

sbit key=P3^2;void ext0() interrupt 0 { flag=1;} main(){ IT0=1;EA=1;EX0=1;P1=distab[0];while(1){ if(flag==1)P1=distab[8];while(!key);flag=0;P1=distab[0];} }

far @interrupt void TIM1_UPD_OVF_IRQHandler(void){ TIM1_SR1 = 0x00; // 清除更新标志 } far @interrupt void EXTI0 (void)//外部中断子函数 { if(PA_on){ sbi(PA_ODR,4);PA_on=0;}//PA4为灯亮

单片机用外部中断0实现:一个亮的LED灯,当按下按键后,闪烁2下,继续恢复原来状态。

请你参考: 电路 代码 #include#define LED P2unsigned char step;void Delayms(unsigned int x){ unsigned char t; while(x--) for(t=0;t<120;t++);}void main(){ unsigned char i,j; TCON|=0x01; IE|=0x81; i=0; j=0xFF; step=0; while(1) { switch(step) { case 1: LED=~(1<<i);break; case 2: j=j^0xFF;LED=j;break; case 3: LED=0x00;break; } i=++i%8; Delayms(200); }}void EX0_INT() interrupt 0{ EX0=0; Delayms(10); if(++step==4) step=1; EX0=1;}希望对你有所帮助!!!!
#define LED P1 sbit key=P2𠆢0; void main() {LED=0x0F; while(1) {if(key==0) {delayms(10); if(key==0){ LED=0;delayms(500);LED=0x0FF;delayms(500); LED=0;delayms(500);LED=0xFF;delayms(500); LED=0;delay(500);LED=0xFF;delayms(500); } LED=0x0F; } } }
main() { // CLK_CKDIVR=0x00; CLK_Init(); IO_Init(); led_on=0; //timer1_init(); EXTI_DeInit();?/初始化外部中断IO口 _asm("rim"); while(1) { cbi(PA_ODR,4); } } @far @interrupt void TIM1_UPD_OVF_IRQHandler(void) { TIM1_SR1 = 0x00; // 清除更新标志 } @far @interrupt void EXTI0 (void)//外部中断子函数 { if(PA_on) { sbi(PA_ODR,4);PA_on=0;}//PA4为灯亮 else { cbi(PA_ODR,4);PA_on=1;}//PA4为灯灭 EXTI_CR1=0x00 ; } 不懂再追问,你只需要把主程序里面的灯定为一个状态,外部中断里面再定一个状态。要亮2次,加个延时,就行了。
/* 按键位置:P0.1; 功能:1,当第一次按键按下,第一个灯亮,按键放开灯灭 2,当第二次按键按下,第二个灯亮,按键放开灯灭 3,重复执行前面两个步骤 灯的位置:P2口; */ #include #define uint unsigned int #define uchar unsigned char sbit BUTTON=P0^1;//按键的位置 void DELAY(uint x) { uchar s,j; for(s=0;s<x;s++) for(j=0;j<114;j++); } void main() { uint led=0; while(1) { if(BUTTON==0) { led++; if(led==1)//第一次按键按下 { P2=0XFE;//1111 1110 第一个灯亮 DELAY(500);//延时 while(BUTTON!=0)//等待按键放开 { P2=0xff;/1111 1111灯灭 DELAY(500)//延时 } } if(led==2)//第二次按键按下 { led=0;//要给次数初始化 P2=0XFC;//1111 1101第二个灯亮 DELAY(500);//延时 while(BUTTON!=0)//等待按键放开 { P2=0xff;//1111 1111第二个灯灭 DELAY(500)//延时 } } } }
如果只是控制亮和灭,控制IO口输出0或1就可以了。 如果需要控制LED的亮度,可采用PWM控制,也就是通过高速切换LED的开启和关闭,开启的时间越长(占空比越大),亮度越高,反之,亮度越低。
从火线出发经过一个电阻经过开关,开关后有两条导线可选择,再加一个开关,然后经过导线再到灯泡再经过导线到零线就OK拉
IE,中断允许控制寄存器,各位定义如下: EX0(IE.0),外部中断0允许位; ET0(IE.1),定时/计数器T0中断允许位; EX1(IE.2),外部中断0允许位; ET1(IE.3),定时/计数器T1中断允许位; ES (IE.4),串行口中断允许位; EA (IE.7), CPU中断允许(总允许)位。 IE.5及IE.6没用定义。 IP,中断优先级控制寄存器,各位定义如下: PX0(IP.0),外部中断0优先级设定位; PT0(IP.1),定时/计数器T0优先级设定位; PX1(IP.2),外部中断0优先级设定位; PT1(IP.3),定时/计数器T1优先级设定位; PS (IP.4),串行口优先级设定位; PT2(IP.5) ,定时/计数器T2优先级设定位。 IP.6和IP.7没有定义。
你好!这是作业吗》?是要仿真还是用开发板?
;晶振为6MHZ,亮0.7s,灭0.3s,P1.0口输出 WSTA EQU 20H STA BIT WSTA.0 ;亮灭标志位 ORG 0000H LJMP MAIN ORG 000BH LJMP B_T0 ;定时器中断0入口 ORG 0030H MAIN: MOV R0,#20H ;20H-7FH清零 MOV R7,#60H CLR A M01: MOV @R0,A INC R0 DJNZ R7,M01 MOV TMOD,#01H ;方式1定时 MOV TH0,#9EH ;定时50ms MOV TL0,#58H MOV R7,#14 ;0.7s计数 SETB EA ;打开定时器总中断 SETB ET0 ;打开定时器0中断 SETB TR0 ;打开定时器0 CLR STA ;使标志位初始为0 CLR P1.0 ;刚开始为低电平 SJMP $ ;等待中断 B_T0: MOV TH0,#9EH ;定时50ms重设 MOV TL0,#58H JB STA,B01 DJNZ R7,B02 MOV R7,#6 ;0.3s计数 SETB STA SETB P1.0 ;灯灭 SJMP B02 B01: DJNZ R7,B02 MOV R7,#14 ;0.7s计数 CLR STA CLR P1.0 ;灯亮 B02: RETI
LED EQU P3.3 KEY EQU P3.7 ORG 0000H LJMP START ORG 000BH LJMP T0_INT ORG 0030H ;-------------------------------- START: MOV TMOD, #01H MOV TH0, #HIGH(65536-62500) MOV TL0, #LOW(65536-62500) MOV IE, #82H ;-------------------------------- LP1: SETB LED JB KEY, LP1 CALL DELAY JB KEY, LP1 JNB KEY, $ ;------------------- MOV R2, #160 SETB TR0 CLR LED LP2: JNB TR0, LP1 JB KEY, LP2 CALL DELAY JB KEY, LP2 JNB KEY, $ SJMP LP1 ;-------------------------------- T0_INT: MOV TH0, #HIGH(65536-62500) MOV TL0, #LOW(65536-62500) DJNZ R2, T0_E CLR LED CLR TR0 T0_E: RETI ;-------------------------------- DELAY: MOV R6, #20 DJNZ R7, $ DJNZ R6, $ - 2 RET ;-------------------------------- END
很酷的流水灯 #include typedef unsigned char uchar; #define Ton 40 #define LED P0 sbit leds=P1^4; sbit LED0 = P0^0; sbit LED1 = P0^1; sbit LED2 = P0^2; sbit LED3 = P0^3; sbit LED4 = P0^4; sbit LED5 = P0^5; sbit LED6 = P0^6; sbit LED7 = P0^7; unsigned char Maikuan=0; static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uchar Occupy_led; //占空比越大,灯越亮 bit light; uchar m; void Inittime() { TMOD = 0x02; //定时器0,工作方式2,自动重装 TH0 = 256-Ton; TL0 = 256-Ton; ET0 = 1; EA = 1; TR0 = 1; } //定时器0中断 void time0() interrupt 1 using 0 { Maikuan++; } void main() { unsigned char i = 0,j = 0; //初始化i,j leds=0; Inittime(); while (1) { //第1,3,5,7个灯半亮,其余的全亮。 for(i=254; i>0; i--) { while ( Maikuan!=20) { LED = 0x00; } while ( Maikuan!=200) { LED = 0x55; } Maikuan = 0; } //最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。 for(j = 0;j<=7;j++) { i = 0; while(i!=255) // 由暗变亮 { if( Maikuan == 0) // 点亮 { LED = ledon[j]; } if(Maikuan == i) // 熄灭 { LED = 0xff; } if( Maikuan== 255) { i++; } } } for(j=7;j>=0;j--) { i = 0; while(i!=255) // 由亮变暗 { if(Maikuan == 0) // 熄灭 { LED = 0xff; } if( Maikuan == i) // 点亮 { LED = ledon[j]; } if( Maikuan == 255) { i++; } } } //所有的灯逐渐从暗到全亮,再由全亮到暗。 for (m=254; m>0; m--) { while (Maikuan!=Occupy_led) { LED = 0x00; } while (Maikuan!=127) { LED = 0xff; } Maikuan = 0; if (light) { Occupy_led++; } else { Occupy_led--; } if (Occupy_led==128) { Occupy_led = 127; light = !light; } if (Occupy_led>128) { Occupy_led = 0; light = !light; } } } }
没有问题我可以搞定。