www.whkt.net > 单片机C语言延时1s解读

单片机C语言延时1s解读

双重循环,共有循环 1000 * 1000 = 一百万遍.每一遍,如果是1us,才能是延时约1s.但是,晶振是12MHz,一条汇编的指令就至少是1us,C语言的语句,就要更多.所以至少有4、5秒,是很正常的.

用for语句弄空运转不就好了么?

void main() //主程序 { program_init(); //调用程序初始化子程序 unsigned char oldSecond; oldSecond = second; while(1) //开始 { if(second >= oldSecond+1) //延时一秒 { oldSecond = second; _clrwdt(); //清除看门狗计数器 time_display(); //调用显示子程序 } } } //主程序结束

#include<reg52.h> char count; void main() { EA=1; ET1=1; TMOD=0x10; TH1=(65536-50000)/256; //12M晶振完成一个机器周期是1微秒 TL1=(65536-50000)%256; //那么50毫秒就50000个计数 TR1=1; while(1) { if(count==20) //判断是否为20次 { count=0; } } } void tim1() interrupt 3 //定时器中断 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; count++; }

如果用C51来编写延时程序,一般都用循环语句: 例: void delay(unsigned int num) { unsigned int i; for (i=0; i<num; i++) { ; // 程序什么都不做 } } 原理很简单,程序什么都不做,只是不段的比较,直到比较完,这样就起到延时的作用了.至于

void delay1s(void) //误差 0us{ unsigned char a,b,c; for(c=167;c>0;c--) for(b=171;b>0;b--) for(a=16;a>0;a--); _nop_(); //if Keil,require use intrins.h}

void delay(uint ms) // 毫秒级延时(AT89C52 @ 11.0592MHz) { uint ti; while(ms--) { for(ti=0;ti } }

用定时器1啊,12m晶振的话最大可以延时65点几ms,然后你定个初值让它定时50ms,再用一个变量累计定时函数执行的次数有20次,就是1秒了

一般单片机在c语言中很难得到精确的延时,所以一般对时间要求高的都用计时器中断来做了.如果时间要求不严格可以用for循环来做,你可以实际测试一下,把时间延时到大概一秒左右,然后烧进单片机里运行,比如一个灯亮灯灭的程序,看着灯计数,同时用秒表计时,几个几十次后取平均值就能知道大概时间了.

unsigned long TimeTickCount;//1ms计时器 void Timer0Configuration(); void Delay1ms(unsigned int a); void main() { while(1) { Delay1ms(1000);//1s延时;} } void Delay1ms(unsigned int a)//0~65535 { unsigned long b;//0~0xffffffff b = TimeTickCount

友情链接:alloyfurniture.com | 369-e.com | 6769.net | dbpj.net | zxsg.net | 网站地图

All rights reserved Powered by www.whkt.net

copyright ©right 2010-2021。
www.whkt.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com