/******************project N0801*******************/
//******** completion time 2023-2-13 by bobo********/
//**************************************************/
// ________________
// VDD-| 1 8 |-VSS
// GP5-| 2 27 |-GP0/DAT
// GP4-| 3 26 |-GP1/CLK
// GP3/RMCLR--| 4 25 |-GP2
// |________________|
// PIC12F509
//**************************************************/
#include <pic.h>
//芯片配置字
__CONFIG(0xFEA); //參考:《PIC12F509數據手冊》第41頁 配置位 GP3引角配置成輸入引角
#define _XTAL_FREQ 4000000 //系統時鐘4M,定義這個是為了方便調用延時函數 __delay_ms(500); //延時500MS
#define uchar unsigned char
#define Green_LED GP1//綠燈
#define Red_LED GP0//紅燈
#define U3 GP2//U3信號
#define U1 GP5//U1信號
#define RELAY GP4//繼電器
#define Key GP3//KEY鍵
void Scanf_U1(void);//U1檢測函數
void Scanf_U3(void);//U3檢測函數
void Key_Scan(void);//按鍵掃描
void Flashing_10seconds(void);//閃燈10S
void Slow_flashing_LED(void);//慢閃循環
void Slow_flashing_LED_GreenAndRed(void);//雙燈慢閃循環
void working_fun(void);//正常工作
void Flashing_10seconds_turn_on(void);//開機閃燈10S
volatile unsigned int Time_cunt=0;//缺水保護計數
volatile unsigned int U1_Flag=0;//U1狀態
volatile unsigned int U3_Flag=0;//U3狀態
volatile unsigned int Key_Flag=0;//按鍵狀態
volatile unsigned int Kaiji_Flag=0;//開機閃燈10S標志
void main(void)
{
__delay_ms(100); //上電延時100毫秒,以保證電源可靠供電
OPTION=0x03;//T0CS=0;選擇定時器模式(16分頻),讓GP2為普通IO,允許內部弱上拉(GP3開關按鍵需要上拉)
TRIS=0X2C;//將GP0 GP1 GP4設置成輸出 GP2 GP5 和GP3設置成輸入狀態
GPIO=0x08;
TMR0=0x00;
OSCCAL=0x00; //校準頻率(中心頻率)
Time_cunt=0;
RELAY=0;
Green_LED=0;
Red_LED=0;
Key=0;
Scanf_U1();
Scanf_U3();
U1_Flag=0;
Time_cunt=0;
Flashing_10seconds_turn_on();//開機快閃10S
while(1)
{
if((U3_Flag==1&&Kaiji_Flag==0)||Key_Flag==0||U1_Flag==2||Time_cunt==15000||Time_cunt==75000||Time_cunt==225000||Time_cunt==900000)
{
Flashing_10seconds();//快閃10S
}
if(U1_Flag==1)
{
working_fun();
}
else if(U3_Flag==1&&U1_Flag==1)
{
working_fun();
}
else if(U3_Flag==1)
{
Slow_flashing_LED_GreenAndRed();
}
else if(U3_Flag==2||U1_Flag==0)
{
Slow_flashing_LED();
}
}
}
void Scanf_U1(void)//U1檢測
{
if(U1==0)//磁鐵靠近U1時,正常工作(出水口打開時)
{
if(U1_Flag!=1)
{
U1_Flag=1;
}
}else
{
if(U1_Flag==1)
{
U1_Flag=2;
}
}
}
void Scanf_U3(void)//U3檢測
{
if(U3==0)
{
if(U3_Flag!=1)
{
U3_Flag=1;
}
}else
{
if(U3_Flag==1)
{
U3_Flag=2;
}
}
}
void Flashing_10seconds(void)//快閃10S函數
{
RELAY=1;
Red_LED=0;
unsigned int k=0,j=0;
while(1)
{
if(++k>10)
{
k=0;
Green_LED=!Green_LED;
}
while(TMR0<250); //250*16=4MS/
TMR0=0;
Scanf_U1();
Scanf_U3();
Key_Scan();
j++;
if(j>2500)
{
if(U1_Flag==2)//如果U1_Flag==2 10S后讓它變成0
{
U1_Flag=0;
}
break;
}
if(U3_Flag==1&&U1_Flag==1)
{
break;
}
}
}
void Flashing_10seconds_turn_on(void)//開機閃燈10S函數
{
RELAY=1;
Red_LED=0;
unsigned int k=0,j=0;
Kaiji_Flag=1;
while(1)
{
if(++k>10)
{
k=0;
Green_LED=!Green_LED;
}
while(TMR0<250); //250*16=4MS/
TMR0=0;
Scanf_U1();
Scanf_U3();
Key_Scan();
j++;
if(j>2500||Key_Flag==0)
{
break;
}
}
}
void Slow_flashing_LED(void)//慢閃LED函數
{
RELAY=0;
Red_LED=0;
//Kaiji_Flag=0;
unsigned int k=0;
Time_cunt=0;//待機狀態把缺水保護時間清0
while(1)
{
if(++k>250)
{
k=0;
Green_LED=!Green_LED;
}
while(TMR0<250); //250*16=4MS/
TMR0=0;
Scanf_U3();
Key_Scan();
if(Key_Flag==0||U3_Flag==1)
{
break;
}
}
}
void Slow_flashing_LED_GreenAndRed(void)//雙燈慢閃LED函數
{
Green_LED=0;
Red_LED=0;
RELAY=0;
Kaiji_Flag=0;
//Time_cunt=0;
unsigned int k=0;
while(1)
{
if(++k>250)
{
k=0;
Green_LED=!Green_LED;
Red_LED=!Red_LED;
}
while(TMR0<250); //250*16=4MS/
TMR0=0;
Key_Scan();
Time_cunt++;
if(Key_Flag==0||Time_cunt==15000||Time_cunt==75000||Time_cunt==225000||Time_cunt==900000)//2500是10S 15000是一分鐘 5分鐘是750000 15分鐘是225000 60分鐘是900000
{
break;
}
}
}
void working_fun(void)//正常工作函數
{
Kaiji_Flag=0;
Time_cunt=0;//只要正常工作 就把缺水保護時間清0
while(U1_Flag==1)
{
Scanf_U1();
Scanf_U3();
Red_LED=0;
Green_LED=1;
RELAY=1;
Key_Scan();
if(Key_Flag==0)
{
break;
}
}
}
/*********按鍵掃描函數**********/
void Key_Scan(void)
{
if(Key==1)
Key_Flag=1;
else
Key_Flag=0;
}
|