使用Keil C进行51单片机延时程序编写的几点心得

发布者:jingyun最新更新时间:2021-06-25 来源: eefocus关键字:Keil  51单片机  延时程序 手机看文章 扫描二维码
随时随地手机看文章

应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。


以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:
图片
51 单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。


现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。因而在实时性要求高的场合,还需要汇编和C的联合应用。但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。


用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:
图片
到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来:
图片
真是不看不知道~~~一看才知道这个延时程序是多么的不准点~~~光看主要的那四条语句,就需要6个机器周期。也就是说,它的精度顶多也就是6us而已,这还没算上一条 lcall 和一条 ret。如果我们把调用函数时赋的i值根延时长度列一个表的话,就是:

因为函数的调用需要2个时钟周期的lcall,所以delay time比从函数代码的执行时间多2。顺便提一下,有的朋友写的是这样的代码:

可能有人认为这会生成更长的汇编代码来,但是事实证明:

其生成的代码是一样的。不过这的确不是什么好的习惯。因为这里实在没有必要再引入多余的变量。我们继续讨论正题。有的朋友为了得当更长的延时,甚至用了这样的代码:

这段代码产生的汇编代码是什么样子的?其实不用想也知道它是如何恐怖的$#^%&%$.。..。.让我们看一看:

呵呵,这倒是的确可以延迟很长时间~~~但是毫无精度可言了。那么,用C到底能不能实现精确的延时呢?我把代码稍微改了一下:

因为根据经验,越简洁的C代码往往也能得出越简洁的机器代码。那这样结果如何呢?把它生成的汇编代码拿出来看一看就知道了。满怀希望的我按下了“Build target”键,结果打击是巨大的:
图片
虽说生成的代码跟用for语句是不大一样,不过我可以毫无疑问的说,这两种方法的效率是一样的。似乎到此为止了,因为我实在想不出来源程序还有什么简化的余地。看来我就要得出来这个结论了:“如果需要us级的延时精度,需要时用汇编语言。”但是真的是这样吗?我还是不甘心。因为我不相信大名鼎鼎的 Keil C 编译器居然连 djnz 都不会用???因为实际上程序体里只需要一句 loop:djnz r7, loop。近乎绝望之际(往往人在这种情况下确可以爆发出来,哦呵呵呵~~~),我随手改了一下:
图片
心不在焉的编译,看源码:
图片
天~~~奇迹出现了。..。..我想这个程序应该已经可以满足一般情况下的需要了。如果列个表格的话:
图片
计算延时时间时,已经算上了调用函数的lcall语句所花的2个时钟周期的时间。
终于,结果已经明了了。只要合理的运用,C还是可以达到意想不到的效果。很多朋友抱怨C效率比汇编差了很多,其实如果对Keil C的编译原理有一个较深入的理解,是可以通过恰当的语法运用,让生成的C代码达到最优化。即使这看起来不大可能,但还是有一些简单的原则可循的:
1.尽量使用unsigned 型的数据结构。2.尽量使用char型,实在不够用再用int,然后才是long。3.如果有可能,不要用浮点型。4.使用简洁的代码,因为按照经验,简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立)。

关键字:Keil  51单片机  延时程序 引用地址:使用Keil C进行51单片机延时程序编写的几点心得

上一篇:光照强度预警器(AD转换)
下一篇:基于51单片机的红外线遥控器解码程序设计

推荐阅读最新更新时间:2024-11-13 20:32

