蓝桥杯蜂鸣器和继电器你不知道的秘密
其實(shí)是我一直沒(méi)有搞明白的一件事請(qǐng):
問(wèn)題描述,按鍵控制蜂鳴器和繼電器。但是每當(dāng)我打開(kāi)蜂鳴器,繼電器總會(huì)開(kāi),打開(kāi)繼電器,蜂鳴器總會(huì)響。蜂鳴器一響,腦子直接暈頭轉(zhuǎn)向。我把我的代碼貼出來(lái):
void buzz_dis() {P0 |= 0x40;latch(5); }void buzz_init() {P0 &= 0xbf;latch(5); }void jdq_init() {P0 &= 0x7f;latch(5); }void jdq_dis() {P0 |= 0x10;latch(5); }///蜂鳴器是P06口控制的,繼電器是P04口控制的,我在這里其實(shí)也犯錯(cuò)誤了,記錄下來(lái)加深印象大家有沒(méi)有發(fā)現(xiàn)這個(gè)問(wèn)題所在呢?
問(wèn)題分析:為什么按位操作在這里不行了呢,既然不是引腳搞錯(cuò)了,那還有什么干擾了程序呢?我思來(lái)想去,看著這滿(mǎn)滿(mǎn)一屏幕的bug,突發(fā)奇想,可能是主函數(shù)里還有對(duì)P0口的操作,果然,我既有數(shù)碼管顯示操作P0還有l(wèi)ed顯示也操作P0。所以問(wèn)題的根已經(jīng)找到了。再細(xì)細(xì)思考一下,我又發(fā)現(xiàn)數(shù)碼管對(duì)P0的操作影響真的有這么大嗎?理論上是可能存在這種情況的,但是我這種情況是必然的呢?原來(lái)是我每次按鍵按下還要操作led。這一前一后對(duì)P0的操作才造成了這種情況。
問(wèn)題解決:其實(shí)我們放棄按位操作這種方式就可以了。例如:
void buzz_dis() {P0 = 0x40;latch(5); }void buzz_init() {P0 = 0;latch(5); }void motor_init() {P0 = 0;latch(5); }void motor_dis() {P0 = 0x10;latch(5); }我們直接對(duì)P0賦值,那么相當(dāng)于每次賦值時(shí)還將其他口進(jìn)行了初始化。但這種方法還有一點(diǎn)缺陷就是兩個(gè)器件不能同時(shí)工作。其實(shí)我們還有解決辦法,那就是增加一個(gè)中間變量,如下:
void buzz_dis() {P0_buff |= 0x40;P0 = P0_buff;latch(5); }void buzz_init() {P0_buff &= 0xbf;P0 = P0_buff;latch(5); }void jdq_init() {P0_buff &= 0x7f;P0 = P0_buff;latch(5); }void jdq_dis() {P0_buff|= 0x10;P0 = P0_buff;latch(5); }這種方法就可以解決這個(gè)問(wèn)題了。
事后反思:其實(shí)這個(gè)問(wèn)題挺隱蔽的,如果是考試現(xiàn)場(chǎng)我的個(gè)人能力可能不足以讓我解決。所以對(duì)我和大家都有警醒作用,即使再簡(jiǎn)單的模塊,我們稍微不注意細(xì)節(jié)邏輯都有可能造成一個(gè)功能的缺失。寫(xiě)下這篇文章既為加深印象,也為和各位共勉!
感謝閱讀,歡迎三連!!!!!!!
也歡迎觀(guān)看我的B站主頁(yè):
宿管大爺211的個(gè)人空間_嗶哩嗶哩_bilibilihttps://space.bilibili.com/630519178?spm_id_from=333.1007.0.0希望大家多多三連!!!!!!!!!!!!!!!!!!!!!!!
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯蜂鸣器和继电器你不知道的秘密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java编写一元二次方程
- 下一篇: 南京大学2020管理科学与工程考研