1T单片机 为什么定时1uS 需要4个NOP

作者&投稿:铎怜 (若有异议请与网页底部的电邮联系)
单片机汇编中为什么要用NOP~

在单片机C语言中加入NOP指令是因为标准的C语言中没有空语句。
但在单片机的C语言编程中,经常需要用几个空指令产生短延时的效果。
这在汇编语言中很容易实现,写几个nop就行了。
在AVR-GCC中,如下方法嵌入汇编指令:
asm ("nop; nop; nop; nop;" ::);
在keil C51中,直接调用库函数:
#include// 声明了void _nop_(void);
_nop_();// 产生一条NOP指令

扩展资料
执行NOP指令只使程序计数器PC加1,所以占用一个机器周期。实例:MOVLW 0xOF ;送OFH到W MOVWF PORT_B ;W内容写入B口 NOP ;空操作 MOVF PORT_B,W 。
读操作说明:该三条指令是一种对I/O口的B口连续操作的实例,其目的达到写入B口的内容要读出时,应保证写、读之间有个稳定时间,因此加入了空操作指令NOP。
作用:对于延时很短的,要求在us级的,采用“_nop_ ”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。
对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。
在选择C51中循环语句时,要注意以下几个问题:
第一、定义的C51中循环变量,尽量采用无符号字符型变量。
第二、在FOR循环语句中,尽量采用变量减减来做循环。
第三、在do,, while, while 语句中,循环体内变量也采用减减方法。
这因为在C51编译器中,对不同的循环方法,采用不同的指令来完成的。

stc15w408as-sop16封装单片机,在使用定时器0时正常,在使用定时器1时定时时间不准(使用烧录软件的“定时器计算器”生成的程序复制进去也不准);晶振11.0592m,1t模式,定时器12分频,在debug时,一个NOP占用一个时钟周期,TR1=1;后,定时加一,再往后面要3个nop定时器才加一,望高手大神指教怎么回事?正常不是要12个nop定时器采才加1的吗?

由衷地说,谢谢你!STC官方文档郑重说明,stc15w408as系列没有定时器1,我现在正用这款单片机,用定时器1想都没想。

标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的大多多于一个周期,乘除法更多。所以如果计算指令时间可以这样算。
而现在很多51核的单片机工艺质量上去后,频率大大提高,增强型51有6T的,如果接12M的话,一个nop就只需要0.51uS,如果是STC的部分单片机12T的话,那只需要1/12uS。
单片机的晶振不是随便选,要看技术手册,看最高频率,看支持类型等等。一般12M,接串口的话11.0592M。如果是PIC,很多4M,8M。
不是越高越好,对很多不需要大量处理,只是控制的情况,为了增加可靠性,降低编程难度,降低功耗,往往可选用低频的,例如实时时钟的32768晶振。

那就是一微秒可以执行四个空语句呗

还要看晶振的!!

这个要就要看你的晶振是多大的了


岗巴县15771749437: 1T单片机 为什么定时1uS 需要4个NOP -
虿的易息: 标准51是12T的,就是说12个时钟周期(晶振周期,例如12M的,周期是1/12M,单位秒),机器做一个指令周期,刚好就是1/12M*12=1uS,常见指令例如nop就是一个周期,刚好1uS,其他的大多多于一个周期,乘除法更多.所以如果计算指...

岗巴县15771749437: 51单片机定时器模式1定时1us为什么用了好几秒啊 -
虿的易息: 你的程序只有这几行吗?那没有ET1=1,开定时器中断没有啊.定时到了,是不能中断的.其实,这么设置没有什么意义的,因为,执行完TR1=1,这条指令,就开始计时了,只要1个机器周期就定时到.执行完TR1=1,定时就到了.但是还没有执行EA=1;就不能中断,还得等到ET1=1以后,才能中断.其实,早就定时到了,但没有执行ET1=1是不能中断.单片机响应中断后,转去执行中断服务子程序,这需要更多的机器周期,远远超过1个机器周期,因此,你的设置是无理的.而你的程序就没有ET1=1,所以,不可能中断的.等了好几秒.........为什么啊?就应该等啊.

