目前本人已經不再寫代碼了,只是想把自己走過的彎路,踩過的坑分享出來,希望更多的小伙伴能看到,少走彎路,僅供參考哈!
回想起來核桃已經很多年沒有敲代碼了,這么多年一直從事硬件工程師這個崗位,相比于軟件的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基準時間到
}
由于核桃很長時間沒有寫代碼了,有不對的地方望小伙伴們能指出來!
還有核桃不是專業寫代碼的,以上僅供參考哈!
好了,這章就先寫到這吧!我們下一章接著嘮!