延时程序_免费下载.doc_第1页
延时程序_免费下载.doc_第2页
延时程序_免费下载.doc_第3页
延时程序_免费下载.doc_第4页
延时程序_免费下载.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

延时程序_免费下载.doc.doc 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C51精确延时,绝对精确!有些特殊的应用会用到比较精确的延时(比如DS18B20等),而C不像汇编,延时精准度不好算。本人经过反复调试,对照KEIL编译后的汇编源文件,得出了以下几条精确延时的语句(绝对精确!本人已通过实际测试),今天贴上来,希望对需要的朋友有所帮助。 bit LED=P10; / 定义一个管脚(延时测试用) unsigned int i = 3; / 注意i,j的数据类型, unsigned char j = 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管脚状态,当LED if( (-i)=0 ) break;/ 为低时或者到了10*i+2个机器周期时跳出延时 /- 例如18b20的复位函数(12M晶振): /* / 函数功能:18B20复位 / 入口参数:无 / 出口参数:unsigned char x: 0:成功 1:失败 /* unsigned char ow_reset(void) unsigned char x=0;/ 12M晶振 1个机器周期为1us DQ = 1; / DQ复位 j = 10;while(-j);/ 稍做延时(延时10*2+1=21个机器周期,21us) DQ = 0; / 单片机将DQ拉低 j = 85;while(j-);/ 精确延时(大于480us) 85*6+1=511us DQ = 1; / 拉高总线 j = 10;while(j-);/ 精确延时10*6+1=61us x = DQ; / 稍做延时后, return x; / 如果x=0则初始化成功 x=1则初始化失败 j = 25;while(j-);/ 精确延时25*6+1=151us /*再如红外解码程序: (先说传统红外解码的弊端: 程序中用了while(IR_IO);while(!IR_IO);这样的死循环,如果管脚一直处于一种状态,就会一直执行while,造成“死机”现象。当然这种情况很少,但我们也的考虑到。而用以下程序则不会,在规定的时间内没有正确的电平信号就会返回主程序,这样就不会出现“死机”了) /*外部中断0* void int0(void) interrupt 0 unsigned char i,j; unsigned int count = 800; /-8.5ms低电平引导码- while( -count ) if( IR_IO=1 ) return; / 在小于8ms内出现高电平,返回 count = 100; / 延时1ms while( !IR_IO ) / 等待高电平 if( (-count)=0 )return; / 在9ms内未出现高电平,返回 /-4.5ms高电平引导码- count = 410; / 延时4.1ms while( -count ) / . if( IR_IO=0 ) return; / 在4.1ms内出现低电平,返回 count = 50; / 延时0.5ms while( IR_IO ) / 等待低电平 if( (-count)=0 )return; / 在4.7ms内未出现低电平,返回 /- /-4个数据码- for( j=0;j4;j+ ) for( i=0;i8;i+ ) IR_dataj = 1; / 装入数据 count = 60; / 延时0.6ms while( !IR_IO ) / 等待高电平 if( (-count)=0 ) return;/ 在0.6ms内未出现高电平,返回 count = 40; / 低电平结束,继续 while( -count ) / 延时0.4ms if( IR_IO=0 ) return;/ 在0.4ms内出现低电平,返回 count = 100; / 延时1.4ms while( IR_IO ) / 检测IO状态 if( (-count)=0 ) / 等待1.4ms到来 / 在1.4ms内都是高电平 IR_dataj |= 1; / 两个单位高电平,为数据1 break; / 跳出循环 count = 20; /

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论