单片机中断函数这个延迟函数z=32时能延迟多长?

STM32的几种延时方法_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32的几种延时方法
&&本文就STM32的几种延时方法进行了整理,同时是在3.0版的固件库的基础上整理的,但现在很多都使用了3.5版本的固件库,对于SysTick的使用有些不同,我会在接下来的时间里整理出来奉献给大家。
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢关于单片机的延时,c语言中for循环是怎么计算的?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
关于单片机的延时,c语言中for循环是怎么计算的?
还有就是一些延时的具体设计怎么做,延时的长短怎么样才合适?
  C语言中的for语句一般的表达形式如下图所示:  执行流程如下图所示:  说明:表达式1为初值表达式,表达式2为循环条件表达式,表达式3为循环变量控制表达式。
网络管理与维护
般较短的延时如微秒级才用for循环,即运行时间是一个指令周期,而AVR的指令周期又等于时钟周期(不分频),所以用1M晶振的话,一个时钟是1us,要看它具体生成了哪些机器指令才能算出单片机运行这些指令的时间。具体要看你是用什么单片机,如果是AVR单片机的话,一个指令周期是1us,执行一条单周期指令用时1us。其它单片机请参考对应的指令手册,大多数指令是单周期
本回答被提问者和网友采纳
用定时器比较好。void Delay_5ms(unsigned char ms){
g_delay_count=
while(g_delay_count);}其中g_delay_count在定时中断中减1 ,而且g_delay_count要如下定义:unsigned char volatile g_delay_
//延时节拍个数,定时器计数
单片机要精确的延时一般都用定时器,for循环延时只是一个粗略的延时,时间上不能计算,可以在仿真时测试运行时间
不能精确计算,只能在仿真时断点测试,汇编语言可以精确延时
其他2条回答
为您推荐:
其他类似问题
您可能关注的内容
for循环的相关知识
换一换
回答问题,赢新手礼包怎么用定时器写延时函数? - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
怎么用定时器写延时函数?
20:14:51  
26703&查看
void delay(uint z)
for(x=z;x&0;x--)
for(y=110;y&0;y--);& & & &
延时函数,怎么用定时器做呀?
能像上面的例子一样,能输入延时值的函数?
想做一个精确一点的,方便调用。。。
20:20:06  
首先设置定时器工作方式 也就是TMOD&&在设置TH0/1,TL0/1的初值 也就是定时时间的设置 然后设置中断允许 ,并开中断&&
助理工程师
22:43:12  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
{:20:}{:20:}
08:37:56  
我也知道流程是这样的,但具体怎么写呀?
还有定义一个变量,可以输入数值的。。。
08:18:10  
没人会吗?????
助理工程师
08:32:29  
#include&reg51.h&
void main()
& & TMOD=0X01;
& & TH0=0X3C;
& & TL0=0XB0;
& & ET0=1;
& & TR0=1;
& & while(1);
void timer0() interrupt 1
& & TH0=0X3F;
& & TL0=0XB0;& &
我也是新手啊,刚刚学的,还不熟练,多多指教。
助理工程师
08:35:03  
程序没编译,肯能有点错啊
13:39:03  
不能像delay那样输入数值得呀~~~
20:16:11  
不能像delay那样输入数值得呀~~~
助理工程师
08:59:11  
帮顶,我也想想看
10:42:10  
楼主可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。
10:46:14  
楼主可以考虑用汇编语言写,相对简单一些。用C的话,上面那个人写的差不多,但是不能在delay中写值的那样。
02:06:02  
我觉得楼主先搞清楚什么是定时器,你要实在想那样去做的话,设置好每次中断的时间,并在main函数中定义一个变量count,每次进T0中断后count++。 主函数中去判断count的大小,所以你要的精确定时=每次中断的时间*count
00:34:42  
按照你的意思,写了如下三个函数。在初始化定时器0后(调用InitTimer0()),你可以调用DelayNms(unsigned int t)这个函数来达到你想要的要的延时效果。
unsigned int count;//定义全局变量用于计时
/*----------------------------------------
& && &&&函数名& &&&:DelayNms(unsigned char t)
& & & & 功能& && &&&: 延时n毫秒
& & & & 输入参数 : t ,延时长度
& & & & 输出参数 : 无
-------------------------------------------*/
void DelayNms(unsigned int t)
& && &count=t;
& && &while(count);
/*----------------------------------------
& && &&&函数名& &&&: InitTimer0
& & & & 功能& && &&&: 定时器0初始化
& & & & 输入参数 : 无
& & & & 输出参数 : 无
-------------------------------------------*/
void InitTimer0()
& && &&&TMOD |= 0x01;//定时器0,工作方式1
& & & &&&TH0=()/256;//定时1ms
& & & &&&TL0=()%256;
& & & &&&ET0 = 1;//打开定时器0中断
& & & &&&EA&&= 1;//打开总中断
& & & &&&TR0 = 1;//打开定时器0
/*----------------------------------------
& && & 函数名& && &:IsrTimer0
& & & & 功能& && &&&:定时器0终端服务,间隔1ms将计数变量减一。
& & & & 输入参数 : 无
& & & & 输出参数 : 无
-------------------------------------------*/
void IsrTimer0() interrupt 1
& & & &&&TH0=()/256;
& & & &&&TL0=()%256;
& & & &&&count--;
00:45:33  
写的很好,恐怕你是第一次这样拿定时器这样做延时吧。
00:47:27  
这个延时函数,有强大的后盾啊
01:03:47  
貌似存在问题哦,当需要定时1ms时&&若执行&&count=t; 定时器计数是无法保证刚好在的,因此如果定时tms& && &那么&&(t-1)ms&实际&=tms,而且每次都不经相同。
这样改下如何:即使有误差,误差应该也是确定的
void DelayNms(unsigned int t)
& && &TH0=()/256;
& && &TL0=()%256;
& && &count=t;
& && &while(count);
01:12:14  
一抹阳光 发表于
貌似存在问题哦,当需要定时1ms时&&若执行&&count=t; 定时器计数是无法保证刚好在的,因此如果定 ...
哈哈,楼上是正解,原来程序的确有问题,会有小于1ms的误差。
10:24:36  
还是不怎么理解定时中断怎么调用的
14:43:28  
本帖最后由 skyfly_HUT 于
14:59 编辑
爱我别走 发表于
按照你的意思,写了如下三个函数。在初始化定时器0后(调用InitTimer0()),你可以调用DelayNms(unsigned i ...
不错不错,
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司查看: 8846|回复: 11
STM32的nop()延时问题
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
我在STM32中用nop();延时做IO口翻转,发现nop()延时为850ns,不是应该是一个时钟周期13.9ns吗?STM32跑在72M。。。求解答。
IO翻转也要时间,哪怕你不延迟,也不可能输出以13.9ns速度翻转的频率的.
主题帖子精华
金钱118134
在线时间917 小时
IO翻转也要时间,哪怕你不延迟,也不可能输出以13.9ns速度翻转的频率的.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
因为时钟频率经过分频了
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
回复【2楼】selection:
---------------------------------
什么意思?主时钟不是在72M么?
主题帖子精华
新手上路, 积分 22, 距离下一级还需 28 积分
在线时间0 小时
回复【3楼】:
---------------------------------
回复【3楼】:
---------------------------------这个跟51单片机是不一样的,你可以再好好看看这方面资料
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
回复【5楼】正点原子:
---------------------------------
但是要用掉850ns,这得多少个时钟周期啊,会不会有点夸张?
主题帖子精华
中级会员, 积分 232, 距离下一级还需 268 积分
在线时间8 小时
我也做过IO口翻转实验,用示波器测试的。执行:while(1){&LED=0;LED=1;}&&,一个周期也要300多个ns&。 这个是端口硬件翻转延时造成的吧?跟软件没关系。nop()=1/72M=13.9ns,这个延时没问题。
所以延时几微秒,再翻转端口,有零点几微秒的误差。
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
回复【7楼】jnfxt95:
---------------------------------
请问你的nop()是怎么写的?可以提供代码吗?
主题帖子精华
金钱118134
在线时间917 小时
回复【8楼】:
---------------------------------
你一定要延迟13.几个ns的,估计很难找.
直接写汇编吧.
不过函数调用,都是需要时间的,你只能纯汇编写代码了.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子& &
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
回复【9楼】正点原子:
---------------------------------
好的,谢谢。
主题帖子精华
中级会员, 积分 232, 距离下一级还需 268 积分
在线时间8 小时
回复【8楼】:
---------------------------------
__NOP();
&&&&&&&&//单周期指令&1/72M=0.01389us
主题帖子精华
初级会员, 积分 101, 距离下一级还需 99 积分
在线时间1 小时
回复【11楼】jnfxt95:
---------------------------------
仿真时NOP()测出来的不是13ns啊
Powered by用C语言实现单片机延时,怎么知道设置循环值为多少才能延时某一时间,比如延时一秒,该怎么实现?_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
用C语言实现单片机延时,怎么知道设置循环值为多少才能延时某一时间,比如延时一秒,该怎么实现?
我有更好的答案
用C语言,干不了这么仔细的活。只能是一步一步的实验,碰巧了,就能正好延时一秒。
采纳率:64%
.....,好像有个什么“时钟周期”什么的..这个貌似真的不能精确,但应该可以用其他方法啊..
用定时器啊,单片机都带定时器的,用定时器延时还是比较精确的。
为您推荐:
其他类似问题
您可能关注的内容
延时的相关知识
换一换
回答问题,赢新手礼包

我要回帖

更多关于 单片机延时函数 的文章

 

随机推荐