![]() |
用延時差不多就可以了吧 |
#include<reg51.h> sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3; sbit P1_4=P1^4; void delay(unsigned char i) //延時函數 { unsigned char j; while(i--) for(j=0;j<220;j++); } void main() { if (P1_1==0) { P1_2==0; delay(50); //11s后 b亮 P1_3==0; delay(68); //15s后 c亮 P1_4==0; } else { P1_4==1; delay(17); //17s后 b滅 P1_3==1; delay(55); //12s后 a滅 P1_2==1; } } |
樓主程序可以判斷按鍵按下,,然后執行燈的延時,時間到,b燈亮,然后再延時,c燈亮,最后在依次熄滅 |
計時器中斷一般最多毫秒級,你還需要一個變量記錄中斷次數,在中斷函數中累計這個數。達到相應次數反轉IO輸出,并處理記錄中斷次數變量即可。 |
P1_4==1; delay(17); //17s后 b滅 P1_3==1; delay(55); //12s后 a滅 P1_2==1; 樓主這個應該是用賦值(=),不要用(==) |
個人感覺使用定時器會讓代碼更簡潔 |
uint timer0_count=0; //計數次數,由于定時器的本質是計數器 void timer0_init(void) //定時器0初始化 { TMOD=0x01; //設置定時器0的定時方式 TH0=(65536-50000)/256; //設置初值,相當于每50毫秒進入一次中斷函數 TL0=(65536-50000)/256; EA=1; //開啟總中斷 ET0=1; //開啟定時器0中斷 TR0=1; //啟動定時器0中斷 } void timer0_interrupt(void)interrupt 1 //定時器0的中斷函數 { count++; //每加一次代表過了一個50毫秒 if(count==220) //代表過了11秒 { //然后打開LED2; } //之后的15秒鐘的自己就OK了吧 } |
wutong746 發表于 2020-11-9 20:42 網上搜例程很多的。外部中斷 |
你先把中斷調好就行了 ,和你delay的函數差不多 |
樓主你會用定時器嗎? |
#include<reg51.h> sbit P1_1=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3; sbit P1_4=P1^4; void delay(unsigned char i) //延時函數 { unsigned char j; while(i--) for(j=0;j<220;j++); } void main() { if (P1_1==0) { P1_2==0; delay(50); //11s后 b亮 P1_3==0; delay(68); //15s后 c亮 P1_4==0; } else { P1_4==1; delay(17); //17s后 b滅 P1_3==1; delay(55); //12s后 a滅 P1_2==1; } } |
我自己寫了一份程序但是希望用到中斷函數,所以求教啦 |