单片机的延时闪烁程序

来源:本站
导读:目前正在解读《单片机的延时闪烁程序》的相关信息,《单片机的延时闪烁程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《单片机的延时闪烁程序》的详细说明。
简介:我刚刚看了一些关于单片机的知识,第一个就是关于led灯闪烁的,led灯的发光原理就是加电压,它有一个限流电阻,一个二极管,接地。不同的板子led之间的不同就是改变家的电压还是改变接地。我使用的led灯改变的是接地,即板子上已经给了电压,而我则可以改变接地电压,所以如果我给接地电压高的话,二极管就不会亮,我给低,二极管就亮。

而要想实现闪烁,那就是不断的给led的接地口赋高电平,低电平,这样不断循环,就实现了闪烁。

现在的关键就是停顿时间的实现,比如我想实现1s内的闪烁,就是有0.5s亮,有0.5s灭。这时就要延时函数了,因为你一闪一灭是很快的,必须加延时才能,实现这种功能。

延时函数可以分为好几类,比如你自己写个延时函数如

void delay_long(unsigned int uiDelayLong)

{

unsigned int i;

unsigned int j;

for(i=0;i

{

for(j=0;j<500;j++) //内嵌循环的空指令数量

{

; //一个分号相当于执行一条空语句

}

}

}

这就是一个延时函数,然后在主程序中你运行这个函数,就会延时了。看起来好像很不错的实现了目标。可是这样会有一个后果,在执行延时函数的过程中,别的任务就不能处理了,就只能完成这一个任务,这当然就不好了。

下面就有了另外一种方法,这种方法是利用主程序中的循环次数来实现延时。原理很简单,因为单片机永远是出于死循环中的,那你实现一个循环需要一定的时间吧,而且基本每次你实现循环的时间也差不了多少,那这样我就可以利用了,我统计你运行的次数,再乘上你每次运行的时间,这样不就能得到一段时间了吗?然后利用这段时间进行延时,不就能达到目标了吗?这种方法的确很棒。

但真的完美吗?不足的就是每次循环究竟需要多长时间,这个需要你不断的估计,你只要往程序中加点内容,那循环时间就好变化,然后就要修改统计次数,这个过程需要一遍一遍的做,效率不高,很烦,对于后期很不好。

人总是最求完美的,虽然永远做不到。下面就有人有了更好的方法了,非常完美。

这个方法跟上面的原理有点类似,也是通过知道运行时间,然后通过统计运行次数来得到一段时间用于循环。想想单片机中有一个部分它的运行时间是固定的,想到了吗?没错,定时器啊!

我们可以通过设置定时器来设定我们所说的运行时间,而且比较不错。TMOD的工作方式设为0X01,就是定时器1模式下的工作方式1。然后高八位TH0=0xf8,低八位TL0=0x2f,其实就是计数值为2000,65535-2000=63535,63535的十六进制值就是f82f。这样利用上面的原理,定时器每隔一段时间就会产生中断,然后在服务程序中设置一个变量,每次中断都自加一次,当达到我们设定的值时,就实现灯亮还是灯灭,然后变量清0,再继续下去,就能实现led灯的闪烁了。

以上就是关于led灯闪烁的知识,硬件上原理很简单,软件上给出了三种方法实现闪烁。三种方法是不断推进的,原理或相同或不同,我是有所悟了。

原理抽象为主动实现,被动实现。后面两个可以认为是接力打力,但第一种方法其实也是,cpu每运行一个指令是多长时间,然后我让它运行多少次,这两个相乘就得到我要的时间。而到了第二个时,也是每次运行时间相乘运行次数得到我要的时间,只是这次它的每次运行时间没有刻意去得到,而是利用了程序中的死循环。到了第三个,也是这样,每次运行时间利用了定时器,这样更加精确了,这到和第一种方法有点像了,只是没浪费cpu,看来不浪费cpu就是好方法了。本质上延时都是运行时间相乘运行次数。

提醒:《单片机的延时闪烁程序》最后刷新时间 2024-03-14 01:09:37,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《单片机的延时闪烁程序》该内容的真实性请自行鉴别。