2024-09-06 21:05:20
led的闪烁是通过一定频率的开关led实现的。如果开关频率太快,人类是看不出来是在闪烁,所以开关频率要低一些,比较高的切换频率可以用来控制led亮度(PWM),或者用来做数码管显示。
实现方式主要有两种方式:
(1)使用代码循环做为延时来控制led开关频率:
eg:
#define HIGH 1
#define LOW 0
#define LED P1.1//假设为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 P1.1
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;
}
}
}
两种方式都可以,但在实际使用中尽量不要使用循环延时,因为使用循环延时在延时过程中,单片机除了中断的响应,不能再做任何事情了,而使用定时器,程序只需要通过判断时间变量就可以实现同样的效果,不会占用太多时间,所以单片机能够做更多的事情,实现实时性的要求,这是嵌入式开发中需要重视的。
2024-09-06 18:06:17
原理:LED闪烁其实就是LED亮灭,要看电路,有的直接是单片机驱动的小LED,给高平亮,给低电平灭,一直给高低电平循环就表现出亮灭了。
延时:就是亮多久后灭,灭多久后亮。
实现:先给高电平,LED亮,经过延时后,再给一个低电平,LED灭,再给一个延时,如此无限循环。
2024-09-06 13:26:47
2024-09-06 12:12:45
咳咳,虽然不懂C语言,大概也能看出0和1就是闪亮。。。的确好理解
但还是想弄清楚汇编怎么弄,能否麻烦解释一下吗
MAIN:
CLR P2.0 ;P2.0置低
LCALL DELAY ;延时
SETB P2.0 ;P2.0置高
LCALL DELAY ;延时
SJMP MAIN ;转MAIN从头开始
DELAY:
MOV R7,#200 ;这里送1000超出范围了,最大255
D2:
;DJNZ R6,D2 ;这句取消,没有给R6赋值
DJNZ R7,D2 ;这里D1改D2,没有D1标号
RET
END
改写一下延时程序:
DELAY:
MOV R7,#200
DLY:
MOV R6,#250
DJNZ R6,$
DJNZ R7,DLY
RET
谢谢,我今天问了老师了,老师跟我说程序执行完好到RET,就跳转到主程序的下一条指令了,原本是亮的,跳到SETB 高电平就灭了,但跳到主程序的下条指令怎么是挑到SETB P2.0了,它上面还有好多条指令啊
2024-09-06 09:44:31