目前本人已經(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è)寫代碼的,以上僅供參考哈!
好了,這章就先寫到這吧!我們下一章接著嘮!