延时程序.doc

上传人:asd****56 文档编号:70331451 上传时间:2023-01-19 格式:DOC 页数:6 大小:33.50KB
返回 下载 相关 举报
延时程序.doc_第1页
第1页 / 共6页
延时程序.doc_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《延时程序.doc》由会员分享,可在线阅读,更多相关《延时程序.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、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 );

2、 / 延时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个机器周

3、期时跳出延时 /- 例如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; / 拉高

4、总线 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* v

5、oid 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 )

6、 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(

7、 -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; / 延时0.2ms while( IR_IO ) / 等待低电平跳出 if( (-count)=0 ) return; / 0.2ms内未出现低电平,返回 /- flag_IR = 1; / 置位红外接收成功标志

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