就是用單片機操作續電器,續電器控制風扇。
有一個2。4G雷達,有運動就開風扇,開的時間用延時控制。
中斷的作用是改變延時的時候,從而改變風扇運行的時候。
#include <STC8G.h>
#include <intrins.h>
#define u16 unsigned int
#define u8 unsigned char
sbit leda = P5^5;
sbit led = P5^4;
sbit fan = P3^3;
const unsigned int data abc[8]={0xea60,0xa410,0x8ca0,0x7530,0x4650,0x1770,0x0bb80,0x05dc};
u16 t;
u8 xu;
void Delay10ms(void) //@11.0592MHz
{
unsigned char data i, j;
_nop_();_nop_();
i = 144;
j = 157;
do
{
while (--j);
} while (--i);
}
void dd(unsigned int tttt){
while(tttt--)Delay10ms();
}
void init(){
IT0=1;
EX0=1;
EA=1;
}
void int0() interrupt 0
{
u8 i;
if(!P32){
for(i=0;i<xu;i++){
led=1;dd(20);
led=0;dd(20);
}
t=abc[xu++];
xu &=0x07;
}
}
void main(){
u16 tt;
P5M0 &= ~0x30; //P54雙向口,P55高阻
P5M1 = (P5M1 & ~0x10) | 0x20;
P3M0 = (P3M0 & ~0x04) | 0x08; //P33 推挽
P3M1 &= ~0x0c;
P3PU |= 0x04; //P3.2上拉開打
init();
led=0;
while(1){
if(leda)tt=t; //5min
led=leda;
if(tt){tt--;fan=1;Delay10ms();} else {fan=0;}
}
}
這樣基本就沒問題的。就是中斷重入的問題。開始LED閃爍明顯不對。現在一切正常了。 |