一、软件设计:
1、本章所要实现的功能是:点亮D1指示灯,即让P2.0管脚输出一个低电平。完成后可再控制D1指示灯闪烁,即间隔一段时间点亮和熄灭D1指示灯。那么如何让LED进行闪烁,那么只需要循环的让这个·低指针先亮一会,再熄灭,让它不断地循环,这样一亮一灭,这个指示灯就在闪烁了,这里就有一个延时的问题,那如何来产生这个延时?
2、我们知道单片机,它执行每条代码指令,它都是需要时间的,那在前面介绍C语言的时候,我们讲解过这个循环语句,因此我们只需要编写一个循环的函数,让CPU不干其他的事,专门用来循环运行那些可延时的一个功能。
3、根据我们人的肉眼余晖效应,时间不能太短,太短,我们会无法观察到LED的一个状态变化,所以我们这里来写一下我们的这个LED闪烁的这个程序:
(1)在原有的点亮第一个LED灯的代码程序上,我们最主要的就是编写一个延时函数,那延时函数怎么写。前面我们学C语言基础的时候,我们说过函数它的一个结构,首先,返回值的一个类型,那这里延时函数仅仅只是一个延时,没有返回值,所以是个void类型。
(2)那函数名可以自己定义,只要符合变量定义的一个规范就可以了,通常我们在给函数或者变量进行定义名字的时候,我们通常要有一些能代表它功能,不要随便想一个拼音名字或者什么意义都没有的英文字符在这里,那大家在后续维护我们的这个程序的时候,就不知道这个东西是干什么的。
(3)那既然我们现在编写的这个函数是实现延时的一个功能,所以这里我就用了一个delay延时,我这里写的的是延时10微秒,为什么10微秒,等一下我们会给大家看一下,这里先写一下,这个延时函数,我们这个函数有一个入口的一个参数,也就是形式参数,通过这个形式参数,我们再调用这个延时函数的时候,我们在传入一个值给我们的函数,让它传入的值的不同,延时就不同,这样就给我们使用这个函数,增加了一个灵活性。
(4)然后呢,我们变量的名字,就命名为10 muse。
(5)函数的结构就是这样的,通过函数的这个名称类型,还有函数的参数,然后一个大括号,大括号后面没有分号,然后呢,这个函数的内容,我们是实现一个延时,我们通过循环,刚才也说了,我这个循环,啥都不干,我在这里让它一直的减减,那么就是说我这里个参数,我在调用函数的时候,假入我给这个变量传入一个十,那么十进来之后,这里是不是十减减,那么十变成了九,那我这个是一个循环,那九又减一次,一直减到0,当减到零的时候,这个循环条件是不是假,一变成了假,那这个循环体是不是直接退出来,循环体里面,我们什么都不做,就是一个空语句,空语句,然后呢,就直接退出while循环,退出while循环往下执行,是不是结束了我们的函数,这是我们函数运行的一个过程,这就是我们延时的一个函数。
(6)为什么我们这里定义成10微秒,这是根据我们的这个仿真出来的一个时间,它大概就是10微秒,也就是说当传入Ten__us=1时,大约延时10us,我们现在用的delay函数,它都是一个大概的时间,因为循环执行的时间,不是很精确,它对应的记忆指令呢,不是说就固定的,它有可能是10微秒,当我们自己通过循环来占用CPU,起到一个延时效果的时候,这种延时是不精确的,如果你要去搞一个精确的延时,那需要我们后面学习定时器,我们才能做到这种精确的延时,等我们后面学习了就会,大家先在这里大概的一个延时就可以了,因为我们现在是让LED闪烁,我们只要大概的一个时间,我们肉眼能分辨出来就可以了,不需要那么精确.
(7)现在我们来介绍一下,为什么是10微秒,等一下我们要调用的时候,我会带大家进行一个软件的仿真,查看一下它大概的时间。这里我们现在是让D1指示灯点亮了,那我现在是让LED有一个闪烁,要让它闪烁,是不是在循环体里面,我们要让它英文的一个符号,中文是不行的,还有中文的这个,假设我们现在出现一个中文的这个分号,这里会报错。
(8)让LED闪烁,我们就让这个LED进行一个低电平,这是点亮。点亮一会呢,我就延一个时间,这就是我们为什么在前面要定义一个参数,就是因为这样,我们调用的时候,我们根据传入的参数值不同,让它的延时时间不同,这里我延时,一个延时50000,随便先打上一个值,等一下我们来看一下大概的这个时间,然后呢,点亮一会,再让它熄灭。熄灭的话是不是让它输出高电平,然后熄灭再让它延时一会,刚才我们说了这个调用函数的时候,大概是10个微秒,所以10个微秒的话,我们算一下,10个微秒,那我这里是500就相当于5毫秒,再加两个零就是500毫秒,500毫秒换算到我们实际仿真出来的一个时间大概就是450毫秒。这就实现了我们LED的一个闪烁。
4、所以我们编译之后,程序没有错误,没有警告。这样一来,我们这个就可以将我们的这个hex文件下载到我们的开发板里面看一下我们的D1指示灯有没有闪烁,闪烁的时间是不是比较快或者比较慢,如果是快,那我们就调节一下这个延时,只要在我们的这个范围内。