|
編好了一個控制流水燈的程序,思路是在沒有開關(guān)閉合的時候P1的燈是流水燈狀態(tài),如果開關(guān)閉合,控制P1處的燈以兩種不同的模式交替點亮,
這個程序在keil的編譯中沒有錯誤,但是在Proteus仿真中,我發(fā)現(xiàn)P1的燈并不會對按鍵有反應(yīng),始終保持流水燈的狀態(tài),就算是長時間保持開關(guān)閉合,也并不會發(fā)生P1口的燈改變閃爍模式的情況,這個問題困擾了我很長時間,我認(rèn)為既然開關(guān)按下,在if中就可以根據(jù)P3.3,P3.2口的狀態(tài)進(jìn)行相應(yīng)的函數(shù)調(diào)用,但是在仿真中這沒有發(fā)生,誰知道是為什么嗎?
KI{MNBUZ`94APT3XV__R8XY.png (95.09 KB, 下載次數(shù): 42)
下載附件
2018-4-10 14:57 上傳
KI{MNBUZ`94APT3XV__R8XY.png (95.09 KB, 下載次數(shù): 42)
下載附件
從這個視頻中可以看出,P1的燈對開關(guān)沒有反應(yīng)
2018-4-10 15:17 上傳
單片機(jī)源程序如下:
- #include<reg51.h>//頭文件
- #include<intrins.h>
- #define uchar unsigned char
- void delay(unsigned int i)//控制燈亮?xí)r間的延時函數(shù)
- {
- 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);循環(huán)左移
- delay(500);//保持燈亮
- if(temp_0==0)//判斷P3.2口的電位大小
- light_0();//如果是低電平,執(zhí)行燈亮模式一的函數(shù)
- if(temp_1==0)//檢查P3.3口的電平
- light_1();//如果P3.3口是低電平,執(zhí)行燈亮模式二的函數(shù)
-
- }
- }
復(fù)制代碼
|
|