C51延时计算的问题,渴望大侠们给下解答,小弟在此提前表示感谢!(晶振是12MHZ)

作者&投稿:左将 (若有异议请与网页底部的电邮联系)
51单片机延时一秒函数,晶振12MHZ~

我这有个函数自己实验出来的,在KEIL里看差不多就是延时1毫秒
void delay1ms(unsigned int t)
{
unsigned x,y;
for(x=t;x>0;x--)
for(y=124;y>0;y--);
}

把t 改为你要延时的数就可以了,1毫秒就把t改为1 500毫秒就把t改为500

你可以用keil 设置断点来看运行的时间不就知道了

void delay(uint t)
{
uint i;
for(;t>0;t--)
for(i=0; i<125; i++);

}
在这段程序之前和之后设置一个断点
比如说
...
* delay(1);//此行设置断点
* ....//此行设置断点
分别设置断点看运行时间。
这两个断点之间运行的时间就是延时时间
你再看设置的是12M晶振还是11m晶振的延时为25ms不就出来了

编译后看生成的汇编代码,按照指令周期表计算执行整个函数所需时间。

用KEIL ,调试,设断点,点全速运行,可以看到所用时间

C语言不能精确延时时间,这是因为C语言在编译时还要转换成汇编语言,再转成16进制的HEX文件。
汇编语言能很好的计算时间,但由于汇编的开发难、维护难等原因,一般很少用,所以用C语言想计算出比较精确的时间成了难题。
但,如果你用的是KEIL的编译器,是可以用软件调试出时间的,DEBUG功能,这里文字有限,不能一一说明,建议搜索下debug或搜索“单片机 C语言精确延时”,你就能得到答案了。
调试结果能精确0.00000001秒,通常用的89系列用12M的晶振,最小指令时间为1个机器周期,即12T/12M=1Mips,则最小时间为0.000001,KEIL精确度足够用了。


求解51单片机延时程序计算
内循环的循环次数为125(07DH),延时时间为:125 X (2+2+4)=1000µs=1ms (2)外循环:外循环的循环次数为10(0AH),总循环:10 x 1000µs=10000µs=10ms (3)精确计算:MOV R0,#0AH 运行了1次用 2µs DL2:MOV R1,#7DH 运行了10次用2x10µs DL2...

51单片机延时出错
解决的办法是将delay函数定义为可重用,接着在进入中断时关闭定时器或者关闭定时器中断,然后再调用delay函数结束后打开定时器或者打开定时器中断。当然这可能会和你本来想要的功能有所出入,具体问题还是要具体分析。上楼说的有错,你的这个程序与嵌套无关,51里面当进入中断后则处理中断,如果中断还未处理...

51单片机12HZ的,怎么计算延时时间?
2 * 248 = 496 T DJNZ R1,F (2 + 496 + 1) * 60 = 29940T RET 2 + 29940 + 1 = 29943T 总共是: 29943T。如果是 12MHz,时间就是:29943us。另外,执行这个程序,还需要一条 CALL 指令,应该再加上 2T。--怎么样实现5S的延时?慢慢算呗。

求解51单片机延时程序计算(谢谢)
;延时程序的精确时间算法 ;本程序所有晶振为12MHz,12周期模式 ;定时时间为0.5秒的延时器 nop LCALL DELAY ;4uS ;执行上句的时间:4+499995+1(ret时间)=0.5秒 NOP ;===包含LCALL DELAY是0.5秒=== DELAY:MOV R7,#9 ;1uS DELAY1:MOV R6,#128 ;1uS DELAY2:MOV R...

51单片机延时问题 (STC12C5A60S2 晶振频率11.059MHz)实验书上的程序与...
STC12C5A60S2单片机 是 1T 单片机,一个机器周期=1\/11.059=0.09微秒 DJNZ Rn, rel 是 4 个机器周期,

51单片机,晶振为6M请帮忙写一个10ms的延时程序,能有详细解释的。因为我...
延时有很多种方法,有一种是让单片机去做无聊的循环,还有一种是用定时器。我本身也是菜鸟所以只能粗略的讲一下。第一种的算法是 晶振的周期T1=1\/f; 这里f=6MHz 所以T1=1\/6 us;(微秒)单片机花12个T1去执行一个指令,所以一个机器周期等于12个晶振周期,T2=12*T1=2us 10ms=1000 0us 所以...

51单片机延时问题
事实上,这个延时程序的延时时间远不止500微妙,可能达到2毫秒左右,C语言的延时程序是不准确的。

51单片机的一个延时,我问下这个延时是具体怎么执行延时的?
需要延时的时候,在程序中带参数调用DelayMs,参数传递给DelayMs的形式参数“unsigned char t”,t就有了数值。“while(t--);”执行t个循环后退出,t个循环用了若干时间。连续执行两条“DelayUs2x(245);”,原理同第1,2步,也用了若干时间。以上执行用的时间就是你延时的时间。问题点:程序有失误...

