从最简单的led灯闪烁想到的

从最简单的led灯闪烁想到的

ID:20362706

大小:40.00 KB

页数:5页

时间:2018-10-09

从最简单的led灯闪烁想到的_第1页
从最简单的led灯闪烁想到的_第2页
从最简单的led灯闪烁想到的_第3页
从最简单的led灯闪烁想到的_第4页
从最简单的led灯闪烁想到的_第5页
资源描述:

《从最简单的led灯闪烁想到的》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、从最简单的LED灯闪烁想到的:前段时间在某论坛看到一篇文章,写的很好,里面很多思路都是我们刚进入单片机领域的菜鸟很少想到很少用的。因此在原作者想法基础上归纳总结一下。在市面上众多的单片机学习资料中,最基础的实验无疑于点亮LED了,即控制单片机的I/O的电平的变化。就是这简单的不得了的程序能引起我们什么思考呢?如同如下实例代码一般:void main(){While(1){  LED = ON ;DelayMs(500) ;LED = OFF ;DelayMs(500) ;}}程序很简单,从它的结构可以看出,LED

2、先点亮500MS,然后熄灭500MS,如此循环下去,形成的效果就是LED以1HZ的频率进行闪烁。下面让我们分析上面的程序有没有什么问题。新手看来,简单到刚入门都会的LED点亮程序好像很正常的啊,能有什么问题呢?这个时候我们应该换一个思路去想了。试想,整个程序除了控制LED = ON ; LED = OFF; 这两条语句外,其余的时间,全消耗在了DelayMs(500)这两个函数上。而在实际应用系统中是没有哪个系统只闪烁一只LED就其它什么事情都不做了的。因此,在这里我们要想办法,把CPU解放出来,让它不要白白浪费

3、500MS的延时等待时间。这里就是重点宁可让它一遍又一遍的扫描看有哪些任务需要执行,也不要让它停留在某个地方空转消耗CPU时间。这往往就是新手不在乎并且忽略的问题。从上面我们可以总结出:(1)无论什么时候我们都要以实际应用的角度去考虑程序的编写。(2)无论什么时候都不要让CPU白白浪费等待,尤其是延时(超过1MS)这样的地方。下面开始来编写程序。首先,肯定是头文件和一些必要的声明定义;#include#defineucharunsignedchar#defineuintunsignedint然后

4、为亮灭常数定义一个宏,由硬件连接图可以,当P0输出为低电平时候LED亮,P0输出为高电平时,LED熄灭。 #define LED_ON()    LED = 0x00  //所有LED亮 #define LED_OFF()   LED = 0xff  //所有LED熄灭下面到了重点了,究竟该如何释放CPU,避免其做延时空等待这样的事情呢。很简单,我们为系统产生一个1MS的时标。假定LED需要亮500MS,熄灭500MS,那么我们可以对这个1MS的时标进行计数,当这个计数值达到500时候,清零该计数值,同时把LED

5、的状态改变。uintLedTimeCount = 0 ;//LED计数器uchar LedState = 0 ;//LED状态标志, 0表示亮,1表示熄灭void LedProcess(void){if(LedState==0)  //如果LED的状态为亮,则点亮LED{LED_ON() ;}else                //否则熄灭LED{ LED_OFF() ;}}void LedStateChange(void){   if(SystemTime1Ms)            //系统1MS时标到

6、{ SystemTime1Ms = 0 ;LedTimeCount++ ;      //LED计数器加1if(LedTimeCount >= 500)  //计数达到500,即500MS到了,改变LED的状态。{LedTimeCount = 0 ;       LedState  = ! g_u8LedState ;} }}上面有一个变量没有提到,就是SystemTime1Ms 。这个变量可以定义为位变量或者是其它变量,在我们的定时器中断函数中对其置位,其它函数使用该变量后,应该对其复位(清0) 。我们的主函数

7、就可以写成如下形式(示意代码)void main(void){while(1){LedProcess() ;LedStateChange() ;}}因为LED的亮或者灭依赖于LED状态变量(LedState)的改变,而状态变量的改变,又依赖于LED计数器的计数值(LedTimeCount ,只有计数值达到一定后,状态变量才改变)所以,两个函数都没有堵塞CPU的地方。让我们来从头到尾分析一遍整个程序的流程。程序首先执行LedProcess()函数,因为LedState的初始值为0(见定义)所以LED被点亮,然后退出

8、 LedProcess()函数,执行下一个函数LedStateChange()。在函数LedStateChange()内部首先判断1MS的系统时标是否到了,如果没有到就直接退出函数,如果到了,就把时标清0以便下一个时标消息的到来,同时对LED计数器加1,然后再判断LED计数器是否到达我们预先想要的值500,如果没有,则退出函数,如果有,对计数器清0,以便下次重新计数,同时

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。