您的位置 首页 模拟

【单片机到嵌入式之路】序列之3:苦逼的CPU

软件平台硬件平台:单片机编译环境:keil二、苦逼的CPU【事故起因】:单片机是单核的,所以在做多线程问题的时候,我们要考虑的太多。但是大部分人都会让单片机一直工作

  软件渠道

  硬件渠道:单片机

  编译环境:keil

  二、苦逼的CPU

  【事端原因】:单片机是单核的,所以在做多线程问题的时分,咱们要考虑的太多。可是大部分人都会让单片机一向作业,比方while死循环,然后就诉苦单片机太简略了,只能点灯,其它的作业就不可了。

  【现场剖析】:1.单片机是单核的;

  2.做多线程,办法两种:a.上操作体系,b.仿操作体系;

  3.自己想开释单片机的CPU,可是格式有限,就怪单片机;

  4.要想马儿跑,有必要给马儿吃草。要想单片机多作业,有必要优化代码,多下功夫。

  【事例罗列】:单灯闪耀

  void main(void)

  {

  LED_Init(); //LED初始化

  while(1)

  {

  LED = ON; //LED亮

  Delay_Ms(1000); //延时1s

  LED = OFF; //LED灭

  Delay_Ms(1000); //延时1s

  }

  }

  【事例剖析】:单灯闪耀剖析

  声明几点:1.假如你只用单片机作为单灯闪耀,那么单片机就完全能够;

  2.假如你不想玩那么高档,那么单机这样也是OK的;

  3.假如你想玩高档的,那么必定不可。

  剖析:咋一看,程序没有什么问题,可是暗藏玄机。

  1.程序被死循环卡死;

  2.死循环里边便是一个发生2s周期的频率,那么灯便是2s闪耀一次;

  3.单片机就这样被你“降服”了。可是你这是把单片机浪费了。

  这是单片机CPU的苦啊,他是没有口啊,有口要谩骂的哦!O(∩_∩)O哈哈~

  三、单片机CPU的苦衷——请开释CPU

  1.硬件电路剖析

  

 

  用上面的电路来做剖析,当P1口为低电平的时分,LED灯才亮,高电平则灭。

  1.软件剖析

  由硬件能够知道,咱们能够经过宏界说来对接口进行简略的界说

  #define LED_Light P1 //LED灯端口

  #define LED_ON() LED_Light = 0x00 //LED灯亮

  #define LED_OFF() LED_Light = 0xFF //LED灯灭

  现在端口也界说好了,下面单片机要泣诉了。

  3.你误解了单片机

  单片机其实能够干许多活,成果你误解了。

  为了让单片机不白忙活咱们能够经过两种方法来完成LED灯闪耀:a.定时器中止,b.计时+标志位。

  A.定时器中止

  定时器中止咱们都知道,这儿就不说了,便是发生xms的中止就能够了。

  B.计时+标志位

  计时+标志位太有用了,这一下帮单片机洗清沉冤了。咱们只需发生一个对200ms的时刻,然后对该时刻进行计数到了5次,然后就清0该计数值,一起回转LED灯的状况即可。

  代码部分:

  unsigned int LedTimeCount = 0 ; //LED计数器

  unsigned char LedStatus = 0 ; //LED状况标志, 0表明亮,1表明平息

  /***************************************

  * 函数描绘:LED灯线程处理函数

  * 输入参数:No

  * 返 回 值:No

  * 说 明:经过标志位来完成LED的回转

  * 修正记载:

  ****************************************/

  void LEDThread_Process(void)

  {

  if(0 == LedStatus) //假如LED的状况为0,则点亮LED

  {

  LED_ON() ; //点亮LED灯

  }

  else //不然平息LED

  {

  LED_OFF() ;

  }

  }

  /***************************************

  * 函数描绘:计时和标志位函数

  * 输入参数:No

  * 返 回 值:No

  * 说 明:状况标志位改动

  * 修正记载:

  ****************************************/

  void LEDStatus_Change(void)

  {

  if(Sys_200MS) //体系200ms时标到

  {

  Sys_200MS = 0 ;

  LedTimeCount ++ ; //LED计数器加1

  if(LedTimeCount >= 5) //计数到达5,即1s到了,改动LED的状况。

  {

  LedTimeCount = 0 ;

  LedStatus = ! LedStatus;

  }

  }

  }

  /***************************************

  * 函数描绘:主函数

  * 输入参数:No

  * 返 回 值:No

  * 说 明:

  * 修正记载:

  ****************************************/

  void main(void)

  {

  while(1)

  {

  LEDThread_Process() ;

  LEDStatus_Change() ;

  }

  }

  经过上面的程序就能够开释单片机的CPU。由于LED灯亮灭是有标志位(LedStatus)来决议,而标志位由计数器(LedTimeCount)来决议,两个函数都没有劫持单片机的CPU,所以单片机的CPU是自在的。总算洗冤了。O(∩_∩)O哈哈~

  到此结束!!! 谢谢阅览,欢迎拍砖!!!!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/116507.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部