看看硬件工程师是如何写代码的(一),巧妙的程序!

目前本人已经不再写代码了,只是想把自己走过的弯路,踩过的坑分享出来,希望更多的小伙伴能看到,少走弯路,仅供参考哈!

回想起来核桃已经很多年没有敲代码了,这么多年一直从事硬件工程师这个岗位,相比于软件的ABCD,我更倾向于原理图的设计与PCB,喜欢折腾,喜欢松香的味道。

但是,刚毕业那会,要想得到更多的机会,只能硬着头皮学硬件和软件,大概有一年左右的时间吧,都是一个人兼顾软件和硬件,自己画板,自己调代码!

说实话,只有自己写代码调试自己的板子,才能更加清楚的认识到自己的板卡还有哪些可以优化地方,对于以后从事硬件工程师的岗位益处良多!

我们先来看一段51单片机的点灯程序,如下:

void main(void)

{ 

while(1)

  {

     LED=0;

     delayms(100);

     LED=1;

    delayms(100);

    }

}

程序是非常简单的,相信很多小伙伴刚开始学的时候都是这样写的,程序一样是可以正常运行的,那这段程序有什么问题呢?

可以看的出来,整个大循环里面除了LED=0和LED=1外,剩下的就是 delayms(100);这个延时函数,是一直让CPU处于等待的状态,啥事都干不了,一直空耗着CPU的资源。

思考问题:如果只是为了点亮一颗LED,这样写是没问题的,但是实际的项目中不可能用一个CPU啥事都不干,就为了点灯,我相信没有哪个老板肯让你这么浪费,所以我们首要做的就是:

把CPU释放出来,哪怕让它一遍一遍的扫描有什么任务可以执行,也不要让它一直在空等待!

那该如何实现?

具体思路:

从上面的程序可以知道,延时的时间是delayms(100),也就是100ms,那我们可以为系统加入一个1ms的基准时间,然后再对这个基准时间进行计数100次,达到100次后,清理该计数值,再对LED的状态进行转换即可!

大概程序如下:

#include

sbit LED=P1^0;   //定义LED管脚

bit 1mscriterion=0;//1ms时间基准

unsigned int 1mscount=0;//1ms基准时间计数变量

unsigned char LEDsign=0;//LED状态变量,0为点亮,1为熄灭

void Time0int(void)

{ 

   TMOD &= 0xf0 ;

   TMOD |= 0x01 ; //定时器 0 工作方式 1

   TH0 = 0xfc ; //定时器初始值

   TL0 = 0x66 ;

   TR0 = 1 ;

   ET0 = 1 ;

}

void LEDcontrol()

{

    if(LEDsign==0)

       {

          LED=0;//LED点亮

       }

    else

      {

         LED=1;//LED熄灭

      }

}

void LEDStateful Switch(void)

{

   if(1mscriterion)  //1ms基准时间到

    {

        1mscriterion=0;先清零

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

        if(1mscount>=100) //计数达到100,证明100ms已经到了

         {

             1mscount=0;//一定要先清零

              LEDsign=!LEDsign;//LED状态取反

          }

     }

}

void main(void)

{

 Time0int();

  EA=1;

  while(1)

   {

      LEDcontrol();

      LEDStateful Switch();

    }

}

void Time01ms(void)interrupt 1

{

   TH0=0xfc;  //重新赋值

   TL0=0x66;

   1mscriterion=1; //1ms基准时间到

} 

由于核桃很长时间没有写代码了,有不对的地方望小伙伴们能指出来!

还有核桃不是专业写代码的,以上仅供参考哈!

好了,这章就先写到这吧!我们下一章接着唠!

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 6
收藏 7
关注 91
成为作者 赚取收益
全部留言
0/200
成为第一个和作者交流的人吧