当前位置:首页 > 单片机 > 单片机
[导读]摘要 针对C语言代码的执行时间的可预见性差,结合Keil C51开发工具,分析了在Keil C51开发工具中利用C语言实现精确的延时程序的设计,指出了常用延时方法优缺点。并通过一些实例分析了延时时间的计算方法,使C语言代

摘要 针对C语言代码的执行时间的可预见性差,结合Keil C51开发工具,分析了在Keil C51开发工具中利用C语言实现精确的延时程序的设计,指出了常用延时方法优缺点。并通过一些实例分析了延时时间的计算方法,使C语言代码的延时时间可以被预见。C语言中嵌套汇编语言是一种有效的方法,可以充分发挥出各语言的优势特点、提高开发效率。
关键词 Keil C51;C语言;软件延时;单片机

    C语言具有较强的数据处理能力、语言功能齐全、使用灵活方便、开发效率高,被广泛应用于在单片机系统开发应用中。在单片机幕统开发的过程中,经常需要使用到延时程序,但C语言代码执行时间。的可预见性和实时性较差,在开发一些具有严格通信时序要求的系统时,往往需要反复调试延时代码,给开发者带来了较大困难。比如使用DS18B20进行温度测控时,必须按照其单总线通信协议,否则无法读取温度数据。针对上述问题,结合Keil C51开发工具和Proteus仿真软件,介绍在Keil C51开发系统中,利用C语言编写的延时程序设计及其运行的时间的计算方法。

1 常用延时程序的设计方法
1.1 利用定时器/计数器延时
   
利用C51单片机内部2个16位定时器/计数器实现精确的程序,由于定时器/计数器不占用CPU的运行时间,可以提高CPU的使用效率。但假设使用12 MHz晶振,定时器工作在方式1模式下,其最长定时时间也只能达到65.53 ms,由此,可以采用中断方式进行溢出次数累加的方法进行长时间的延时程序设计。但在开发过程中要考虑C51自动对断点的保护和重装初值所带来的延时误差,也可以使用定时器工作在方式2模式下,减少重装初值所带来的误差。
1.2 利用空操作实现延时
   
当所需的延时非常短,可以利用Keil C51自带intrins.h头文件中的_nop_()函数实现函数延时。
    当主程序调用delay()函数时,首先执行LCALL指令,占用2个机器周期,然后执行_nop_()函数,它相当于汇编中的NOP指令,占用一个指令周期,最后执行一个RET返回指令,一共占用5个机器周期。若要增加延时时间,可以在delay()函数中增加_nop_()函数的数目。但利用这种方法进行长时间的延时,会降低成程序的可读性。
1.3 利用C语言中嵌套汇编程序实现延时
   
与C语言相比,在编写汇编程序的时候可以清楚地知道执行每一条指令所需的机器周期,从而精确确定其执行时间。Keil C51开发环境可以实现C语言中嵌入汇编语言,可以在延时程序设计时,结合汇编语言的优点,精确确定延时时间。C语言中嵌入汇编程序的方法:
    #pragma asm
    ;汇编程序代码
    #pragma endasm
    以12 MHz晶振为例,介绍C语言嵌套汇编语言设计延时程序:
   
    delay函数采用单循环延时,主函数调用delay函数时,首先执行LJMP指令占用2个指令,delay函数执行结束后,执行一个RET返回指令。而DJNZ执行占用2个机器周期,一共执行了10次,所以在12 MHz晶振下,延时函数执行的时间为△t=2×10+1+2+2=25μs。如果需要进行长时间延时,可以采用多重循环嵌套实现。
1.4 利用for循环实现延时
   
在单片机开发过程中,for语句和while语句也经常用于延时程序的设计。设晶振频率为12 MHz,在调用延时函数时,一共需要18个机器周期。当delay函数中的实参改变时,函数的延长时间变长,具体的延时时间△t=3×i+5×(i+1)+5。由于delay函数中变量的类型为unsigned char,最大值为255,不能进行长时间延时。可以通过改变变量的类型和利用for语句嵌套,实现长时间延时,但是延时时间的计算和delay函数有差异。
    如表1所示,在设计延时程序时,应该考虑延时的长短,开发系统的资源利用与二次开发等情况进而确定设计延时程序设计的方法。



2 延时时间的精确计算
   
