性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

核桃設(shè)計(jì)分享
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
看看硬件工程師是如何寫代碼的(一),巧妙的程序!
看看硬件工程師是如何寫代碼的(二),榨干CPU的性能
作者動態(tài) 更多
電子專業(yè)基礎(chǔ)英語新手必備,建議收藏!
9小時(shí)前
牛馬搬運(yùn)工——“DMA”
2天前
示波器的供電接口的“地”到底要不要拔掉?
5天前
DC-DC電路設(shè)計(jì)中加的“自舉電容”到底有何講究?
1星期前
實(shí)際項(xiàng)目中,貼片電容X5R和X7R到底用哪一種?
1星期前

看看硬件工程師是如何寫代碼的(一),巧妙的程序!

目前本人已經(jīng)不再寫代碼了,只是想把自己走過的彎路,踩過的坑分享出來,希望更多的小伙伴能看到,少走彎路,僅供參考哈!

回想起來核桃已經(jīng)很多年沒有敲代碼了,這么多年一直從事硬件工程師這個(gè)崗位,相比于軟件的ABCD,我更傾向于原理圖的設(shè)計(jì)與PCB,喜歡折騰,喜歡松香的味道。

但是,剛畢業(yè)那會,要想得到更多的機(jī)會,只能硬著頭皮學(xué)硬件和軟件,大概有一年左右的時(shí)間吧,都是一個(gè)人兼顧軟件和硬件,自己畫板,自己調(diào)代碼!

說實(shí)話,只有自己寫代碼調(diào)試自己的板子,才能更加清楚的認(rèn)識到自己的板卡還有哪些可以優(yōu)化地方,對于以后從事硬件工程師的崗位益處良多!

我們先來看一段51單片機(jī)的點(diǎn)燈程序,如下:

void main(void)

{ 

while(1)

  {

     LED=0;

     delayms(100);

     LED=1;

    delayms(100);

    }

}

程序是非常簡單的,相信很多小伙伴剛開始學(xué)的時(shí)候都是這樣寫的,程序一樣是可以正常運(yùn)行的,那這段程序有什么問題呢?

可以看的出來,整個(gè)大循環(huán)里面除了LED=0和LED=1外,剩下的就是 delayms(100);這個(gè)延時(shí)函數(shù),是一直讓CPU處于等待的狀態(tài),啥事都干不了,一直空耗著CPU的資源。

思考問題:如果只是為了點(diǎn)亮一顆LED,這樣寫是沒問題的,但是實(shí)際的項(xiàng)目中不可能用一個(gè)CPU啥事都不干,就為了點(diǎn)燈,我相信沒有哪個(gè)老板肯讓你這么浪費(fèi),所以我們首要做的就是:

把CPU釋放出來,哪怕讓它一遍一遍的掃描有什么任務(wù)可以執(zhí)行,也不要讓它一直在空等待!

那該如何實(shí)現(xiàn)?

具體思路:

從上面的程序可以知道,延時(shí)的時(shí)間是delayms(100),也就是100ms,那我們可以為系統(tǒng)加入一個(gè)1ms的基準(zhǔn)時(shí)間,然后再對這個(gè)基準(zhǔn)時(shí)間進(jìn)行計(jì)數(shù)100次,達(dá)到100次后,清理該計(jì)數(shù)值,再對LED的狀態(tài)進(jìn)行轉(zhuǎn)換即可!

大概程序如下:

#include

sbit LED=P1^0;   //定義LED管腳

bit 1mscriterion=0;//1ms時(shí)間基準(zhǔn)

unsigned int 1mscount=0;//1ms基準(zhǔn)時(shí)間計(jì)數(shù)變量

unsigned char LEDsign=0;//LED狀態(tài)變量,0為點(diǎn)亮,1為熄滅

void Time0int(void)

{ 

   TMOD &= 0xf0 ;

   TMOD |= 0x01 ; //定時(shí)器 0 工作方式 1

   TH0 = 0xfc ; //定時(shí)器初始值

   TL0 = 0x66 ;

   TR0 = 1 ;

   ET0 = 1 ;

}

void LEDcontrol()

{

    if(LEDsign==0)

       {

          LED=0;//LED點(diǎn)亮

       }

    else

      {

         LED=1;//LED熄滅

      }

}

void LEDStateful Switch(void)

{

   if(1mscriterion)  //1ms基準(zhǔn)時(shí)間到

    {

        1mscriterion=0;先清零

        1mscount++;//LED計(jì)數(shù)器加1

        if(1mscount>=100) //計(jì)數(shù)達(dá)到100,證明100ms已經(jīng)到了

         {

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

              LEDsign=!LEDsign;//LED狀態(tài)取反

          }

     }

}

void main(void)

{

 Time0int();

  EA=1;

  while(1)

   {

      LEDcontrol();

      LEDStateful Switch();

    }

}

void Time01ms(void)interrupt 1

{

   TH0=0xfc;  //重新賦值

   TL0=0x66;

   1mscriterion=1; //1ms基準(zhǔn)時(shí)間到

} 

由于核桃很長時(shí)間沒有寫代碼了,有不對的地方望小伙伴們能指出來!

還有核桃不是專業(yè)寫代碼的,以上僅供參考哈!

好了,這章就先寫到這吧!我們下一章接著嘮!

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 6
收藏 7
關(guān)注 168
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