Ⅰ 51单片机延时函数
这个要结合你的仿真来做,首先设置断点,测量出单个循环的指令周期数,然后再进行延时计算,用5/单次循环的时间后确认循环次数,你的i,j没有嵌套,嵌套后更合理。
Ⅱ 怎么写段单片机延时函数要用定时器!
1、首先分析您的程序,
void
delay()
{
int
i;
if(1
==
TF0)//if(TF0==1),查询定时器溢出标志位
{
TF0=0;
i=10000;//定时溢出时给i赋值1000
TH0=0xDC;TL0=0x00;
i--;//i=999,如果还没有减到0时定时器又溢出,则i永远不会减到0!!!!所以您的这段程序不应该行不通!!
}
while(1)
{
if(i==0)
break
;
}
}
2、建议做法
(1)定义一个全局变量用于作定时计数如unsigned
char
n;
(2)定时器采用以某一时间基准(10ms)中断方式,每中断一次中断处理程序里n++;
(3)在延时函数中对n进行操作,如延时1s即1000ms则:
void
delay_1s()
{
while(n<100);//如果n<100,即还没有到1s就等待
n=0;如果1s时间到则清零n,退出子程序
}
当然这样定时精度可能需要调整,但思路可以试试。
Ⅲ 单片机关于延时函数,请问这段代码不是延时500ms吗为什么这里说是200ms
按键的延时消抖是初学单片机的必经之路,因为只要是机械开关所传递的信号,都会存在波动,有时这些波动是“致命”的,所以消除其影响就是一门手艺了。硬件消抖有其优点,同样的也有不方便的地方,开发成本高,操作难度大,可移植性差。软件消抖就相对较好些,新手即可操作,延时消抖,并非消抖的最终最优方法,但好在简单易懂,我们先认识消抖的方法和目的。
按键在按下和抬起时,都会出现短暂的抖动,称之为前沿抖动和后沿抖动,他们持续的时间大致在5-10毫秒,键稳定时间会在100毫秒以上,就人的操作速度来看,键稳定的时间不会低于100毫秒,因为,1秒十次的操作,估计手都受不了。除非科幻世界或武侠世界的人。
既然抖动时间基本不变,那么,我们就有这样一种方法,当按键出现第一个电位变化,假设是高电位转变成低电位,那么我们就延时一段时间,设置10毫秒,10毫秒以后,我们再次判断此时的电位状态,是否是低电位,如果是低电位,那么就认为按键按下了,如果是高电位,就认为按键是抖动。从低电位变成高电位也是一样。
我们就是用延时来,把抖动的时间空过去了,这样就不用担心抖动产生的电位频繁变化了。接下来,我们看下程序如何写。
按流程来,基本上就能写出来,程序分为两大块,一个是主函数,处理开关状态,一个是延时函数。
我们先定义一个开关,然后我又声明了一个位变量,其实这个位变量在这里可以不用,不过习惯如此,对采集来的数据我习惯让其保存在特定的变量中,这样方便后期使用,以防自己改变变量值,造成端口的电位随之改变。
主函数中,先把开关采集端口置1,这是读取数据的前提条件,然后把需要采集的io的状态转移给中间变量,接着判断此时中间变量是否为零,也就是按键是否按下,如果没有按下,那就跳出,继续赋值,接着判断,直到判断为零,进入语句中,先延时一段时间,让抖动空过去,延时结束,再判断一次,由于此时程序还没走出去,所以中间变量的值也没有实时切换,我们此时要判断按键实时状态是否为零,就需要判断端口的实际值,当key10为零,就说明按键确实处于按下状态,这就可以执行,移位指令。
需要说明,如果使用函数,在调用时,只需写出函数名即可。但是在程序最开始位置,需要声明函数,声明时,要写全,尤其是返回值的类型和变量名,不能省略。可以把函数直接复制到前方,然后加一个冒号即可。
程序看完,我们仿真一下测试下程序是否执行。
这是之前我们使用的仿真电路,直接使用就好。我没有改变工程文件,所以无需重新导入可执行文件,程序会直接读取我保存好的新的可执行文件,文件名没有改变。
这是软件的初始状态,所有端口都是高电位,我们按下P10.
按键随着按下,可以稳定的响应,我们再通过实际电路测试一下。
测试发现,我按下按键,还没松手,就已经流水般的熄灭了5个灯了,什么情况?
我们可以看程序的这里
keybuff=key10; //赋值
if(keybuff==0) //判断开关是否按下
{
delay(50); //延时一段时间
if(key10==0) //再次判断开关是否按下
{
P3=P3>>1; //P3左移一位
}
}
从这一段可以看出,只要我能满足keybuff为零,key10为零,那么程序就会在延时结束再次进入程序,如此循环,就造成了,按键按下,P3被连续执行动作。我们怎么才能让这种情况不发生呢?这就需要我们不仅检测按键按下,还需要检测按键弹起,只有按键弹起我们才允许它执行下一步,这样就能按下一次,抬起手,才会停止,保证了操作的准确。
执行流程如下:
判断按键按下》按键按下》延时》判断按键按下》按键按下》执行动作》判断按键抬起》按键抬起》结束。
我们再次测试,此时发现,按下后,不松开,按键不再连续动作,但是松开按键后,原本熄灭的小灯又点亮了,我们梳理程序,可以发现,是不存在错误的,流程也没有问题。其实这就涉及我们的硬件了,我们使用软件仿真时,这些问题都是没有的,但硬件跟仿真的区别就在这里,在单片机中,如果我们没有规定执行下一步的位置,单片机就会在流程走完后,随机进入我们无法控制的流程,这在专业中称之为跑飞。为了防止跑飞,我们一般会在结束添加循环语句,让程序停止在我们设定的位置,这样就不会有问题了。
此处我们需要连续监测按键状态,所以就让程序不断的循环判断按键即可。
再次测试,一切就按照程序执行了,动作也正常了。
这就是为什么我们之前的测试程序,都会在主函数中添加循环的作用。通过这个示例,也是告诉大家,仿真只是学习的方法,最终目的还是要在实际的硬件上进行。不然你永远不知道自己的程序能不能完成真正的功能,设计不能光纸上谈兵哦。
Ⅳ 怎么计算单片机中的下列的延迟函数(12M)
首先你要知道一个指令周期是几秒
算法是1/(晶振频率除以12)
然后你要知道循环究竟执行了几个指令周期
你可以用keil里在线反汇编命令看看你的循环编译成机器语言后到底是几个指令周期
这样就知道了延迟时间
当然你取近似值也可以的
比如
for(i=0,i<255,i++){x=2}
这里x=2是一个指令周期
而执行了255次
假如你的晶振是12mhz的
则你执行一个指令周期是1us
255次是0.255ms
Ⅳ 51单片机用c语言怎么写延时函数
延时时间的计算与单片机的晶振频率有关。若晶振频率为12Mhz,那么单片机每震动一次所需要的时间是1/12M s。那么再来看看单片机执行一次自减所需要的振动次数是96次,假如我们对时间要求不是特别精确的话,可以约等于100来计算。现在通过上面两个数据可以得出:单片机每执行一次自减所需要的时间是1/12M *100(s),即1/120000 s,逆向计算一下,每1ms需要自减多少次?120次对吧。所以一个简单的延时功能就诞生了,我们只需要自减120次,就可以延时1ms,如果我们要延时50ms呢,那就自减50*120=6000次。那么在程序上如何表达呢?我们可以用两套for循环
void delay(int i){
int x,y;
for(x=i;x>0;x--){
for(y=120;y>0;y--)
}
}
参数 i 代表该函数延时多少ms
Ⅵ 51单片机C语言程序中延时函数delay的原理是什么
原理:只是执行一些所谓的“无实际意义的指令”,如缩放或执行一个int自加,简单地说,就像高中数学中的“乘法原理”一样,很容易迅速增加上面提到的“无意义指令”的数量
关于大小的值:如果是在C语言中,该值不仅与水晶振动、单片机本身的速度,但也与C的编译器,所以,虽然这个值可以精确计算,但大多数情况下,程序员是经验值。
当然,如果你在汇编中编程,情况就不同了,因为每条指令使用一定数量的机器周期,你当然可以根据所有指令使用的总时间来计算特定延迟的总时间。
(6)单片机延迟函数扩展阅读:
定义延迟XMS毫秒的延迟函数
Voiddelay(unsignedintXMS)//XMS表示需要延迟的毫秒数
{
无符号intx,y;
For(x=XMS;X0;X-)
For(y=110;Y”0;Y-);
}
使用:
VoidDelay10us(ucharMs)
{
Uchar数据我;
(;女士“0;------Ms)
对于(I = 26)我> 0;我-);
}
I=[(延迟值-1.75)*12/ms-15]/4
Ⅶ 单片机延时函数原理
就是这个道理,如果一重循环延时时间较短的话,可以用二重循环。但C语言对延时时间不好精确计算,一般只用于对时间要求不严的场合。精确延时还是要用定时器。
Ⅷ 请求单片机delay延时函数
如果在程序中x=10(你写程序时肯定会给他赋一个值,在这里假定是10),即在程序的某处会有delay(10)这样的语句。相当于循环了600*x=600*10=6000次。可以根据自己的需要来定。你说得对,可以写一个就行。但是有些芯片,你在控制他时,时序要求非常严格,如果延时太长或延时太短,都不会运行出结果。如果需要小延时的地方(只需几个us),只写一个就可以。如果需要延时几ms,只写一个,可能达不到延时要求。总而言之,要根据你的程序需要,时间长了,学的多了,也就懂了。希望我的回答,能给你提供点帮助
Ⅸ 怎么理解这个单片机延迟函数
这个单片机延迟函数,其实就是 空操作 加 计数循环,至于延时时间 就要看用的单片机 指令周期而定,12T指令周期的约40uS左右,1T指令周期的约为5~6uS吧,单片机延迟函数可以有很多方法编写,看行程需要而定,有得较长时间的延时最好不要用延时函数写(因为延时函数是占用CPU时间资源的)。
Ⅹ 单片机延时函数
因为第二个延时时间太长导致数码管刷新频率太低