在开发过程中,经常需要知道代码执行的时间,以确定延时时间。在单片机开发中经常使用硬件或Keil C51中的一些功能来确定延时时间。下面通过在频率12 MHz晶振下的一些实例进行分析。
2.1 利用示波器确定延时时间
   
单片机系统开发应用中,经常用示波器来确定代码执行的时间,如在延时后面进行IO口中的某位电平翻转,用示波器来观察IO中某位输出的标准PWM波形来确定延时时间,但是此方法必须是用来计算延时时间为毫秒级别的延时程序,否则会存在误差因为在进行IO口电平翻转和程序执行结束跳转到while函数入口,需要占几μm的时间。例如上面介绍的for循环编写的延时程序中,假设实参为249,则△t=3×249+5×(249+1)+5=2 002μs≈2 ms。
   
    将上述代码经编译后生成HEX文件,写入C51单片机中,利用Proteus中的虚拟示波器观察P1.0后波形的变化。


    从图1的PWM波形可以看出,高电平或者低电平占的时间分别为2 ms,即为以上延时程序所执行的时间,由于示波器精度的问题,存在误差为2μs。所以用这种方法确定延时时间,会存在一定误差。
2.2 利用Keil C51确定延时时间
2.2.1 Keil C51反汇编
   
对于经验丰富的开发者,可以利用Keil C51中反汇编的功能,仔细分析C语言转化成的汇编代码,从而也可以计算出代码执行所需的时间,精确得出延时时间。在Keil C51中编写好程序后,按ctrl+F5进入软件调试状态,然后点击工具栏的view → disassembly window,即可看到编译生成的汇编代码。例如2.1中例子的汇编代码为:
   
    分析上面的汇编代码,可以看出调用delay函数时,先执行MOV R7,#0xF9然后执行LACALL跳转到delay函数的入口处,一共占用3个机器周期。而地址0x000F到0x0013的指令一共被执行了250次,0x0015到0x0016的语句被执行了249次。最后执行PET语句,占用2个机器周期。则delay函数的执行时间△t=3×249+5×250+5=2 002μs。另外从上述汇编语句中可以看出,P1=P1^0x01相当于汇编中XRL direct,#data指令,占用2个机器周期。
2.2.2 Keil C51软件调试模式
   
在开发过程中,还可以利用Keil C51编译器中的断点调试功能来模拟执行延时代码所需的时间。上述举例进入软件调试状态后如图2所示。


    光标为当前程序的停止处,左侧的寄存器窗口可以看到一些寄存器名称及其值。可以通过设置断点的功能,每遇到断点,程序会自动停止在断点处。“sec”中数据的变化即为程序执行处到断点处所需的时间。对上述程序将断点设置在“P1=P1^0x01”代码处,然后点击全速运行可以得表2所示。


    从表2可以看出,delay函数执行的时间△t=2 391-389=2 002μs,与理论分析结果一样。

3 应用实例
   
DS18B20是一款单总线数字式温度传感器,对其控制必须按照严格的时序要求,有3个重要时序,分别是初始化、读以及写时序,时序图如图3所示。


    由图3可知,涉及到延时程序的要求为:
    初始化。(1)将总线低480~960μs,然后释放总线。(2)DS18B20等待15~60μs,然后返回低电平并持续60~240μs的存在脉冲。
    写时序。(1)将总线置低电平并且持续15μs后发送数据的某一位。(2)延时60~120μs然后将总线拉高并持续至少1μs的时间后开始下一次发送。
    读时序。(1)将总线置低电平,并且持续至少1μs,然后释放总线。(2)释放总线后15μs内读取并处理数据。(3)处理数据后延时,保证第一个步骤到延时结束时间至少60μs后为电阻上拉状态。
    采用延时程序的设计方法,利用for循环编写delay函数和_nop_()函数控制DS18B20。
    通过以上延时程序的控制方法,DS18B20稳定实现了温度采集。充分说明了高效的延时程序设计,在开发一些需要使用到延时程序时,可以先用Keil C51先设计好延时程序,然后利用以上方法进行分析计算,最后直接调用,可节省大量的时间、提高CPU的使用效率。

4 结束语
    Keil C51具有强大的功能,只要利用合理,可以给开发者节省大量的时间,从而提高开发效率。另外在设计延时程序的时候,应该综合考虑各种延时程序的特点,以优化CPU的使用效率。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