闪烁是啥意思?就是亮一会,灭一会儿,再亮一会儿,显然这是个循环结构,循环里面要有亮一会的代码和灭一会儿的代码。亮起来很简单,给LED对应引脚一个低电平,灭也很简单,给LED对应的引脚一个高电平。关键是怎么让灯亮一会不亮了 ,这个怎么控制,我最开始的思路是类似c语言里面的sleep函数,也不知道有没有。视频里面的做法是做一个延时函数,就是做一个消耗时间的函数。
看下代码
#include 'reg52.h'
typedef unsigned int u16;
sbit ledD1=P2^0; //P20
void delay(u16 i) //延时函数
{
while(i--)
{
//什么也不做
};
}
void main()
{
while(1)
{
ledD1=0;
delay(60000);
ledD1=1;
delay(60000);
}
}
typedef unsigned int u16;
这个定义是为了增强程序的可移植性的,现在是运行在89c52上,今后可能移植到stm32上,这两个平台int类型占用的字节是不一样的。
typedef是怎么增强程序的可移植性的,可以看这个连接。typedef的作用
void delay(u16 i) //延时函数
{
while(i--)
{
//什么也不做
};
}
这段代码是一个不太精确的延时函数,比如你给它一个参数是6000,函数内部什么也不做,只进行6000次i--运算,一定程度上起到了延时的作用,但是具体延时多长时间并不清楚,不同的机器可能还不一样,在没有接触更高级的延时函数之前我觉得这算是一个取巧的做法,我还是挺欣赏的,反正我是没想出来的。
ledD1=0;
delay(60000);
ledD1=1;
delay(60000);
让D1亮一下,休息一段时间,让D1灭一下 ,休息一段时间,循环这个过程。
关键字:LED闪烁 可移植性 延时函数
引用地址:
LED闪烁
推荐阅读最新更新时间:2026-03-24 10:33
51单片机STC89C52控制LED闪烁(将延时程序写成子函数有形参)
/*-----------------------包含头文件区域-------------------------*/ #include reg52.h //单片机头文件 /*-----------------------端口/引脚定义区域----------------------*/ sbit LED=P2^0; //位定义P2.0引脚名为LED /*-----------------------函数声明区域---------------------------*/ void delay(unsigned int xms);//延时函数声明 /*-----------------------主函数区域-----
[单片机]
51单片机学习笔记———1.自定义延时函数点亮并控制LED的闪烁秒数以及用Proteus仿真
#include reg52.h #define LED P0 void delay();//延时一秒 void main() //按位操作点亮小灯 { unsigned int i; while(1) { for(i = 0;i 8;i++) { LED = ~(0X01 i);//之所以要取反,因为这样的十六进是制数比较小,比较直观 delay(); } } } void delay() //延时一秒 { unsigned int i,j; for(i = 0;i 83;i++) { for(j = 0;j 1000;j++) { ;
[单片机]
STM32-Systick滴答定时器-延时函数
1.STM32-Systick滴答定时器 Systick定时器,是一个简单的定时器,对于ST的CM3,CM4,CM7内核芯片,都有Systick定时器。 Systick定时器常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做UCOS心跳时钟。 Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。 SysTick定时器
[单片机]
51单片机STC12C5A60S2定时器做延时函数,定时器实现精准延时
/*====================================================================== 利 用 定 时 器 实 现 精 准 延 时 的 调 用 函 数 ========================================================================*/ #include STC12C5A60S2.h typedef unsigned char u8; typedef unsigned int u16; u16 count; //中断次数变量 bit flag = 0; //标志时间结束 //=============
[单片机]
STM32延时函数的四种方法:普通延时(2种)、SysTick 定时器延时(2种)
STM32延时函数的三种方法:普通延时、SysTick 定时器延时(1.中断方式;2.非中断方式) 单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。 1.普通延时法 (1)普通延时法1 这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。 //粗延时函数,微秒 void delay_us(u16 time) { u16 i=0; while(time--) { i=10; //自己定义 while(i--) ;
[单片机]
STC89C52RC单片机额外篇 | 05 - 把NOP指令封装成微秒级延时函数
延时函数是单片机开发中是必不可少的功能函数,在每个工程里都能找到它的踪影。虽然看起来不起眼,但在有些时序控制的场合,使用了一点点延时,往往能解决大问题。特别对于某些模块,往往需要微秒级的延时,例如超声波模块与红外接收器等。 以前我们使用延时函数的时候,基本上类似这样: /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *************************************************
[单片机]
STC12延时函数的探究
这种写法是C中嵌套了汇编。精确延时时间=2*t*T+5*T,T为一个机器周期。对于8051, 如果t=1,那么这个函数执行应该是7us。如果是STC12,那么这个延时函数的延时应该是:若t=1,精确延时=2*1*1/12+5*1/12=(7/12)us啊。 昨天也查了STC12手册 手册上对时钟写的很笼统,其中一句话是:与8051指令执行时间对比,一共有12个指令,一个时钟就可以执行完成,工作在相同频率下运行速度提高8~12倍 难道这里应该是(7/8)us?而不是(7/12)us? 这个是uint型函数时间是近似的 那么可以用延时时间=8*t*T 应该是8*1*(1/12)=8/12 根据程序分析猜想t=1时这个延时
[单片机]
STM8,延时函数
照搬原子哥的代码:http://www.openedv.com/posts/list/17347/htm 原子哥的教程有比较详细的注释和网友回复,这里仅作记录 这是基于IAR的,原子哥的帖子下面有网友回复的STVD的 main.c #include stm8l15x_conf.h volatile u8 fac_us=0; void delay_init(u8 clk) { if(clk 16)fac_us=(16-4)/4; else if(clk 4)fac_us=(clk-4)/4; else fac_us=1; } void delay_us(u16 nus) { __asm( PUSH A n
[单片机]