單片機(jī)日常系列!今天我在修改定時(shí)器定時(shí)功能...
慎用標(biāo)志位(本人單片機(jī)菜鳥(niǎo),高手請(qǐng)高抬貴手,歡迎指點(diǎn)!~)
這里說(shuō)的是合理謹(jǐn)慎的運(yùn)用標(biāo)志位,否則很容易出現(xiàn)錯(cuò)誤,也很難debug。
今天工作的時(shí)候,修改定時(shí)器定時(shí)功能的時(shí)候,得出的經(jīng)驗(yàn),這里說(shuō)的與具體的單片機(jī)無(wú)關(guān),是個(gè)通用的想法。
以我今天修改的為例:
PIC單片機(jī)的兩個(gè)I/O引腳控制著兩個(gè)LED燈(分別為藍(lán)燈和紅燈,這里以LED代替,避免涉及公司里的內(nèi)容)的亮和滅。
要求是
藍(lán)燈每5s亮一次,大概亮100ms;
紅燈每隔10s亮一次,每次亮100ms;
紅燈和藍(lán)燈盡量錯(cuò)開(kāi)。
我的思路是,
定義一個(gè)10s的時(shí)間軸,用定時(shí)器來(lái)實(shí)現(xiàn),在2.5秒和7.5秒時(shí)刻點(diǎn)亮藍(lán)燈,在10s時(shí)刻點(diǎn)亮紅燈。
有一個(gè)全局變量cnt。
定義一個(gè)全局變量times = 0。
[cpp] view plain copy print?
0 2.5s 5s 7.5s 10s
|-------------|===|-------------|-------------|===|-------------|+++|
blue blue red
|----times=0------|----------times=1----------|----times=0-----------|
我理所當(dāng)然的就
每10ms進(jìn)一次中斷
if((cnt > 250)&&(times == 0))
{
times = 1;
blue_led_light_flag = 1;
blue_led_on = 1;
}
if((cnt > 750)&&(times == 1))
{
times = 0;
blue_led_light_flag = 1;
blue_led_on = 1;
}
if(cnt > 1000)
{
red_led_light_flag = 1;
red_led_on = 1;
}
if((cnt > 250)&&(times == 0)) 理所當(dāng)然的以為這樣是可以的,且不知這里有一個(gè)bug,因?yàn)樵?.5-10s的時(shí)候,也符合這個(gè)條件的。。。這樣出來(lái)的系哦啊過(guò)就不是上面所想的
我們應(yīng)該改為if((cnt > 250)&&(times == 0)&&(cnt < 750))這樣才是可以的。。。
編輯:admin 最后修改時(shí)間:2018-05-18