钻石会员
主题
回帖0
积分11063
阅读权限50
注册时间2009-12-25
最后登录1970-1-1
在线时间 小时
|
/******************************************************************************/
/* delay_12Mhz.h */
/* */
/* 8比特的延时函数 */
/******************************************************************************/
#define delay_12Mhz_1us {_nop_();}
#define delay_12Mhz_2us {_nop_();_nop_();}
#define delay_12Mhz_3us {_nop_();_nop_();_nop_();}
#define delay_12Mhz_4us {_nop_();_nop_();_nop_();_nop_();}
#define delay_12Mhz_5us {_nop_();_nop_();_nop_();_nop_();_nop_();}
连续使用_nop_();_nop_();会造成不可预料的情况,我实际只使用一个_nop_();
//该独立函数过程占用5字节
//12Mhz晶振下,8或9级优化,调用一次占用3字节代码
//无参数调用;
//(n*2+5)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_n ( ) {
unsigned char n=1;
while ( --n ) {};
}
//**********
//Set_12Mhz_10us(n)函数库开始 ;一共占用12字节
//void Set_12Mhz_10us_ ( unsigned char n );
//用法 Set_12Mhz_10us (n);n=[1--256],延时范围(10--2560ms);调用一次5字节;
//当n=1时,误差+1us,n=[2--256],误差=0;
#define Set_12Mhz_10us(n) {Set_12Mhz_10us_(n-1);}
//该独立函数过程占用12字节
//12Mhz晶振下,8或9级优化,调用一次占用5字节代码
//(n*(8+2)+10)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_10us_ ( unsigned char n ) {
for (; n > 0; n--) {
delay_12Mhz_2us;
}
}
//Set_12Mhz_10us(n)函数库结束
/***********/
因为c51不能方便的精确延时,我以前弄的延时库,理论上,在12mhz晶振下,能从1us,精确延时到1s。
用的方式是:添加强制编译参数【#pragma ot(9,speed)//强制指定9级优化】。
然后在编译器的运行仿真,看函数实际运行了几个时钟周期。然后通过补时,凑时间到1s之内。
思路就是这样,自己封装好常用的延时时间。
弄完之后,我再也不用c51单片机了....
/*
//该独立函数过程占用3字节
//12Mhz晶振下,8或9级优化,调用一次占用5字节代码
//(n*2+5)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_2us ( unsigned char n ) {
while ( --n ) {};
}
//该独立函数过程占用10字节!!!
//12Mhz晶振下,8或9级优化,调用一次占用5字节代码
//(n*8+10)us;256>n>0
#pragma ot(9,speed)//强制指定9级优化
void Set_12Mhz_8us ( unsigned char n ) {
for (; n > 0; n--) {};
}
*/
|
|