51单片机软件延时delay的写法

        首先我们先来了解一下8051单片机的指令周期这一概念

在考核和培训中我们常用普中开发板作为8051单片机的载板,大多数情况下开发板的晶振为12MHZ和11.0592MHZ,在此我们以11.0592MHZ的晶振为例计算一下时钟周期。        

        在11.0592MHZ晶振频率的情况下,即1s晶振震荡11059200次,根据公式                               ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        T=\frac{1}{f}  

一个时钟周期约为0.09us,则一个机器周期为12x0.09=1.08us。

C/C++编译器内置头文件<INTRINS.h>中的_nop_()函数

他的作用是延时一个机器周期,他的实际意义是一个空指令,在汇编中他在一个机器周期内不执行任何操作但占一个程序步。也就是说一条_nop_()操作可以延时1us。所以我想要delay 5us可以编写函数

void delay_5us()

{

        _nop_();

        _nop_();

        _nop_();

        _nop_();

        _nop_();

}

同理你要想编写特定的值比如说1ms通过for循环,while循环或者do while循环来做。

在51单片机配套的STC-ISP中有软件延时计算部分,可以通过配置系统频率,定时长度还有指令集来实现APP计算软件延时长度

        

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
``` // 定义一个静态全局变量,存储的tick数 static __IO uint32_t delay_ms_ticks; // 初始化函数,配置SysTick定器每1ms中断一次 void delay_init(void) { SysTick_Config(SystemCoreClock/1000); // 配置SysTick定器,计数值为CPU主频除以1000 } // 毫秒级函数,传入需要的毫秒数 void delay_ms(uint16_t ms) { delay_ms_ticks = ms; // 设置tick数 while(delay_ms_ticks); // 等待结束 } // SysTick中断服务函数,每1ms被调用一次 void SysTick_Handler() { if (delay_ms_ticks > 0) { // 如果还有未完成 delay_ms_ticks--; // tick数减1 } } ``` 这段代码是针对单片机的函数实现。单片机没有像PC那样操作系统提供的sleep、usleep等函数,需要通过硬件定器来实现。具体实现方式如下: 1. 在程序中调用`delay_init()`函数,配置SysTick定器,使其每1ms产生一次中断。 2. 在需要的地方调用`delay_ms()`函数,传入需要的毫秒数。 3. `delay_ms()`函数将需要的毫秒数转换为需要的tick数,保存在静态全局变量`delay_ms_ticks`中。 4. `delay_ms()`函数通过while循环等待`delay_ms_ticks`变为0,即结束。 5. 每当SysTick定器产生一次中断,就会调用`SysTick_Handler()`函数。`SysTick_Handler()`函数检查是否还有未完成,如果有,则将tick数减1。当`delay_ms_ticks`变为0结束,程序继续往下执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值