LED1 1ms闪烁人眼分辨不出来 定时器设定为16位定时50ms 另设一变量作定时器中断计数,到10(0.5S)的倍数时LED2取反,到50(2.5S)的倍数时LED3取反 include
while(a) // 通过中断例程来改变 a 的值,从而可退出下面这个死循环 { P2_0=b;delay();b=!b;}
TR0 = 1; //启动定时器0 LED = 0; //关闭LED灯 while(1){ if(K1 == 0) // K1按下,增加频率 { while(K1 == 0); // 等待按键释放 freq += 20;if(freq > 100) freq = 100; // 频率
include
如何通过51单片机控制LED灯以1s的频率闪烁,求源代码。
请你参考:电路 代码 include
EX0=1;//开外部中断0 IT0=1;//跳变沿触发 for(i=7;i>0;i--)//上电后灯先从左向右亮 { Delay(100);a=_crol_(a,1);P2=a;} while(1);} void Init0() interrupt 0 { b++;c++;if(b==0)//检测
51单片机只有2个外中断是P3.2 和 P3.3 可以用计数器再实现2个外中断(计数器0, P3.4和计数器1, P3.5)4个按键分别接到P3.2--P3.5 4个LED随便接其它IO口
单片机的P2.5,P2.6,P2.7口分别接三位动态数码管的位选端,P0口接动态数码管的段选端。然后,P1.0口接一个电阻串联一个LED灯然后接地,电阻取200~470欧之间就行,是一个限流电阻。中断用的是外部中断0,要触发
LED6=1;LED7=0;LED8=0;Delay(500);LED7=0;LED8=0;} } 备注:1、led对应引脚可以修改,程序中默认单片机引脚低电平点亮led,如果是高电平点亮 led,反过来设置引脚电平就可以了;2、延时时间可以按自己需要修改;3、
是不是按一下开关触发中断,使LED闪烁,再按一下,LED熄灭?LED EQU P1.0 ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-41667)MOV TL0,#LOW(65536-41667)SET
void lignt() interrupt 0 { led=0;delay(100);} 以上,把P3^7改为led=0; void lignt() interrupt 0中的led=0改为led=1; 另,延时可以不要。按住不放可实现LED一直亮。
51单片机外部中断 点亮LED
LJMP MAIN ORG 0100H MAIN: SETB LED ;LED 灭 LL1: JB KEY , LL1 ;等待按键第一次按下 LCALL YS ;延时去抖 JB KEY,LL1 ;按键第一次按下 则往下执行 LL12:
{ led1=~led1;count++;if (!(count%1000)) {led2=~led2;} if (count==5000) {led3=~led3;count=0;} } led1是看不出闪烁的 太快了
led=1;//点亮 delay(100);//延时100MS led=0;//熄灭 } else led=0;} void delay(unsigned int i){自己根据单片机频率写个1MS带形参的演示程序} 这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,
case 0: led = 1; readkey(); break; //熄灭 case 1: delay(); readkey(); //慢速闪烁 case 2: delay(); readkey(); //中速闪烁 case 3: delay(); readkey(); led = ~led; //快速闪烁 } }
请教c51单片机,c语言编程,关于控制LED灯闪烁频率?
// 51单片机控制八个发光二极管 左右循环。include
LED6=1;LED7=0;LED8=0;Delay(500);LED7=0;LED8=0;} } 备注:1、led对应引脚可以修改,程序中默认单片机引脚低电平点亮led,如果是高电平点亮 led,反过来设置引脚电平就可以了;2、延时时间可以按自己需要修改;3、
51单片机输出pwm波控制led灯亮度 频率50HZ,周期是20ms 看你调节的精度 如定时器定时1ms,高电平宽度一次变化是5 如果想要调节精度高,定时器定时时间小,就要频繁地发生中断,会影响主程序的运行 如 要求占空比每步调节为1%
以上,把P3^7改为led=0; void lignt() interrupt 0中的led=0改为led=1; 另,延时可以不要。按住不放可实现LED一直亮。
是不是按一下开关触发中断,使LED闪烁,再按一下,LED熄灭?LED EQU P1.0 ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-41667)MOV TL0,#LOW(65536-41667)SET
51单片机通过外部中断和开关控制LED闪亮
TL0 = 0xCC; //使用最高电平9004H ET0 = 1; //使能定时器中断 EA = 1; //开放全局中断 TR0 = 1; //启动定时器0 LED = 0; //关闭LED灯 while(1){ if(K1 == 0) // K1按下,增加
void delay(void){ int i=10000; //这个值调整亮灯灭等快慢,越小越快越大越慢 while(i--)return;} //从上到下亮灯 void LED_a(void){ LED_IO1 = 0;delay();LED_IO2 = 0;delay();LED_IO3 = 0;delay
ET0=1;//外部中断0、1下降沿中断 ET1=1;EX0=1;EX1=1;EA=1;while(1)P0=0xFF; // P1的8个LED,高电平亮 } void int0_int() interrupt 0 { unsigned char i ,j, tmp=0x01;for(i=3; i>0; i--
while(1){ P3=0xfe; //第一个灯亮 delay(); //调用延时函数 P3=0xfd; //第二个灯亮 delay(); //调用延时函数 P3=0xfb; //第三个灯亮 delay(); //调用延时函数 P3=0xf7; //第
LED8=1;//LED初始状态为全灭 } void INT0() interrupt 0 { uint i;for(i=0;i<4;i++){ LED8=0;Delay(500);LED8=1;} } void INT1() interrupt 1 { uint i;for(i=0;i<4;i++){ LED1=0;LED
C51单片机程序。利用外部中断INT0,INT1,当INT0产生中断时,使LED8亮8灭闪烁4次;
#include #include void delay_ms(unsigned int x) //误差 0us { unsigned char a,b,c; for(c=x;c>0;c--) for(b=142;b>0;b--) for(a=2;a>0;a--); } void main(void) { ET0=1;//外部中断0、1下降沿中断 ET1=1; EX0=1; EX1=1; EA=1; while(1) P0=0xFF; // P1的8个LED,高电平亮 } void int0_int() interrupt 0 { unsigned char i ,j, tmp=0x01; for(i=3; i>0; i--) for(j=8; j>0; j--) { P0=tmp; delay_ms(500); //500ms闪烁 tmp = _crol_(tmp,1); } } void int1_int() interrupt 2 { unsigned char i ,j, tmp=0x80; for(i=3; i>0; i--) for(j=8; j>0; j--) { P0=tmp; delay_ms(500); //500ms闪烁 tmp = _cror_(tmp,1); } }是外部中断期间当前亮着的LED灯继续亮着,流水不动?很好办呀,进入外部中断时你保存流水灯当前的状态就可以了。比如: ORG 0000H LJMP MAIN ORG 0003H LJMP EXTI0 LED EQU 30H ORG 0030H MAIN: MOV SP,#5FH SETB EX0 SET IT0 SETB EA MOV LED,#FEH LOOP: MOV P0,LED LCALL DELAY MOV A,LED RL A SJMP LOOP DELAY: MOV R2,#100 DELAY1: MOV R3,#250 DJNZ R3,$ DJNZ R2,DELAY1 RET EXTI0: PUSH ACC PUSH LED .....;加入你的中断程序。 POP LED POP ACC RETI
main() {P3^7=0; EA=1;EX0=1;IT0=1;while(1);} void lignt() interrupt 0 { led=0; delay(100);} 以上,把P3^7改为led=0; void lignt() interrupt 0中的led=0改为led=1; 另,延时可以不要。按住不放可实现LED一直亮。
while(1) { if(num>=20) //num==20最好改成 >=20 防止由于按銉延时而错过num==20的机会而使程序出现长时的混乱 { num=0; led1=~led1; led2=~led2; } if (KEY==0)//按键是否按下 { 延时10-20MS; while(KEY==0);//按键是否抬起 if (TR0==1)TR0=0: else TR0=1: } } 也可以用开关中断来实现 如果按键不听使唤,在if (KEY==0)后大括号里的延时语句后再加一次if (KEY==0)判断
sbit key1=P1𠆢0; sbit key2=P1𠆢1; #define LEDPORT P2 程序里: while(1) { if(key1==0) LEDPORT=0; if(key2==0) LEDPORT=0xff; }
是不是按一下开关触发中断,使LED闪烁,再按一下,LED熄灭? LED EQU P1.0 ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0 ORG 0030H MAIN: MOV TMOD,#01H MOV TH0,#HIGH(65536-41667) MOV TL0,#LOW(65536-41667) SETB ET0 SETB EA SETB EX0 SETB IT0 CLR A SJMP $ EXT0: CPL TR0 RETI T0ISR: CLR TR0 MOV TH0,#HIGH(65536-41667) MOV TL0,#LOW(65536-41667) SETB TR0 INC A CJNE A,#4,T0E CLR A CPL LED T0E: RETI END
下面的程序我已经调试过了,你可以直接使用,但是一秒闪烁次数t的最大为2000,如果要大于这个数,你必须改小dalay1ms ()内的j值,就可以改大t #include sbit LED0=P1^0; unsigned int t=0,k; void dalay1ms (unsigned int i) //晶振选用11.0592 { unsigned int j; for(i;i>0;i--) for(j=922;j>0;j--); } void main () { EA=1; ES=1; TMOD=0x20; //定时器T1方式为2 TH1=0xfa; //波特率设定为9600 TL1=0xfa; while(1) { if(t!=0) { k=2000/t; dalay1ms (k) ; LED0=!LED0; } if(t==0) LED0=0; } } void counter4(void) interrupt 4 { while(RI==0); RI = 0; t= SBUF; }
LED1 1ms闪烁人眼分辨不出来 定时器设定为16位定时50ms 另设一变量作定时器中断计数,到10(0.5S)的倍数时LED2取反,到50(2.5S)的倍数时LED3取反 #include sbit led1=P0^0; sbit led2=P0^1; sbit led3=P0^2; unsigned int count; void main() { TMOD=0x01; //定时器0,工作方式1 TH0=(65536-500)/256; /////////0.5ms TL0=(65536-500)%256; EA=1; ET0=1; //开定时器0中断 TR0=1; //启动定时器0 } void time0() interrupt 1 { led1=~led1; count++; if (!(count%1000)) {led2=~led2;} if (count==5000) {led3=~led3;count=0;} } led1是看不出闪烁的 太快了