編好了一個控制流水燈的程序,思路是在沒有開關閉合的時候P1的燈是流水燈狀態,如果開關閉合,控制P1處的燈以兩種不同的模式交替點亮,
這個程序在keil的編譯中沒有錯誤,但是在Proteus仿真中,我發現P1的燈并不會對按鍵有反應,始終保持流水燈的狀態,就算是長時間保持開關閉合,也并不會發生P1口的燈改變閃爍模式的情況,這個問題困擾了我很長時間,我認為既然開關按下,在if中就可以根據P3.3,P3.2口的狀態進行相應的函數調用,但是在仿真中這沒有發生,誰知道是為什么嗎?
KI{MNBUZ`94APT3XV__R8XY.png (95.09 KB, 下載次數: 42)
下載附件
2018-4-10 14:57 上傳
KI{MNBUZ`94APT3XV__R8XY.png (95.09 KB, 下載次數: 42)
下載附件
從這個視頻中可以看出,P1的燈對開關沒有反應
2018-4-10 15:17 上傳
單片機源程序如下:
- #include<reg51.h>//頭文件
- #include<intrins.h>
- #define uchar unsigned char
- void delay(unsigned int i)//控制燈亮時間的延時函數
- {
- uchar t;
- while(i--)
- {
- for(t=0;t<120;t++);
- }
- }
- void light_0()//控制燈亮的第一種模式
- {
- uchar m;
- for(m=0;m<5;m++)
- {
- P1=0x0f;//P1口高四位燈亮
- delay(500);
- P1=0xf0;//p1口第四位燈亮
- delay(500);
- }
- }
- void light_1()//燈亮的第二種模式
- {
- uchar n;
- for(n=0;n<5;n++)
- {
- P1=0xff;//P1口全為高電平,燈滅
- delay(500);
- P1=0x00;//P1口全為低電平,燈亮
- delay(500);
- }
- }
- void main()//主程序
- {
- uchar temp_0,temp_1;
- P1=0xfe;
- while(1)
- {
- temp_0=P3&0x40;//將P3.2口的電位值賦給temp_0
- temp_1=P3&0x80;//將P3.3口的電位值賦給temp_1
- P1=_crol_(P1,1);循環左移
- delay(500);//保持燈亮
- if(temp_0==0)//判斷P3.2口的電位大小
- light_0();//如果是低電平,執行燈亮模式一的函數
- if(temp_1==0)//檢查P3.3口的電平
- light_1();//如果P3.3口是低電平,執行燈亮模式二的函數
-
- }
- }
復制代碼
|