这2个延时代码有什么不一样吗
上面是通过AICUBE 产生的代码,这个代码是什么意思呀如果我要延时1秒该怎么写
下面是用延时计算器产生的,这个大概能看懂
请问这2个底层逻辑有啥不一样吗
一个时间800毫秒写死了,一个可以自定义延时多少毫秒 第一个与主频有关,修改主频后同样的实参传入后定时基本不变,第二个就有变化 soma 发表于 2026-6-4 19:02
一个时间800毫秒写死了,一个可以自定义延时多少毫秒
怎么定义呢再哪里定义
i = MAIN_Fosc / 6000 这个意思是晶振频率/6000
while (--i) //i循环减一 到0跳出循环
while (--ms)//这句怎么理解呢
sclx00 发表于 2026-6-4 21:10
怎么定义呢再哪里定义
i = MAIN_Fosc / 6000 这个意思是晶振频率/6000
while (--i) //i循环减一...
while (--ms)//这句怎么理解呢
do里面循环一次ms就自减一次直到ms=0 soma 发表于 2026-6-4 22:21
while (--ms)//这句怎么理解呢
do里面循环一次ms就自减一次直到ms=0
如果我要延迟1秒这个该怎么写呢
sclx00 发表于 2026-6-4 22:39
如果我要延迟1秒这个该怎么写呢
delay_ms(1000);
就是延时1s 和主频挂钩的延时函数
方便调整时钟频率
自动适配主频
一个可设定延时时间,一个是固定延时,底层没有区别 新手在学习单片机的时候,学习的延时函数都是“阻塞延时”,
MCU为了延时不停在做无用功,占用了算力、资源。
要怎么样才能做到“非阻塞延时”呢?
堵塞就是cpu啥也不干被卡住了
非堵塞就是延时的时候cpu跑去干别的的了。等延时时间到了再回来干活
实现上,堵塞一般是让cpu做无意义自加或者自减进行延时
非堵塞可以用多线程,软定时器,程序循环计数等方式实现
以下是一个流水灯的两种写法
void main()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
P2 = ~(0x01<<i);
delay(200); //阻塞延时
}
}
}
void main()
{
uchar i = 0;
uint DelayCnt = 2000;
while(1)
{
DelayCnt++;
if(DelayCnt>=2000) //软定时就是下面那种写法
{
DelayCnt = 0;
P2 = ~(0x01<<i);
i++;
if(i>=8)i=0;
}
}
}
定时器中断里面构建简易状态机,不要用傻循环式的delay,提高定时器中断频率,LED想闪都难。
这种用法一般都是配合定时器用,定时器每1ms发一个时钟标志位,主程序判断置位信号来运行,这样时间想对来说就可以计算了
定时器设置标志位,比如你需要1ms定时,就配置1ms的定时器,中断后置标志位,主程序用这个标志位让变量A+1,清零标志位,你需要定时多长时间,就让A加到多少数
软件延时还是有一定必要要使用的
不要直接使用毫秒级的延时函数,使用毫秒级延时的函数放到定时中断里去执行,但是微秒级的延时函数也还是不可避免阻塞,该用还是得用,不用太纠结,看实际情况再定呗
页:
[1]