led的闪烁是通过一定频率的开关led实现的。如果开关频率太快,人类是看不出来是在闪烁,所以开关频率要低一些,比较高的切换频率可以用来控制led亮度(PWM),或者用来做数码管显示。
实现方式主要有两种方式:
(1)使用代码循环做为延时来控制led开关频率:
eg:
#define HIGH 1
#define LOW 0
#define LED P11//假设为51单片机
void delay_nms(unsigned int n_ms)
{
while(n_ms--)
{
delay_1ms();//延时一毫米函数,可以根据具体单片机自己定义
}
}
void main()
{
for(;;)
{
LED = HIGH;
delay_nms(500);
LED = LOW;
delay_nms(500);
}
}
(2)使用定时器来控制led开关频率:
eg:
#define HIGH 1
#define LOW 0
#define LED P11
unsigned char f_500ms = 0;
void timer0() interrupt 1 //假设为10ms定时
{
//xxxx
f_500ms++;
}
void main()
{
for(;;)
{
if(f_500ms < 100)//1秒(10ms 50 = 1000ms = 1s)
{
if(f_500ms < 50)
{
LED = HIGH;
}
else
{
LED = LOW;
}
}
else
{
f_500ms = 0;
}
}
}
两种方式都可以,但在实际使用中尽量不要使用循环延时,因为使用循环延时在延时过程中,单片机除了中断的响应,不能再做任何事情了,而使用定时器,程序只需要通过判断时间变量就可以实现同样的效果,不会占用太多时间,所以单片机能够做更多的事情,实现实时性的要求,这是嵌入式开发中需要重视的。
# include <reg52h>
unsigned int i = 0;
sbit led = P1^0;
void main(void)
{
TMOD = 0x10;
TH1 = 0x0FC; //@12MHz 1ms
TL1 = 0x18;
EA = 1;
ET1 = 1;
TR1 = 1;
while(1)
{
}
}
void Timer1Interrupt(void) interrupt 3
{
TH1 = 0x0FC;
TL1 = 0x18;
i++;
if (i >= 50)
{
i = 0;
led = ~led;
}
}
#include <STC12C52H>
#define uchar unsigned char
#define uint unsigned int
sbit key=P1^2;
sbit p1_6=P1^6;
void delay(uchar delay_time)
{
uchar n;
uint m;
for (n=0;n<delay_time;n++)
{
for(m=0;m<10000;m++);
}
}
void keyscan()
{
if(key==0)
{
delay(5);
if(key==0)
while(!key)
{
p1_6 = 0;
delay(20);
p1_6 = 1;
delay(20);
}
}
}
void main()
{
WDT_CONTR = 0x3C;
while(1)
{
keyscan();
WDT_CONTR = 0x3C;
}
}
这个功能可以用中断来实现,当然,现在我写的这个也可以实现。由于你用的晶振频率不知道,所以你自己修改一下延时时间,再把头文件改一下,就可以了,我试验了,可以实现改功能。
以上就是关于单片机下面程序是怎么实行LED灯闪烁的全部的内容,包括:单片机下面程序是怎么实行LED灯闪烁的、AT89S51单片机,编写程序,用定时计数器1控制LED以10HZ的频率闪烁,求程序、用单片机C语言怎么写用状态机实现按键控制LED灯闪烁这个程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)