如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
C51精确延时,绝对精确!有些特殊的应用会用到比较精确的延时(比如DS18B20等),而C不像汇编,延时精准度不好算。本人经过反复调试,对照KEIL编译后的汇编源文件,得出了以下几条精确延时的语句(绝对精确!本人已通过实际测试),今天贴上来,希望对需要的朋友有所帮助。bitLED=P1^0;//定义一个管脚(延时测试用)unsignedinti=3;//注意i,j的数据类型,unsignedcharj=3;//不同的数据类型延时有很大不同//-----------------各种精确延时语句-----------------------------------while((i--)!=1);//延时10*i个机器周期i=10;while(--i);//延时8*i+2个机器周期i=10;while(i--);//延时(i+1)*9+2个机器周期j=5;while(--j);//延时2*j+1个机器周期j=5;while(j--);//延时(j+1)*6+1个机器周期i=5;while(--i)//延时i*10+2个机器周期,在i*10+2个机器周期if(LED==0)break;//内检测到LED管脚为低电平时跳出延时i=5;while(LED)//每隔10个机器周期检测一次LED管脚状态,当LEDif((--i)==0)break;//为低时或者到了10*i+2个机器周期时跳出延时//--------------------------------------------------------------------例如18b20的复位函数(12M晶振)://***********************************************************************//函数功能:18B20复位//入口参数:无//出口参数:unsignedcharx:0:成功1:失败//***********************************************************************unsignedcharow_reset(void){unsignedcharx=0;//12M晶振1个机器周期为1usDQ=1;//DQ复位j=10;while(--j);//稍做延时(延时10*2+1=21个机器周期,21us)DQ=0;//单片机将DQ拉低j=85;while(j--);//精确延时(大于480us)85*6+1=511usDQ=1;//拉高总线j=10;while(j--);//精确延时10*6+1=61usx=DQ;//稍做延时后,returnx;//如果x=0则初始化成功x=1则初始化失败j=25;while(j--);//精确延时25*6+1=151us}//*********************************************************************************再如红外解码程序:(先说传统红外解码的弊端:程序中用了while(IR_IO);while(!IR_IO);这样的死循环,如果管脚一直处于一种状态,就会一直执行while,造成“死机”现象。当然这种情况很少,但我们也的考虑到。而用以下程序则不会,在规定的时间内没有正确的电平信号就会返回主程序,这样就不会出现“死机”了)//***************************外部中断0*******************************voidint0(void)interrupt0{unsignedchari,j;unsignedintcount=800;//--------------8.5ms低电平引导码-------------------------------------while(--count)if(IR_IO==1)return;//在小于8ms内出现高电平,返回count=100;//延时1mswhile(!IR_IO)//等待高电平if((--count)==0)return;//在9ms内未出现高电平,返回//-------------4.5ms高电平引导码------------------------------------count=410;//延时4.1mswhile(--count)//...if(IR_IO==0)return;//在4.1ms内出现低电平,返回count=50;//延时0.5mswhile(IR_IO)//等待低电平if((--count)==0)return;//在4