51单片机延时问题
你好!很高兴为你解答,这个程序很简单的,按键是无规则按下,led灯对于每一次按键都是延时1秒,相当于前边按键的动作整体延时,传给led灯,没有明白你的意思,你的意思是不是按键一次LED等亮1秒灭掉,如果按键连续按5次,相当于LED亮5秒灭掉吗是这样吗!

51单片机延时函数的问题。晶振是12MHz..需要延时1秒
你可以看书它的用到了多少个汇编指令, 然后在你的芯片手册上查询,每一个汇编指令执行需要多少个最小指令周期. 最小指令周期才是你说的1um, 全部加起来, 你就知道你这句话用掉了多少个最小指令.很明显 远远超过了1个最小指令.9秒的的误差算少的了...所以说,假如你要做1s的延迟, 最好...

普宁市15184472417: C51单片机动态显示秒分时 -
淳力硫酸: #include unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99, 0x92,0x82,0xF8,0x80,0x90, 0xff,0xff,0xff,0xff,0xff,0xff}; //字形表 unsigned char led12,led34,led56;//显示暂存 unsigned int jsq=0; //T0计数 11.0592M unsigned char h=12,m=0,s=0...

普宁市15184472417: ARM 2451中 想要延时2ms 应赋值多少 延时函数为void delay - c(unsigned int t) { while(--t); } -
淳力硫酸: 你给的算法误差大,不同的计算机运算速度不同,等待时间不同.暂停,可以用Windows.h里的Sleep()函数,也可以自己写.Sleep(1000);参数是1000毫秒,就是暂停1秒.一般人认为,Sleep函数,每秒可能有25毫秒误差.自己写,可以...

普宁市15184472417: C51单片机动态显示时分秒问题 -
淳力硫酸: 兄弟,我粗粗看了一下,问题的确在定时器上. 先告诉你怎么解决吧: if(TF0==1) { //加上以下几句 TF0=0; TH0=(65536-20000)/256;// TL0=(65536-20000)%256;//定时20ms ………你自己的程序…… buffer[4]=hour%10; buffer[5]=hour/10; } 如果...

普宁市15184472417: C语言延时 -
淳力硫酸: 在Windows下最简单的办法是调用系统函数Sleep(time),单位是ms,在windows.h中声明,注意大小写;不然就用中的函数获得当前时间,然后通过比较记录的时间和当前时间,决定作出的动作(不推荐用空循环,这样会占用CPU时间).

普宁市15184472417: 单片机定时器初值计算问题, -
淳力硫酸: 14是两个指令周期需要的时间.大于16分频不进行修正是因为14和16整除结果为0.

普宁市15184472417: 请问在Keil uVision3中怎样程序的延时时间? -
淳力硫酸: 这个时软件BUG,我也遇到这个问题.解决方法时重新下载一个KEIL 软件就OK了

普宁市15184472417: 按键精灵延时问题,我想延时50分钟,求大侠们帮帮刚刚入门的童鞋.如下 -
淳力硫酸: 延迟50分钟?Delay 1000 //是一秒Delay 1000*60 //一分钟Delay 1000*60*50 //50分钟

普宁市15184472417: void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } -
淳力硫酸: 这个延时函数是针对特定单片机写的,在该芯片上for(j=0;j<120;j++);的执行时间刚好是1ms,这样的话这个函数就会延时count毫秒. 这类延时方法的具体计算方法是,查看该芯片的主频等,确定执行一条指令的时间,因为编译器编译循环产生的指令序列是可以确定的,故可以计算延时指定时间需要执行多少条相应指令,然后写成相应大小的循环即可.

普宁市15184472417: AT89C51单片机的扩展问题,求大侠们帮帮忙,在线等!!! -
淳力硫酸: EDFF,是16位数,怎么能存入 A ? A,不是 8 位数的吗? 应该分两次传输才行.试试看下面的:ORG 0000H MOV SBUF, #0EDH JNB TI, $ CLR TI MOV SBUF, #0FFH JNB TI, $ CLR TI CALL DL500MS ;以上可显示16位数EDFF,显示500MS. ; ;此处,还可以增加其它显示花样 ; SJMP 0000H ;循环到前面去 ;---------------------------------------- DL500MS: ;延时程序 ………… RET END

普宁市15184472417: 关于c51 运算符的 -
淳力硫酸: #define MSB(word) (BYTE)((WORD)(word)>>8&oxff) MSB(word)是一个宏,过程如下1.将参数word强制转化为WORD类型,WORD是unsigned short,长度为2个字节:(WORD)(word)2.将上一步结果在向右移动8位再与11111111也就是ff进行与运算:((WORD)(word)>>8&oxff) 3.最后将这个结果强制转化为BYTE类型,也就是无符号字符型,长度为1个字节.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网