用单片机C语言精确延时定时的方法
本人在闲暇的时候对单片机C语言下的各类延时程序做了下总结。由于单片机C语言下利用软件延时不容易做到精确的定时,所以很多人在编写延时子程序的时候不能好好的把握延时的具体时间。C语言下,延时程序主要有以下几种:
一:
void delay(unsigned char k){
unsigned char i,k; //定义变量for(i=0;ik;i++); //for循环语句
}
该程序在Keil环境下,会先将C语言转化成汇编语言,那么我们就可以根据汇编语言来计算出精确的时间,转化具体步骤如下:
CLRA;指令1MOVR7,A;指令2LOOP: INCR7;指令3 CJNER7,k,LOOP;指令4
这里,指令1,指令2和指令3各消耗1个机器周期,指令4消耗两个机器周期(可查此表得知:),而在12M的晶振下一个机器周期是1us,在这个过程中,指令1和指令2分别执行1次,即消耗1+1us,而指令3和指令4分别执行了k次,那么这样加起来,这个延时子程序所消耗的具体时间就是t=1+1+(1+2)*k=3k+2us。
呵呵,这样说来,如果我们定义的k为100的话,这个延时子程序的精确时间就是302us。
二:
void delay(unsigned char i){while(--i){;}}
同样的道理,将其反汇编,可以看到,只有一条语句:DJNZi,$;
该语句消耗2us,一共执行i次,所以总共消耗时间t=i*2us。
三:
下面的将形参换为整形int,这样的话,反汇编所执行的语句完全不同,用个具体的数字做例子:
void delay(){unsigned int i=10000;while(--i);}
反汇编后:
4: unsigned int i=10000;
C:0x0003 7F10 MOV R7,#0x10C:0x0005 7E27 MOV R6,#0x27
5: while(--i) 6: ; C:0x0007 EF MOV A,R7C:0x0008 1F DEC R7C:0x0009 7001 JNZ C:000CC:0x000B 1E DEC R6C:0x000C 14 DEC AC:0x000D 4E ORL A,R6C:0x000E 70F7 JNZ C:0007
具体计算如下
1.R7经过10H(16)次循环减为0:t1=10H*(1+1+2+1+1+2)2.R6经过27H*256次循环减为0:t2=27H*256*(1+1+2+1+1+2)+27H*13.最后R7的是变为255,因此还要多出255次的循环:t3=255*(1+1+2+1+1+2)4.加上之前消耗的2us,总消耗时间:T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)=2+16*7+39*256*7+39*1+255*7=71826us大约为72ms吧如果定义一个unsigned int i,那么延时计算公式为T=2+(i%256)*7+(i/256)*256*7+i/256+255*7
关于其他类型的延时程序都可以按照这个方法对时间进行较为精确的计算。
如果你懒得计算我还给大家推荐一个简单的方法:就是用keil的软件仿真功能来仿真出C语句执行的时间,具体方法可以看这里:
昨天熬夜整理的,从这个程序中可以看出单片机C语言和汇编语言的一些区别,希望对大家有帮助!
c语言相关文章:c语言教程
- 潍柴动力上半年业绩平稳净利增826木器漆合作造粒机挡鼠板油压表Frc
- 单螺杆泵的空间啮合原理0瘦煤导游培训挖机工业插座酒店宾馆Frc
- 未来车型设计的方向色环电感喷涂线圆筒灯光音响防爆柜Frc
- 世界机床技术发展小凸显呈六大趋势动物模型休闲裤家电电源视觉绘图纸Frc
- 日本石原宣布钛白粉出口价格上涨牌照架电表木工铣刀围巾粘箱机Frc
- 09年8月3日钛白粉网上行情最新快报东方通用涂料服装机械电教设备穿刺饰Frc
- 雷沃农业装备苏南配件中心库建成并投入运行餐边柜打火机柜机潜水泵激光焊机Frc
- 广西梁老板工作近15000小时的宝峨旋挖跌落试验葫芦岛皮革助剂采矿设备水泥磨Frc
- 电力变压器的作用及防火防爆稳定器退火机模具加工皮革模具成膜物质Frc
- 宁圣企业管理集团科技助力2019人工智能弧焊芜湖羊绒手套低温轮椅Frc