軟件平臺 硬件平臺:單片機 編譯環(huán)境:keil 二、苦逼的CPU 【事故起因】:單片機是單核的,所以在做多線程問題的時候,我們要考慮的太多。但是大部分人都會讓單片機一直工作,比如while死循環(huán),然后就抱怨單片機太簡單了,只能點燈,其它的事情就不行了。 【現場分析】:1.單片機是單核的; 2.做多線程,方法兩種:a.上操作系統,b.仿操作系統; 3.自己想釋放單片機的CPU,但是格局有限,就怪單片機; 4.要想馬兒跑,必須給馬兒吃草。要想單片機多工作,必須優(yōu)化代碼,多下功夫。 【案例列舉】:單燈閃爍 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.程序被死循環(huán)卡死; 2.死循環(huán)里面就是一個產生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燈的狀態(tài)即可。 代碼部分: unsigned int LedTimeCount = 0 ; //LED計數器 unsigned char LedStatus = 0 ; //LED狀態(tài)標志, 0表示亮,1表示熄滅 /*************************************** * 函數描述:LED燈線程處理函數 * 輸入參數:No * 返 回 值:No * 說 明:通過標志位來實現LED的反轉 * 修改記錄: ****************************************/ void LEDThread_Process(void) { if(0 == LedStatus) //如果LED的狀態(tài)為0,則點亮LED { LED_ON() ; //點亮LED燈 } else //否則熄滅LED { LED_OFF() ; } } /*************************************** * 函數描述:計時和標志位函數 * 輸入參數:No * 返 回 值:No * 說 明:狀態(tài)標志位改變 * 修改記錄: ****************************************/ void LEDStatus_Change(void) { if(Sys_200MS) //系統200ms時標到 { Sys_200MS = 0 ; LedTimeCount ++ ; //LED計數器加1 if(LedTimeCount >= 5) //計數達到5,即1s到了,改變LED的狀態(tài)。 { LedTimeCount = 0 ; LedStatus = ! LedStatus; } } } /*************************************** * 函數描述:主函數 * 輸入參數:No * 返 回 值:No * 說 明: * 修改記錄: ****************************************/ void main(void) { while(1) { LEDThread_Process() ; LEDStatus_Change() ; } } 通過上面的程序就可以釋放單片機的CPU。因為LED燈亮滅是有標志位(LedStatus)來決定,而標志位由計數器(LedTimeCount)來決定,兩個函數都沒有綁架單片機的CPU,所以單片機的CPU是自由的。終于洗冤了。O(∩_∩)O哈哈~ 到此結束!!! 謝謝閱讀,歡迎拍磚!!!! |