岗巴县15771749437: 单片机T1是怎么定时的? -
虿的易息: 51单片机定时器t1用作定时的方式有三种,分别为 工作方式0,13位定时模式. 工作方式1,16位定时模式 工作方式2,8位自动重装载模式.

岗巴县15771749437: 15单片机的1us延时,要精确,11.0592MHZ,1T的,就是蓝桥杯的那个板子,谢谢^ - ^ -
虿的易息: 这不可能的,12M的频率,一个机器周期就是1us,而11.0592MHZ,一个机器周期是1.085us.就算是1T的单片机,一个时钟周期是0.09us.选晶振频率是10MHZ,一个时钟周期是0.1us.写一个程序用10个时钟周期的,还可以.但是太难精确了,要把每一个指令的时间都要计算准备才行.还要用汇编语言写,而且也不能写成延时子程序,因为调用和返回子程序的时间就超过了1us.

岗巴县15771749437: 一个关于单片机的定时中断的问题.有这样一句话:假设时钟频率为12MHz,12个时钟周期为一个机器周期,那么此时机器周期就是1us,计满TH0和TL0就需要... -
虿的易息:[答案] 51单片机在内部要对晶振12MHZ,所以12M晶振除以12就是1M,即1秒钟有1M个时钟周期,每个时钟周期就是10^-6秒,即1us. TH0和TL0分别为定时器T0的高八位和低八位定时器位,执行一个周期,当然要记满2^16-1个数(即脉冲)

岗巴县15771749437: 单片机运行为什么需要时钟信号,具体说一下 -
虿的易息: 每条指令的执行都是需要按照一定时序的,就像一个人按照时间工作一样,所以单片机要运行必须有时钟信号的输入

岗巴县15771749437: 51单片机定时寄存器定时也不到一秒钟,如果想定时1分钟该如何定时, -
虿的易息: 51单片机定时工作在方式1,是16位计数方式,如果晶振频率是12M,机器周期 是1us,那么最大的定时时间也只有65.536ms,要直接定时1秒是不可能的.但是,可以定时50ms,采用中断方式,每50ms定时到,要中断一次的,在中断程序就对中断计数,中断20次的时间就是50msX20=1000ms=1秒.有了1秒计时,那1分钟就容易了,对1秒再计数啊,60秒就是1分啦.可能你没有写过时钟程序吧,电子钟程序就是这种方法,再计60分为1小时,24小时为一日,依此,可以计年月日呢.这有什么难的.关键是对中断计数,就可以解决长时间定时了.

岗巴县15771749437: 一个关于单片机定时器的问题 -
虿的易息: 定时器的初值跟设置的模式有关,就拿定时器0的模式1(即16位模式)来说 ,由于51系列单片机是8位的,所以需要2个寄存器,高8位称为TH0,低8为称为TL0.定时器的工作原理是输入一个脉冲,寄存器计数+1,等到2个寄存器计数到全部位...

岗巴县15771749437: 怎么用单片机C8051F定时10us? -
虿的易息: 条件:12M晶振; 打开T0中断不用我说了吧?TMOD=0x02; //把定时器模式设定为自动装载初值的8位模式即最大计数255; TH0=0x5f; TL0=0x5f; //把定时器定时器初值设为245 如果用T1,则初始设置(打开中断不说了) TMOD=0x20; //设定...

岗巴县15771749437: stc15w408as单片机定时器1定时时间不准,要3个NOP定时器1才加一;定时器0正常 -
虿的易息: stc15w408as-sop16封装单片机,在使用定时器0时正常,在使用定时器1时定时时间不准(使用烧录软件的“定时器计算器”生成的程序复制进去也不准);晶振11.0592m,1t模式,定时器12分频,在debug时,一个NOP占用一个时钟周期,TR1=1;后,定时加一,再往后面要3个nop定时器才加一,望高手大神指教怎么回事?正常不是要12个nop定时器采才加1的吗?由衷地说,谢谢你!STC官方文档郑重说明,stc15w408as系列没有定时器1,我现在正用这款单片机,用定时器1想都没想.

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