/***********************************************************
15F104E应用之五:频率检测控制,带延时输出
P3.2是输入端口,可以是光电,霍尔等等,,
***********************************************************/
#include
#include
#define Fosc (11059200) //Board cyrstal
sbit shuiwei = P3^4;//
sbit baojin = P3^5;//
sbit dcf = P3^0; //
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//主循环相关变量的定义
unsigned int TCNT0 = 0;
//基准定时器的初始化声明
void Timer0_Init(void);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//元器件采样脉冲变量定义
unsigned int OneSecondCounter = 0;
unsigned int pulse_counter = 0;
volatile unsigned int current_speed = 0;
//采用下降沿计脉冲,初始化函数声明
void INT0_Init(void);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//引脚定义
sbit Pump_Relay = P3^1;
//相关变量定义
unsigned int speed_lower_limit =0;
unsigned char speed_lower_time = 0;
unsigned char lower_limit_continue_second = 0;
//相关函数声明
void Pump_Handler(void);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Main Function
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main(void){
Timer0_Init();
INT0_Init();
speed_lower_limit = 3; //频率设定值,修改此处
speed_lower_time = 3; //延时输出时间设定,修改此处
while(1){
while(TCNT0<4608){ //5ms base time
TCNT0 = TH0*256 + TL0;
};
TCNT0 = 0;//clear
TH0 = 0x00;
TL0 = 0x00;
Pump_Handler();
}
}
void Timer0_Init(void){
TMOD = (TMOD&0xf0)| 0x01; //Timer0, Time mode, 16-bit.
TH0 = 0x00; //Load Initial value
TL0 = 0x00;
TR0 = 1; //Stratup Timer0
}
//中断服务子程序
void INT0_Handler(void) interrupt IE0_VECTOR using 0{
++pulse_counter;
}
void INT0_Init(void){
EX0 = 1; //Enable External Interrupt 0
IT0 = 1; //下降沿有效
EA = 1; //Enable
}
void Pump_Handler(void){
if(++OneSecondCounter==200){
OneSecondCounter = 0;
current_speed = pulse_counter;
pulse_counter = 0;
//下限的工作条件处理
if( (current_speed>speed_lower_limit) ||(current_speed==speed_lower_limit) ){
++lower_limit_continue_second;
if(lower_limit_continue_second
Pump_Relay = 1;
}
else if(lower_limit_continue_second==speed_lower_time){
Pump_Relay = 0;
}
else{
if(lower_limit_continue_second>200){ //就是保证继电器正常工作.
lower_limit_continue_second = speed_lower_time;
}
Pump_Relay = 0;
}
}
else{//if(current_speed
Pump_Relay = 1;
lower_limit_continue_second = 1; //下限的工作.
}
}
if (shuiwei==1&&baojin==1)
{
dcf=0;
}
else
{
dcf=1;
}
}