使用外部中断,如果是51单片机,使用外部中断,这三个键都接到中断上,外部中断引脚是P3.2,按键按下时低电平传入外部中断,这三个按键再分别接三个引脚,比方说P2.0,P2.1,P2.2,按键消抖会吧。在中断内部判断P2.
你首先要确定你的电路。选择什么单片机和数码管,8个按键最简单8个IO口控制。一般简单的是用三极管驱动数码管。如果你会C语言的话,很容易上手。自己先从控制1个数码管学,在控制2个数码管(2个数码管基本上可以完成上面
在四个灯循环点亮的状态下,每点亮一个灯需要延时,如果调用延时子程序,按键就显示不灵敏了,所以,采用定时器中断的方式控制延时,就不影响按键了。include
电平状态输出相应的信号来控制LED的亮灭。将按键与某个IO口相连。当按下按钮时,IO口会被拉低(变为低电平),未按下按钮时为高电平。在程序中通过循环检测IO口的状态,检测到低电平表示按钮被按下,可以执行相应操作。
1、首先打开编程软件Keil uVision4,新建一个工程文件,在菜单栏中Project—— New uVision Project..。2、然后选择单片机型号是 Atmel 公司的 AT89c52,单击OK。3、再单击工具栏上新建按钮,新建一个文档,然后再点击保存,
int0中断 程序我先试试 include
if(!KEY1) //检测到按键按下 { LED = ~LED; /*LED取反,此时LED = 0,灯亮。当松手时,KEY1 = 1,不满足if语句不 进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入
51单片机的按键控制小灯亮灭的问题(程序类型:c语言)怎么解决?
ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(65536-50000)SETB TR0 SETB ET0 SETB EA CLR P1.0 MOV R2,#10 SJMP T0ISR:CLR TR0 MOV TH0,#HIGH(65536-50000)MOV TL0,#LOW(
下面的程序我已经调试过了,你可以直接使用,但是一秒闪烁次数t的最大为2000,如果要大于这个数,你必须改小dalay1ms ()内的j值,就可以改大t include
(tip:双击单片机,选择生成的hex文件,确定,然后点击左下角的(播放)三角按钮)
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的频率闪烁,求源代码。
void timer0() interrupt 1 { uchar t;//定义变量 TF0=0;//定时器清0 t++; //中断一次累加1 if(t==20) //预置值,溢出20次就是1秒钟,晶振12MHZ { t=0;P3=~P3; //反转LED灯的亮灭 } } /***/
void delay_ms(uint);//mS级带参数延时函数。void main(){ while(1){ LED1=0;delay_ms(1000);LED1=1;delay_ms(1000);} } void delay_ms(uint z) //延时子程序 { uint x,y;for(x=z;x>0;x--)for(y
void main(){ P1=0x00; //将P1口全部置为0,防止其它引脚影响 while(1){ P1=0xff; //点亮P1口第0个引脚上的LED灯,0xff为二进制的11111111 delay(1000); //延时1秒 P1=0x00; //将P1口全部置为0,熄灭LED
1、首先打开桌面上的keil软件,在进行对51单片机进行编程时最常用的就是keil软件。2、编写相应的代码:#include
void main(){ Init_Timer0();//初始化定时器 LED=1; //关闭LED while(1){ if(!button); //按下按钮 { delay(3); //延时3ms if(!button){ TR0=!TR0;//控制定时器开/闭状态 LED=1;//关闭LED;w
单片机中一个按钮控制一个LED的以一秒交替亮灭的void main()主函数是啥
void delay_s(unsigned char t);void main(){ while(1){ led = 1;//led 亮 delay_s(1);//延时1s led = 0;//led 暗 delay_s(5);//延时5s } } 这是主循环,你要把delay_s()这个延时函数补充进去,另外
1、首先打开编程软件Keil uVision4,新建一个工程文件,在菜单栏中Project—— New uVision Project..。2、然后选择单片机型号是 Atmel 公司的 AT89c52,单击OK。3、再单击工具栏上新建按钮,新建一个文档,然后再点击保存,
当松手时,KEY1 = 1,不满足if语句不 进入循环,LED继续保持当前状态即LED = 0,如果再次按下按键,此时检测到KEY1 = 0,进入循环,LED取反得到LED = 0,灯亮。*/ delay(500); /*此处延迟,保证连续两次按键
led=1;//点亮 delay(100);//延时100MS led=0;//熄灭 } else led=0;} void delay(unsigned int i){自己根据单片机频率写个1MS带形参的演示程序} 这个程序是现写的。。应该能执行,有些细节没有写,自己修改下,
start:mov P0,#0FFh ;灌电流驱动灭灯 ,如果灯没有关,用 mov p0,#00h work:CLR LED1 ;灭如果反了把CLR改成 setb acall delay_1s SETB LED1 ;灭如果反了把setb改成 clr acall delay_3s ajmp work
当单片机LED灯一亮一灭间隔1秒时,可以使用以下代码实现:// 初始化IO口 P1 = 0xFF; // 设置延时时间 while (1) { P1 = 0x00; // 延时1秒 for (int i = 0; i < 10000; i++) { // 空循环 } P1 =
然后在这个定时器中断程序里面不断检测3.2口电平就行了,如果变回高电平就把灯在点亮(比如在这句直接将flag赋到设定的技术最大值)就行了。
求实现51单片机按下按钮LED灯亮1秒后熄灭?
只要主程序中使用定时器行成间隔1s的定时,然后依次顺序点亮即可,可以通过对应GPIO依次置1或0实现,视外部电路而定。
要实现51单片机按下按钮LED灯亮1秒后熄灭,这很简单,检测到按下按钮后点亮LED灯并开始计时,1秒到就灭灯。用定时器定时并用中断方式,计中断次数,定时×次数=1秒即可。
1 利用定时计数器0 工作在方式2 定时50毫秒 结合软件计数器(初始值选20)允许定时计数器中断 2 设计一个定时器0的中断服务程序 每50毫秒 就中断 在中断程序中软件计数器减1 当减到0时,表示1秒时间到
P1=0xff; //点亮P1口第0个引脚上的LED灯,0xff为二进制的11111111 delay(1000); //延时1秒 P1=0x00; //将P1口全部置为0,熄灭LED灯 delay(1000); //延时1秒 } } 上述程序的作用是在单片机的P1口上间隔点亮一
先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序
怎么让51单片机LED一亮一灭间隔1秒钟
#include //52系列单片机头文件 #define uint unsigned int //宏定义 sbit led1=P1^0; //声明单片机P1口的第一位 void delay1s(); //声明子函数 void main() //主函数 { while(1) //大循环 { led1=0; /*点亮第一个发光二极管*/ delay1s(); //调用延时子函数 led1=1; /*关闭第一个发光二极管*/ delay1s(); //调用延时子函数 } } void delay1s() //子函数体 { uint i,j; for(i=500;i>0;i--) for(j=110;j>0;j--); }对你这种编程思想,我想问是跟谁学的啦! 对你这程序,我想问①先按K3、后按K2,你觉得程序结果会如何?②如果2个按键都按住不放,结果又会如何。 考虑一下上面的问题,就能看到你的程序问题了。当然你的程序问题,跟你的题目一样,没那么简单!后面还有一堆!!
下面的程序我已经调试过了,你可以直接使用,但是一秒闪烁次数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是看不出闪烁的 太快了