机器周期为1um.而1秒=10^6um。但是为什么感觉设计出来的程序延迟是10秒的呢
delay()
{
int i,s;
for(i=1000;i>0;i--)
{
for(s=1000;s>0;s--)
{
_nop_();
}
}
}
很简单, for循环也是需要时间的.
当你使用仿真的时候,通常可以在编译器里面查看这段代码的汇编指令.
你可以看书它的用到了多少个汇编指令, 然后在你的芯片手册上查询,每一个汇编指令执行需要多少个最小指令周期. 最小指令周期才是你说的1um, 全部加起来, 你就知道你这句话用掉了多少个最小指令.
很明显 远远超过了1个最小指令.9秒的的误差算少的了...
所以说,假如你要做1s的延迟, 最好使用内部时钟中断来做,直接在程序内部delay延时的话,占用系统资源还算不准...
具体解释下上图, 为了拿这5分还真不容易...
首先, 进入函数就需要5个汇编指令, 这些指令主要是入栈,备份指针的操作, 不同的编译器指令不同,但都差不多.... 当然 这5个指令是进入函数只跑一次, 占用时间不多, 消耗时间最多的是你for循环内部的指令, 一个for循环需要8条汇编指令才能实现, 而每个汇编指令通常都需要消耗1-2个最小指令循环,具体那个指令消耗几个循环我懒的查手册, 不同的芯片不一样, 你自己看看你用的芯片手册把....
以上... 应该清楚了把.. 不明白追问, 我要是再次无聊的话, 会修改回答.
sorry啊。。。我还没学汇编。。。直接学的C51.。。。
追答还是看看汇编吧。不学汇编就别想学好的单片机
我的是int 啊。。。
可是误差不会多出9秒啊。
追答void delay_main(uint z)//-----------------主延时函数1毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
void delay_main(1000)即为1秒,
建议可以用t0计时器中断来检句测每条语句时间,最好在PROTEUS上仿真看看
51单片机延时函数的问题。晶振是12MHz..需要延时1秒
很明显 远远超过了1个最小指令.9秒的的误差算少的了...所以说,假如你要做1s的延迟, 最好使用内部时钟中断来做,直接在程序内部delay延时的话,占用系统资源还算不准...具体解释下上图, 为了拿这5分还真不容易...首先, 进入函数就需要5个汇编指令, 这些指令主要是入栈,备份指针的操作, 不同的...
51单片机延时一秒函数,晶振12MHZ
把t 改为你要延时的数就可以了,1毫秒就把t改为1 500毫秒就把t改为500
设51单片机晶振频率为12MHZ,延时1m的子程序
用的是11.0592M的,你如果真的需要是12M的,那自己直接修改成12M就可以了。调用的时候直接把uinsigned int ms改成1就是1ms.void ConfigTimer0(unsigned int ms){ unsigned long tmp;tmp = 11059200\/12;tmp = (tmp * ms)\/1000;tmp = 65536 - tmp;tmp = tmp + 18;T0RH = (unsigned char...
51单片机问题,晶振频率为12mhz,请问我的以下代码能够成功定时1秒吗?谢谢...
程序有错误,第一将十六位数据送TH0,这是错误的。第二,开启了定时器中断,却程序用查询方式,这也会造成错误的结果。
设单片机晶振频率为12MHZ,试编写一延时1s的子程序
12mhz\/12t的传统51单片机下.#include <reg51.h> sbit test = p1^0;void delay_50ms(unsigned char times){ while(times -- ){ th0 = 0x3c;\/\/---装入初值,定时器0定时50ms tl0 = 0xb0;tr0 = 1;\/\/---启动定时器 while(!tf0);\/\/---等等定时时间到达 tf0 = 0;\/\/---清零定时...
单片机的延时程序。。为什么这个是延时1ms??
这个应该是51单片机晶振是12MHZ的,可以通过示波器测试时间,这个没有为什么,是一个经验值,准确的延时时间要用定时器做,这种延时是大概的时间
51单片机定时器2的最短定时时间怎么有限制?
51单片机定时器,晶振是12MHZ、12分频,理论上最短定时时间1微秒,但是,CPU 运行指令 需要时间,只要中断服务程序 的运行时间 不超过定时器 定时时间,并且 有些余量,则就不成问题,如果没有余量,则中断结束 又进入 中断,如果 超过定时器 定时时间,则来不及 处理 定时也就不准确了。用 C 语言...
AT89C51单片机,如何实现延迟一秒
例如用12M晶振做1ms定时计算如下:机器周期=12\/12*10^6=1us(微秒)定时初值=(1*10^-3)\/(1*10^-6)=1000;所以:TH0=(65536-1000)%256;TL0=(65536-1000)\/256;将65536-1000=64536化为16进制为:0xFC18 TH0=0xFC;TL0=0X18;定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了...
MCS-51采用12MHz的晶振,定时1ms,如用定时器方式1时的初值(16进制数)应...
对于12MHz的时钟,51单片机的机器周期就为 1\/(12000000\/12)=1us 那么对于定时1ms,需要定时器计数的个数就为 1ms\/1us=1000 那么,对于方式1,需要装入的时间常数就为 2^16-1000=64536——0xfc18 建议随便参考一本51单片机的教材,都会有相关介绍。
51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算...
如果要精确的延时建议采用中断:include "reg51.h"\/\/timer init void initTimer(void){ TMOD=0x2;TH0=0x6;TL0=0x6;} int T250uS;char T_mark;\/\/timer0\/counter0 interrupt void timer0(void) interrupt 1 { \/\/add your code here.T250uS++;T_mark=0;} void Delay1S(char n){ for(...