十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这个是预编译的写法,符合#if后面的条件后编译器才会编译,否则不会占用FALSH空间,
成都网站建设哪家好,找成都创新互联公司!专注于网页设计、成都网站建设、微信开发、成都小程序开发、集团成都企业网站定制等服务项目。核心团队均拥有互联网行业多年经验,服务众多知名企业客户;涵盖的客户类型包括:成都雨棚定制等众多领域,积累了大量丰富的经验,同时也获得了客户的一致赞许!
#if 相当于 if
#elif 相当于 else
#endif 表示上面的判断结束。
你这个程序的意思是当晶振频率是那个值则编译那个for循环,来达到不同频率都可以使用这一个函数来达到更精确的延时。
首先你要知道一个指令周期是几秒
算法是1/(晶振频率除以12)
然后你要知道循环究竟执行了几个指令周期
你可以用keil里在线反汇编命令看看你的循环编译成机器语言后到底是几个指令周期
这样就知道了延迟时间
当然你取近似值也可以的
比如
for(i=0,i255,i++){x=2}
这里x=2是一个指令周期
而执行了255次
假如你的晶振是12MHZ的
则你执行一个指令周期是1us
255次是0.255ms
C语言的延迟函数一般是利用无意义程序运行来控制时间从而达到延时的目的
举个例子:
for(i=0;ix;i++)
for(j=0;j120;j++);
这是延时x毫秒的for循环语句。
值得注意的是记得最后的;一定得记得写。
单片机的C语言关于延时函数主要有两种
一种是用for循环,通过单片机执行空指令达到延时的目的
如:
for(i=0;i100;i++)
{
;
}
这个简单的语句会执行100次空指令
每一次指令的时间可以大概确定
因此这个是最简单的延时函数
第二种是通过定时器的方式来实现
定时器是通过对单片机的晶振进行计数
然后在定时器中断服务函数里面实现定时时间的计算及设置
51单片机的定时器0中断服务函数为
void
time0()
interrupt
1
{
...
}
一般单片机在c语言中很难得到精确的延时,所以一般对时间要求高的都用计时器中断来做了。如果时间要求不严格可以用for循环来做,你可以实际测试一下,把时间延时到大概一秒左右,然后烧进单片机里运行,比如一个灯亮灯灭的程序,看着灯计数,同时用秒表计时,几个几十次后取平均值就能知道大概时间了。