⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 我的精确延时记录.txt

📁 温度测量ds18b20.rar
💻 TXT
字号:
一)1M晶振for函数 
time	起始时间	运行完毕时间
10	64		127
20	64		177
30	64		227
1	64		82
0	64		77
2	64		87

综上,1M晶振调用for函数的延时=13+time*5 us-----包含调用和返回的时间了
附 for函数
void delay_1us(uchar time)
{
 for (;time>0;time--)
  ;
}

二)1M晶振asm函数
起始时间	运行完毕时间
89		97
综上,1M晶振调用asm函数的延时=8us------包含调用和返回的时间了
附asm函数
void asm_delay_1us(void)
{
  asm("nop");
}

三)1M晶振for_asm函数1 :固定for循环次数为10,这样就可以避免调用函数时检测time是否合法
===非常精确的做法=====
不要弄函数了,直接来asm语句即可

四)c的汇编延时内嵌 //精确延时,要CLI屏蔽中断
一重循环
n	起始	结束时间
20	64	125
10	64	95
结论,延时=1+n*3
附代码
 /*us级精确延时 255us以内 延时=1+n*3 */
// CLI;
  asm("LDI R16,n");//1t ,寄存器R15~R30
  asm("CLZ");//1t
  asm("LOOP1:DEC R16");//1t
  asm("BRNE LOOP1");//1t或2t//标志位Z是0就转移
  //asm("NOP");//1t
  //asm("NOP");//1t
 // SEI;
 /*us级精确延时 255us以内,可用nop补足余数*/

 二重循环
 n	m	起始	结束时间	延时
 10	20	112	762		650
 1	2	112	123		11
 1	1	112	120		8
 2	1	112	128		16
 2	2	112	134		22

综上,延时=n*(m*3+5)

/*us级 196348us即196ms以内 延时=n*(m*3+5)*/
  // CLI;
   asm("LDI R18,n");//外圈循环n
   asm("LOOP3:LDI R17,m");//内圈循环m
   asm("CLZ");//1t
   asm("LOOP2:DEC R17");//1t
   asm("BRNE LOOP2");
   asm("CLZ");//1t
   asm("DEC R18");//1t
   asm("BRNE LOOP3");
   //asm("NOP");//1t
  // SEI;
 /*us级精确延时 196348us即196ms以内,可用nop补足余数*/

 五)调用汇编函数的时间
 晶振MHz	来回的时间us
 1		7
 4		7/4
 8		7/8

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -