TA的每日心情 | 慵懒 2018-3-28 17:24 |
---|
签到天数: 276 天 连续签到: 1 天 [LV.8]以坛为家I
|
很多的单片机的真高手和假高手 都不喜欢用 软件延时 !
我不是高手,所以我还用!!!
我只用过keil编译器 !
KEIL 编译器的优化级别 对我写得下面这些函数是有影响的..
Keil V8.02 中第0-3级 是一个档
4-5级是 一个档
6-9级是一个档
===========================
例如下的这些例子在 0-3的级别下还是很精确的
注意:INT8U 你用 unsigned char 替代就可以用了
/*------------------------
软件延时(单位:秒) KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
最长延时时间255秒 晶振12Mhz
若count=0,实际延时0.000014秒
若count=1,实际延时1.000024秒
若count=2,实际延时2.000034秒
若count=3,实际延时3.000044秒
若count=n,实际延时n + 0.000014 + (0.00001 * n)秒
//---------------------------------------------
void Delay_Sec(INT8U count)
{
long int i;
INT8U j;
for (j = 0; j < count; j++) {
for (i = 0; i < 16666; i++) {
;
}
}
}
/*------------------------
软件延时(单位:秒) KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
最长延时时间255秒 晶振11.0592Mhz
若count=0,实际延时0.00001519秒
若count=1,实际延时1.00006945秒
若count=2,实际延时2.00012369秒
若count=3,实际延时3.00017795秒
若count=n,实际延时n + 0.00001519 + (0.0000542 * n)秒
//------------------------
void Delay_Sec(INT8U count)
{
long int i;
INT8U j;
for (j = 0; j < count; j++) {
for (i = 0; i < 15360; i++) {
;
}
}
}
-------------------------*/
/*------------------------
软件延时(单位:秒) KEIL 优化级别为0-3时
-------------------------*/
/*------------------------
最长延时时间255秒 晶振22.1184Mhz
若count=0,实际延时0.00000760秒
若count=1,实际延时1.00041667秒
若count=2,实际延时2.00082574秒
若count=3,实际延时3.00123481秒
若count=n,实际延时n + 0.00000760 + (0.00040907 * n)秒
//---------------------------------
void Delay_Sec(INT8U count)
{
INT16U i;
INT8U j;
for (j = 0; j < count; j++) {
for (i = 0; i < 47275; i++) {
;
}
}
}
-------------------------*/
==========================================================
========================
==========================
/*------------------------
软件延时(单位:毫秒) KEIL v8.02 优化级别 0-3好用
-------------------------*/
/*------------------------
最长延时时间255毫秒 晶振22.1184Mhz
若count=0,实际延时0.00760毫秒
若count=1,实际延时1.00966毫秒
若count=2,实际延时2.01172毫秒
若count=3,实际延时3.01378毫秒
若count=n,实际延时n + 0.00760 + (0.00206 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
INT8U i;
INT8U j;
for (j = 0; j < count; j++) {
for (i = 0; i < 229; i++) {
;
}
}
}
/*------------------------
软件延时(单位:毫秒) keil V8.02 优化级别 0-3好用
-------------------------*/
/*------------------------
最长延时时间255毫秒 晶振11.0592Mhz
若count=0,实际延时0.01519毫秒
若count=1,实际延时1.02105毫秒
若count=2,实际延时2.02691毫秒
若count=3,实际延时3.03277毫秒
若count=n,实际延时n + 0.01519 + (0.00586 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
INT8U i;
INT8U j;
for (j = 0; j < count; j++) {
for (i = 0; i < 114; i++) {
;
}
}
}
-------------------------*/
/*------------------------
最长延时时间255毫秒 晶振12Mhz (优化级别 0-3好用)
软件延时(单位:毫秒) (若count=0,实际延时0.014毫秒
若count=1,实际延时1.021毫秒
若count=2,实际延时2.028毫秒
若count=3,实际延时3.035毫秒
若count=4,实际延时4.042毫秒
若count=5,实际延时5.049毫秒)
若count=n,实际延时n + 0.014 + (0.007 * n)毫秒
//---------------------------------
void Delay_Ms(INT8U count)
{
INT8U i;
INT8U j;
for (j = 0; j < count; j++) {
for (i = 0; i < 124; i++) {
;
}
}
}
-------------------------*/
以上 这些函数 如果你将keil 优化级别设置为 4 或者是5 也是 可以用的 ,不过 就不是很精确了 !!
就是说我那些 计算 延时的公式 就不是非常非常准确了,不过也可以凑合着用 !! 就是那些 若 Count = ,,, 实际延时 是 ...........的 那些公式。
如果优化级别是6-9那么这些公式就非常不准确了!!!至于为什么不准确,你看看优化级别的说明就清楚了!!
=========================
再次强调 这些公式都是我自己推推导出来的 所以很有可能存在问题
这些公式的推导 (在优化级别0-3时 ) 考虑的是 count =0 到 255的这256种情况下的准确性 。而不仅仅是其中的一种情况。
======================================================
那么在所有的优化级别下的通用的 延时函数应该怎么写呢?
应该是用那个 _nop_(); 吧 这样编译器就不会优化掉这些_nop_();了。调用那个叫 strings。h ,差不多是这个名字。这个你肯定比我清楚 !
|
评分
-
查看全部评分
|