南京網(wǎng)站建設(shè)公司排名軟文營銷模板
文章目錄
- 課后練習(xí)解答
- 需求分解
- 增加KEY3控制代碼如下:
- 第一版代碼問題分析
- Tips:STC-ISP的設(shè)置
- Tips:定時(shí)器
- 實(shí)現(xiàn)完整電磁爐顯示功能的代碼
- 測試流程
- 總結(jié)
課后練習(xí)解答
增加按鍵3,按下后表示啟動(dòng),選擇的對應(yīng)的功能的LED持續(xù)閃爍,表示正在工作,且在工作的時(shí)候無法切換功能。
需求分解
- 1 增加按鍵3
#define KEY3 P34 //增加按鍵3
- 2 按下后表示啟動(dòng) 電平控制
- 3 工作狀態(tài)鎖定
表示正在工作,且在工作的時(shí)候無法切換功能。
該功能需要檢測的標(biāo)志位,且工作的時(shí)候無法進(jìn)行切換。
增加:bit Run_Now = 0; //0停止工作 1 開始工作。
增加KEY3控制代碼如下:
/*=======================按下按鍵3,執(zhí)行本段代碼=====================*/if (KEY3 == 0) //必須是按鍵按下才會執(zhí)行以下代碼,key3被點(diǎn)擊,燈在一閃一閃的時(shí)候,KEY3非按下模式{delay_ms(10); //防抖if (KEY3 == 0){while(KEY3 == 0); //等待按鍵松開,將要執(zhí)行按下蜂鳴if(Run_Mode > 0) //表示有模式,已經(jīng)選擇了模式,Run_Mode=0時(shí),未選擇模式,不執(zhí)行{BEEP = 0; //打開蜂鳴delay_ms(10); //延遲10msBEEP = 1; //關(guān)閉蜂鳴Run_Now = !Run_Now; //運(yùn)行和停止之間的切換}}}if( Run_Now = 1) //正在運(yùn)行{P2 = 0XFF; //全部熄滅delay_ms(200); //延遲200msP2 = ~(1<< (Run_Mode - 1)); //點(diǎn)亮這個(gè)燈delay_ms(200); //延遲200ms}else //停止運(yùn)行時(shí),沒有工作,燈和上面的一樣{P2 = ~(1<< (Run_Mode - 1));}
按動(dòng)KEY2后,0位LED持續(xù)閃爍,不能實(shí)現(xiàn)既定功能。
第一版代碼問題分析
與編譯提示的“ warning C137: constant in condition expression”有關(guān),這里應(yīng)該是判斷,不是賦值。修改。
調(diào)整后,可以控制狀態(tài)等閃動(dòng),但是接著按KEY2,移動(dòng)不受影響,有邏輯錯(cuò)誤,繼續(xù)排查。
即工作的時(shí)候,功能無法切換沒有實(shí)現(xiàn)。工作狀態(tài),變量Run_Now為1,而KEY2能切換的前提是Run_Now狀態(tài)為0,所以增加條件限制:“if(Run_Now == 0) //Run_Now狀態(tài)為0(未工作)時(shí)才能切換”。
另外,代碼KEY2松開后才能執(zhí)行,實(shí)際運(yùn)行中,按下后有沒有松開不太確定,改成按下就執(zhí)行,等到它松開,調(diào)整while循環(huán)的位置到最后:while(KEY3 == 0); //等待按鍵松開,將要執(zhí)行按下蜂鳴
KEY1,KEY2也可根據(jù)調(diào)整。
注意:if …else可看做是一個(gè)整體,中間不能加入其他保留字,如while等。
編譯,寫入開發(fā)板,下載成功,功能正常。
Tips:STC-ISP的設(shè)置
可保存,方便調(diào)用:
按鍵需要按的稍微久一點(diǎn),原因后期課程會分析,講定時(shí)器的時(shí)候優(yōu)化。
Tips:定時(shí)器
參考鏈接:單片機(jī)定時(shí)器工作原理是什么單片機(jī)定時(shí)器工作方式有哪些
使用單片機(jī)時(shí)經(jīng)常用到一個(gè)元件,那就是單片機(jī)定時(shí)器,單片機(jī)定時(shí)器的作用主要是在發(fā)生軟件故障時(shí),通過使器件復(fù)位(如果軟件未將器件清零)將單片機(jī)復(fù)位,也可以用于將器件從休眠或空閑模式喚醒,還能用做精確延時(shí)處理,常被應(yīng)用于時(shí)間控制、程序延時(shí)、對外部時(shí)間計(jì)數(shù)和檢測等工作范圍內(nèi)。那么單片機(jī)定時(shí)器原理是什么呢?
單片機(jī)定時(shí)器,其實(shí)質(zhì)是一個(gè)計(jì)數(shù)器,脈沖每一次下降沿,計(jì)數(shù)寄存器數(shù)值將加1,如果計(jì)數(shù)的脈沖是來源于單片機(jī)內(nèi)部的晶振,由于其周期極為準(zhǔn)確,則稱為定時(shí)器;如果計(jì)數(shù)的脈沖來源于單片機(jī)外部的引腳,由于其周期一般不準(zhǔn)確,則稱為計(jì)數(shù)器。
單片機(jī)定時(shí)器工作方式有哪些
單片機(jī)定時(shí)器的工作方式有很多,大致可分為以下幾種:1、方式0
方式0為13位計(jì)數(shù),由TLO的低5位(高3位未用)和THO的8位組成TLO的低5位溢出時(shí)向THO進(jìn)位,THO溢出時(shí),置位TCON中的TFO標(biāo)志,向CPU發(fā)出中斷請求。
2、方式1
方式1的計(jì)數(shù)位數(shù)是16位,由TLO(TL1)作為低8位、THO(TH1 )作為高8位,組成了16位加1計(jì)數(shù)器。3、方式2
方式2為自動(dòng)重裝初值的8位計(jì)數(shù)方式。在方式2下,當(dāng)定時(shí)器計(jì)滿255( FFH)溢出時(shí),CPU自動(dòng)把TH的值裝入TL中,不需用戶干預(yù),比較適合于用作較精確的脈沖信號發(fā)生器。
4、方式3
方式3只適用于定時(shí)器/計(jì)數(shù)器TO,定時(shí)器T1方式3時(shí)相當(dāng)于TR1=0,停止計(jì)數(shù)。方式3將TO分成為兩個(gè)獨(dú)立的8位計(jì)數(shù)器TLO和THO。
實(shí)現(xiàn)完整電磁爐顯示功能的代碼
void Test(void) //電磁爐的功能
{if (KEY1 == 0) //開關(guān)機(jī)鍵{delay_ms(1000); //長按1s開機(jī)if (KEY1 == 0){
/*=======================還沒有開機(jī)的情況下,執(zhí)行本段代碼=====================*/if (Run_Flag == 0) //表示還沒有開機(jī){Run_Flag = 1; //開機(jī)變量改為1,表示已經(jīng)開機(jī)BEEP = 0; //打開蜂鳴delay_ms(10); //延遲10msBEEP = 1; //關(guān)閉蜂鳴P40 = 0; //打開了LED總電源P2 = 0X00; //全部點(diǎn)亮delay_ms(300); //延遲200msP2 = 0XFF; //全部關(guān)閉}else{Run_Flag = 0; //標(biāo)記已關(guān)機(jī)BEEP = 0; //打開蜂鳴(提醒)delay_ms(10); //延遲10msBEEP = 1; //關(guān)閉蜂鳴P2 = 0XFF; //狀態(tài)指示全部關(guān)閉P40 = 1; //關(guān)閉總電源LEDRun_Mode = 0; //模式清零Run_Now = 0; //運(yùn)行狀態(tài)清零(改成停止)}while(KEY1 == 0); //按鈕按下,先執(zhí)行并等待按鈕松開}}
/*=======================按下按鍵2,執(zhí)行本段代碼=====================*/if (KEY2 == 0 && Run_Flag == 1 ) //切換模式,且處于開機(jī)狀態(tài),狀態(tài)選擇鍵有效{delay_ms(10); //防抖if (KEY2 == 0){if (Run_Now == 0) //Run_Now狀態(tài)為0(未工作)時(shí)才能切換{BEEP = 0; //打開蜂鳴delay_ms(10); //延遲10msBEEP = 1; //關(guān)閉蜂鳴Run_Mode++; //每次按下,模式+1(移至下一個(gè)led)if (Run_Mode > 8) //如果模式大于8,回到模式1Run_Mode = 1; //Run_Mode超過8后清零,回到第一個(gè)燈//錯(cuò)誤寫法,執(zhí)行結(jié)果是8個(gè)燈中僅1個(gè)不亮//燈是低電平點(diǎn)亮,1<< Run_Mode,即1<<1,左移以后為0000 0010,僅1個(gè)LED滅,繼續(xù)左移,尾部補(bǔ)0,還是只有1個(gè)LED滅//解決方法:RunMode先減1,再左移,最后全部取反。這里用~為全取反。而!是位取反。//P2 = 0XFX; P6<< 1 + 1; 也可以實(shí)現(xiàn)P2 = ~(1<< (Run_Mode - 1));}while(KEY2 == 0); //按鈕按下,并等待按鈕松開}}
/*=======================按下按鍵3,執(zhí)行本段代碼=====================*/if (KEY3 == 0) //必須是按鍵按下才會執(zhí)行以下代碼,key3被點(diǎn)擊,燈在一閃一閃的時(shí)候,KEY3非按下模式{delay_ms(10); //防抖if (KEY3 == 0){if(Run_Mode > 0 ) //表示有模式,已經(jīng)選擇了模式且處在開機(jī)狀態(tài)下,Run_Mode=0時(shí),未選擇模式,不執(zhí)行{BEEP = 0; //打開蜂鳴delay_ms(10); //延遲10msBEEP = 1; //關(guān)閉蜂鳴Run_Now = !Run_Now; //運(yùn)行和停止之間的切換}while(KEY3 == 0); //等待按鍵松開,先執(zhí)行}}if( Run_Now == 1) //正在運(yùn)行{P2 = 0XFF; //全部熄滅delay_ms(200); //延遲200msP2 = ~(1<< (Run_Mode - 1)); //點(diǎn)亮這個(gè)燈delay_ms(200); //延遲200ms}else //停止運(yùn)行時(shí),沒有工作,燈和上面的一樣{P2 = ~(1<< (Run_Mode - 1));}
}
測試流程
先KEY1開機(jī)蜂鳴一聲LED點(diǎn)亮
切換模式KEY2(需處于開機(jī)狀態(tài)下)
按一下KEY3,當(dāng)前LED閃(在當(dāng)前模式下運(yùn)行),運(yùn)行狀態(tài)下,切換模式短按長按都失效
再按一下KEY3,LED停閃(運(yùn)行停止),可以切換模式。
后期學(xué)完定時(shí)器的章節(jié),再解決按鍵反應(yīng)遲鈍的問題?;蛘邔W(xué)完數(shù)碼管以后,既可以修理一下。
總結(jié)
厘清正常、簡單的邏輯。瘋狂的在用if和else做一個(gè)判斷。