打印
[DemoCode下载]

C51常用延时程序

[复制链接]
557|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
玛尼玛尼哄|  楼主 | 2020-2-14 13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 玛尼玛尼哄 于 2020-2-16 20:12 编辑

在一些场合下,我们需要对单片机进行延时,我之前学的是汇编,没有感觉到延时很难控制。使用C语言写程序后感觉到程序好写了,可以一块一块写,但是对相对精确的延时却比较头痛。使用单片机的定时器延时很精确,在时间长的情况下使用,这涉及到定时器初值的载入,定时器开启,和通过软件查询定时器溢出,对于短暂延时麻烦了写。本篇仅仅就使用小程序延时进行说明

1>短暂延时思路一

unsigned char i;

***************************************************************************************************************

for(i=0;i<n;i++)//本句   延时时间  n*3+2个机器周期。

可以通过keil编译器设置断点,设置好晶振频率,通过调试判断该句实际运行时间!使用后断点时间减去该断点时间就是本句执行时间。

****************************************************************************************************************



****************************************************************************************************************

2>短暂延时思路二

void Delay10us( ) {     //这是延时10个机器周期的函数
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}

Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1T。主函数调用Delay10us( )时,先执行一个LCALL指令(2 T),然后执行6个_NOP_( )语句(6 T),最后执行了一个RET指令(2 T),所以执行上述函数时共需要10 T。

注:T表示机器周期

通过编译软件先将C语言翻译成汇编语言,我们可以对照指令执行时间,手动计算出延时程序所运行的机器周期数,当然麻烦一些了。


使用特权

评论回复
沙发
幸福小强| | 2020-2-15 20:47 | 只看该作者
最近我也被延时头疼死了。

使用特权

评论回复
板凳
gejigeji521| | 2020-2-16 14:23 | 只看该作者
最好的方法用示波器观察。

使用特权

评论回复
地板
gejigeji521| | 2020-2-16 14:23 | 只看该作者
仿真测试不一定准。

使用特权

评论回复
5
zhuotuzi| | 2020-2-16 18:50 | 只看该作者
所以低速的51很难实现精确的短延时。

使用特权

评论回复
6
zhuotuzi| | 2020-2-16 18:50 | 只看该作者
毫秒级的延时还是用ARM内核单片机效果好。

使用特权

评论回复
7
捉虫天师| | 2020-2-16 20:13 | 只看该作者
延时程序有点不准,不知道会不会被优化。

使用特权

评论回复
8
捉虫天师| | 2020-2-16 20:13 | 只看该作者
延时程序有点不准,不知道会不会被优化。

使用特权

评论回复
9
玛尼玛尼哄|  楼主 | 2020-2-16 20:35 | 只看该作者
多谢建议。

使用特权

评论回复
10
xuanhuanzi| | 2020-2-18 15:46 | 只看该作者
这延时不是很准

使用特权

评论回复
11
heisexingqisi| | 2020-2-18 20:10 | 只看该作者
51速度慢,所以想执行准确的1u延时只能用_nop_();

使用特权

评论回复
12
antusheng| | 2020-2-20 12:53 | 只看该作者
低速。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

187

主题

3154

帖子

2

粉丝