就是用单片机操作续电器,续电器控制风扇。
有一个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闪烁明显不对。现在一切正常了。 |