89C51单片机智能语音拨号报警系统的设计
随着人们生活水平的提高和安防意识的增强, 急需开发面向大众、价格低廉、运行可靠的自动报警系统。鉴于住宅电话和移动通信设备的普及, 以及电话语音报警的快捷、有效及价格低廉等优点, 公共通信网成了报警系统的最佳传输媒介。本文介绍的报警系统就是在此基础上发展起来的一种智能语音拨号报警系统, 该系统可广泛用于各种对安防要求较高的场合, 如智能楼宇、商场、银行和工厂等。 电话自动报警的主要功能为: 用户根据需要把自己的手机号码、办公室电话或报警监控中心的电话预存入报警主机。报警主机不断地对所监控的设备( 门禁、烟雾探测器、窗磁、摄像头等) 状况进行巡检, 当有不安全情况( 如火灾、非法入室、视频丢失等) 发生时, 报警主机拨通预先存入的
[单片机]
89<font color='red'>C</font><font color='red'>51单片机</font>智能语音拨号报警系统的设计
6nm站上了“C位” 5G芯片市场争夺战全面打响
今年起,6nm工艺制程现“大热”之势,成为市场宠儿。凭借性能、成本方面的超高性价比优势,在7nm迭代演进,5nm产能吃紧的趋势和背景下,6nm受到手机芯片厂商追捧,联发科抢得先机,高通快速跟进,紫光展锐强势入局。 分析人士指出,无论是从研发成本还是时间成本,6nm作为性价比较高的EUV工艺,是在7nm后,5nm前的一个合适选择。6nm也因此有望成下一个被广泛使用和长期服务的制程节点。而随着下半年5G终端逐步进入主流消费价位,6nm赛道“枪响”,标志着5G手机芯片市场的竞逐全面开启。 台积电的独角戏 作为业界仅有的两家率先推进到个位数制程工艺的芯片代工厂商,三星和台积电各自7nm至5nm的制程演进路线中,6nm是后者的独有标签。
[手机便携]
6nm站上了“<font color='red'>C</font>位” 5G芯片市场争夺战全面打响
C8051F单片机为控制核心的气流仪设计
引 言 本课题研究的棉花气流仪是根据GB6468-1992棉纤维“马克隆值”测试方法的有关规定,结合目前的微电脑监控系统技术,采用单片机C8051F,具有测试速度快、容易维修、费用低、效率高等特点。 马克隆值为在特定条件下一团棉花的透气性的度量。实践经验表明,马克隆值与纺纱有着密切的关系,马克隆值过高或过低,其棉纤维可纺性能都较差,只有马克隆值适中的棉纤维才能获得较全面的纺纱经济效益。 1气流仪的基本原理 本仪器是气流式的马克隆值测定仪。马克隆气流仪的基本原理是以一定压力的气流通过固定容积内的定质量的纤维塞,由于纤维的表面积不同,对气流的阻力大小不同,在纤维塞两端产生的压力差或流量大小也不同。表面积小的纤维,对气流的阻力小流量
[单片机]
以<font color='red'>C</font>8051F单片机为控制核心的气流仪设计
贸泽开售采用D2PAK-7L 封装的工业用UnitedSiC 750V UJ4C/SC SiC FET
贸泽开售采用D2PAK-7L 封装的工业用 UnitedSiC 750V UJ4C/SC SiC FET 2022年9月23日 – 提供超丰富半导体和电子元器件™的业界知名新品引入 (NPI) 分销商贸泽电子 (Mouser Electronics) 即日起备货采用行业标准D2PAK-7L表面贴装封装的UnitedSiC(现已被 Qorvo®收购)UJ4C/SC FET。 UJ4C/SC系列器件是750 V碳化硅场效应晶体管 (SiC FET),借助D2PAK-7L封装选项提供低开关损耗、在更高速度下提升效率,同时提高系统功率密度。这些FET经优化适合车载充电器、软开关DC/DC转换器、电池充电和IT/服务器电
[工业控制]
贸泽开售采用D2PAK-7L 封装的工业用UnitedSiC 750V UJ4<font color='red'>C</font>/SC SiC FET
08-S3C2440驱动学习(二)嵌入式linux-input子系统分析与应用
零、几个问题 (1)为什么有输入子系统: 针对输入设备的多样性和输入事件的多样性,内核通过输入子系统来实现输入设备的驱动、输入事件的提交及对输入事件的读取,并有统一的命名规则。 (2)分层分离结构 input子系统是对不同类型的输入设备进行统一处理的驱动程序。一个输入事件,如按键,按照: 驱动层-- 系统核心层-- 事件处理层-- 用户空间层 的顺序达到用户空间并传递给应用程序的。 input子系统组成 驱动层 核心层 事件处理层 (3)几个重要结构体 input_dev:物理输入设备结构体,包含设备信息。存在input_dev_list链表中 input_handler:事件处理结构体,实现事
[单片机]
08-S3<font color='red'>C</font>2440驱动学习(二)嵌入式linux-input子系统分析与应用
51单片机音乐盒的仿真课程设计(8首歌)
仿真成功 初始化显示P.521061P. 显示歌曲编号。 8首歌的音乐盒课程设计。 一个很简单的程序 分享一下 仿真原理图如下 单片机源程序如下: ////////////////////////////////////////////// //51单片机音乐播放器程序 // //共三个按键:上一曲、下一曲、播放暂停 // //播放完一首歌曲无按键按下时顺序播放下一曲 // ////////////////////////////////////////////// #include REG51.H //#define sound_amount 5 //歌曲的数量
[单片机]
<font color='red'>51单片机</font>音乐盒的仿真课程设计(8首歌)
泰克公司发布 MIPI C-PHY(SM) TX 测试解决方案
业界首款基于示波器的用来检定和调试MIPI C-PHY发送端的商业化解决方案;被豪威科技用于2000万像素以上的相机传感器 中国北京2015年6月25日电全球领先的示波器制造商泰克公司 (Tektronix, Inc.) 今天公布了业界首款基于示波器的商业化解决方案,用于 MIPI C-PHYSM 物理层发送端检定和调试。最新解决方案使利用 C-PHY 1.0接口开发下一代相机技术的工程师能对他们的设计进行深入分析、调试和表征。 2014年9月发布的 MIPI C-PHY 标准带来许多重大测试与测量挑战。最大的挑战是三线单端信号的三级电平信令传输的使用。不过,接收器将这些信号视为差分信号。这需要一种独特的时钟恢
[测试测量]
关于PC104与C8051F120的水下机器人环境监测系统设计
为了实现对水下机器人周围环境的监测,提出了一种基于PC104与C8051F120的水下机器人环境监测系统设计方案,并完成系统的软硬件设计。该系统的硬件部分主要是采集下潜深度传感器、姿态传感器、温湿度传感器的数据,软件部分采用用Visual C++6.0设计了监控界面。该系统能够实时显示视频和各传感器数据。实际测试表明,该系统具有稳定性高、准确性高的特点,达到了设计要求。 水下机器人具有重大需求和巨大的市场价值,如:用于泵站流道和叶轮叶片、坝体、桥墩、排沙口、拦污栅、病险水库等的水下检查和评估。用于市政饮用水系统中水管、水库检查;用于城市排污/排涝管道、下水道检查;用于科学研究、教学目的的水环境、水下生物的观测、研究和教学;用于海洋
[单片机]
关于PC104与<font color='red'>C</font>8051F120的水下机器人环境监测系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved