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