你画的什么都看不懂,你用单片机io端口控制led灯亮灭吗,这个可以的啊你把led灯正极接vcc在接一个限流电阻,把led灯负极接单片机io端口,然后写程序让单片机的io控制led灯亮灭,列入:p0_0 = 0;led亮,p0_0 = 1;
while(1){ P1=0xff; //点亮P1口第0个引脚上的LED灯,0xff为二进制的11111111 delay(1000); //延时1秒 P1=0x00; //将P1口全部置为0,熄灭LED灯 delay(1000); //延时1秒 } } 上述程序的作用是在单片机的P1口
一般情况下,用单片机的PWM实现LED的渐亮渐灭,当然,PWM也是靠定时器实现的,不过你自己也可以模拟出来。给你一个例程,我是用AVR的片子 第一种,PWM方式: /定时器T2初始化 void timer2_init(void) { TCCR2 = 0x00
LED_D1 =1;//=1亮灯 ,=0灭灯当也要看电路,完善的电路还会有驱动电路如三极管点了,也要看LED固定的那端是接地还是接VCC。最终无非就是通过单片机的IO口输出一个0或1来是LED二极管电路正向导通形成发光。
在主函数中编写程序,实现LED点亮和灭的时间控制。可以使用if语句或while语句来判断时间是否达到要求,然后控制LED灯的点亮和灭。在main函数中添加延时函数,以实现上电后30秒后LED灯开始点亮的要求。下面是一个简单的示例程序
1、创建项目,如图所示。2、创建延迟函数。3、创建C语言主函数。设计unsigned char k=0;变量。4、添加循环效果。5、点亮灯,通过k++,改变效果。6、添加延迟效果,单片机就可以控制8个灯依次亮,全亮了,然后再依次灭。
单片机控制一个LED灯亮灭需要怎样的程序?
单片机控制led灯亮和灭,led灯初始状态从左到右两个灯间隔一个灯循环亮灭,然后从右到左循环亮灭,,当按下按键,led灯全亮,然后全灭。然后再恢复循环。二、实验过程 (一)实验项目的方案分析 1.设计原理 STC12C5A
1、首先打开桌面上的keil软件,在进行对51单片机进行编程时最常用的就是keil软件。2、编写相应的代码:#include
for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);} //KEY1按一下LED1亮 再按一下LED1灭 //KEY2按下LED2亮 LED1灭 main(){ while(1) { if (!key2) { led1 = 1; led2 = 0;} el
LED1=1;} if(i==100) // 第二个灯延时熄灭 { i=0;LED2=1;} }
按键位置:P0.1;功能:1,当第一次按键按下,第一个灯亮,按键放开灯灭 2,当第二次按键按下,第二个灯亮,按键放开灯灭 3,重复执行前面两个步骤 灯的位置:P2口;/ include
P2IFG =0; //中断标志清除,防止配置过程中出现中断标志为1 _EINT(); //开总中断 LPM4; //进低功耗4 } /***端口中断程序***/ pragma vector = PORT2_VECTOR __interrupt void port2(void){ switch
用外部中断,按一次键,两个LED灯点亮,再按一次,两个LED灯熄灭,循环。用Keil(C语言)编译
是不是按一下开关触发中断,使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
在四个灯循环点亮的状态下,每点亮一个灯需要延时,如果调用延时子程序,按键就显示不灵敏了,所以,采用定时器中断的方式控制延时,就不影响按键了。include
void main(){K1=1;while(1){if(K1==0){GPIO_LED=~GPIO_LED;Delay10ms();} } } void Delay10ms( ){ //延时函数 }
1、首先打开桌面上的keil软件,在进行对51单片机进行编程时最常用的就是keil软件。2、编写相应的代码:#include
include
程序里:while(1){ if(key1==0) LEDPORT=0;if(key2==0) LEDPORT=0xff;}
用51单片机的外部中断控制led灯的开光,当按下一个键时,led灯全亮,按下另一个键时,led灯熄灭
MOVie,#82h;设置中断允许寄存器 MOV30h,#10;MOV31h,#6;30H和31H是两个软件计数器。SETBtr0;启动定时 AJMP$;原地踏步 int_timer:;定时器0中断服务程序。MOVth0,#high(65536-10000);MOVtl0,#low(65536-10000);重设1
如果你用的是89C51单片机的话,外部中断是在P3.2和P3.3引脚,P1口是没有的。所以,如果你既想用外部中断又想用P1口做控制输入端,就需要用“与(或)”逻辑电路从P1口导出中断信号给P3.2和P3.3引脚。P1口是输出
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次;
摁钮来说,因为是输入,在输入之前,先对接脚做输出高电平处理,然后做接收,否则可能会烧掉单片机接脚内部的fet 管 延时六秒不好控制,如果晶振频率你知道的话,多用nop指令,来缓冲循环段的长短不一问题
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; // 清除更新标志 }
;} voidmain(void){ while(1){ P3=0xfe;//第一个灯亮 delay();//延时 P3=0xfd;//第二个灯亮 delay();P3=0xfb;//第三个灯亮 delay();P3=0xf7;//第四个灯亮 delay();P3=0xef;//第五个灯亮 delay
中断处理函数感觉有些问题,for循环之前使用P1=0x0f;然后将for内的P1=0x0f;改为 P1= ~ P1; 同时for 循环中应该需要调用延时函数 Delay(10); 这里的值看你自己设置,保证能分辨闪烁即可
LED = 1; /* 端口送低电平,LED点灭 */ DelayMs(500); /* 延时大概0.5S */ } /* 延时10ms,消抖 */ { if( Key == 0) LED = ~LED;/* 再次检测按键是否按下,如果有,将LED状态取反 */ for(
void main(){uchar tab[]={}//定义数码管 EX0=1;EA=1;IT0=1;while(1){P1=tab[m];} } void into()interrupt 0 {m++;while(INT0==0);} 程序大概是这样,因为使用手机,不方便输入!
LJMP T0ISR ;定时0控制流水灯循环点亮 ORG 0030H MAIN:MOV TMOD,#01H ;设置定时器0工作模式 MOV TH0,#HIGH(65536-60000) ;60毫秒定时 MOV TL0,#LOW(65536-60000)SETB ET0 SETB EA MOV A,#0FEH ;
单片机汇编语言程序,我想写一个循环点亮的LED,然后用外部中断0接到一个按键上,怎么写我需要详细的程序
1)P2口的8个脚对应8个LED;设D1灯对应高位,D8灯对应低位; 2)P1口的P1.0脚对应XO按钮;P1.1脚对应X1按钮; 3)开始时,显示第一种方式:向P2口写入a=01111111,延时0.5S,a 循环右移一位,再延时0.5S,如此反复。 4)当收到XO按钮信号后,向P2口写入a=01111111,延时1.5S,a 循环右移二位,再延时1.5S,如此反复。 5)当收到X1按钮信号后,向P2口写入a=10111111,延时1S,a 带进位右移二位,再延时1.5S,如此反复。当Cy=0时,执行 3)。在四个灯循环点亮的状态下,每点亮一个灯需要延时,如果调用延时子程序,按键就显示不灵敏了,所以,采用定时器中断的方式控制延时,就不影响按键了。 #include #include 仿真图效果。
#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
你的led1=~led1;这个语句没有循环,所以只会反转一次。要么加循环,要么再写一个闪烁函数。 void led_filcker(usigned char x) { while(x) { led1=~led1; x--: } } 如果你是想,按一下,松开也会闪烁,再按一下熄灭。你得定义一个变量来表示按键的按下。 #include #define uchar unsigned char bit stop=1; sbit k5=P1^4; void delay(uchar xms) { while(xms--); } void main() { if(k5==0) { delay(1000); if(k5==0) { while(k5==0) { if(stop) <<<<<<<<<<<<<<<此处执行你的语句 else stop=~stop: } } }}
#include #define uchar unsigned char #define uint unsigned int sbit LED1=P0^0; sbit LED2=P0^3; sbit K1=P1^0; //延时 void DelayMS(uint ms) { uchari; while(ms--)for(i=0;i<120;i++); } //向串口发送字符 void Putc_to_SerialPort(uchar c) { SBUF=c; while(TI==0); TI=0; } //主程序 void main() { uchar Operation_No=0,recive; SCON=0x50; //串口模式1 TMOD=0x20; //T1工作模式2 PCON=0x00; //波特率不倍增 TH1=0xfd; TL1=0xfd; TI=0; TR1=1; while(1) { if(K1==0) //按下K1时选择操作代码0,1,2,3 { while(K1==0); Operation_No=(Operation_No+1)%4; Putc_to_SerialPort(Operation_No); } recive=0xff; if(RI) { recive=SBUF; RI=0; } switch(recive) //根据操作代码发送A/B/C或停止发送 { case0: LED1=LED2=1; break; case1: LED1=~LED1;LED2=1; break; case2: LED2=~LED2;LED1=1; break; case3: LED1=~LED1;LED2=LED1; break; default:break; } DelayMS(100); } }
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)//延时 } } } }