C语言精确延时方法.docx

上传人:scccc 文档编号:14769476 上传时间:2022-02-19 格式:DOCX 页数:6 大小:10.82KB
返回 下载 相关 举报
C语言精确延时方法.docx_第1页
第1页 / 共6页
C语言精确延时方法.docx_第2页
第2页 / 共6页
C语言精确延时方法.docx_第3页
第3页 / 共6页
C语言精确延时方法.docx_第4页
第4页 / 共6页
C语言精确延时方法.docx_第5页
第5页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C语言精确延时方法.docx》由会员分享,可在线阅读,更多相关《C语言精确延时方法.docx(6页珍藏版)》请在三一文库上搜索。

1、C语言精确延时方法有些特殊的应用会用到比较精确的延时(比如DS18B20等),而C不像汇编,延时精准度不好算。本人经过反复调试,对照KEIL 编译后的汇编源文件,得出了以下几条精确延时的语句 (绝对精确!本人已通过实际测试),今天贴上来,希望对需要的朋友有所帮助。sbit LED = P1A0; /定义一个管脚 ( 延时测试用 )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个机器周期内检测到LED管脚为低电平时if( LED=0 ) break; /跳出延时i = 5;while( LED )/ 每隔10个机器周期检测一次 LED管脚 状态,当 LEDif( (-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 个机器周期为 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 =

4、 10; while(j-);/精确延时 10*6+1=61usx = DQ; / 稍做延时后 ,return x; / 如果 x=0 则初始化成功 x=1 则初始化失败 j = 25; while(j-);/精确延时 25*6+1=151us/* 再如红外解码程序:(先说传统红外解码的弊端:程序中用了 while(IR_IO);while(!IR_IO); 这样的死循 环,如果管脚一直处于一种状态,就会一直执行 while , 造成 “ 死机 ” 现象。当然这种情况很少,但 我们也的考虑到。而用以下程序则不会,在规定的时间 内没有正确的电平信号就会返回主程序,这样就不

5、会出 现 “ 死机 ” 了)/* 外部中断C* void int0(void) interrupt 0unsigned char i,j;unsigned int count = 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(

6、 -count ) / .if( IR_IO=0 ) return; / 在 4.1ms 内出现低电平,返 回count = 50; /延时 0.5mswhile( 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.6mswhile( !IR_IO ) /等待高电平if( (-count)=0 ) return; /在 0.6ms 内未出现高电平,返回count = 40;

7、/低电平结束,继续while( -count ) /延时 0.4msif( IR_IO=0 ) return; /在 0.4ms 内出现低电平,返回count = 100; /延时 1.4mswhile( IR_IO ) / 检测 IO 状态 if( (-count)=0 ) /等待 1.4ms 到来 / 在 1.4ms 内都是高电平IR_dataj |= 1; /两个单位高电平 , 为数据 1break; / 跳出循环count = 20; /延时 0.2mswhile( IR_IO ) / 等待低电平跳出if( (-count)=0 ) return; / 0.2ms 内未出现低电平, 返回/ flag_IR = 1; / 置位红外接收成功标志

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1