الخطوة الثانية :
برمجة دائرة بيان هبوط الجهد عن حد معين , 15% على سبيل المثال .
برمجة دائرة بيان السرعة , ومفتاح يعتمد على السرعة .
الدائرة الكهربية :
البرنامج :
كود:
/////////////////////////////////////////////////////////////
// Project : ATS ( Automatic Transfer Switch)
// 1- Mains voltage
// PIC16F877A , 4MHz , Mikroc-Pro
// Eng.F.Abdelaziz
// http://www.eeecb.com/vb/index.php
//5/3/2013
///////////////////////////////////////////////////////////////////
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
///////////////////////////VOLT /////////////////////////////////////////////
#define UNDER_VOLTAGE PORTD.B0
unsigned long ADC_value, VOLT_VALUE ;
char *VOLT = "0000";
//////////////////////////////// RPM /////////////////////////////////
#define RPM_SWITCH PORTD.B1
#define ON 1
#define OFF 0
unsigned long RPM_Value;
char *RPM = "00000";
void main(){
TRISA.B0=1 ; //RA0 => analog input
TRISA.B4 = 1; // Inut at RA4/T0CKI
PORTA.B4=0;
TRISB=0;
PORTB=0;
TRISD=0; //RPM Switch Output
PORTD=0;
OPTION_REG=0b00101000; //Prescaler(1:1) , T0CKI=1 for counter mode
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
//////////////////////////////////////////////////////////////////////
while(1){
///////////////////////
ADC_value = ADC_Read(0) ; // value from 0 to 1023
VOLT_VALUE = ADC_value * 220 /1023 ; // change to volt value from 0 to 220
////////////////////////////////////////////////////////////////////////////////////////////
ByteToStr(VOLT_VALUE,VOLT); // change volt value to text => 4 characters including null
Lcd_Out(2,1,VOLT); // display volt text => 0 to 220
Lcd_Out(2,5,"VOLT");
//////////////////////////////////////////////////////////////////////////////////////////////
//Lcd_Chr(2, 4, 'V'); // Write character "V" at row 2, column 4 after volt value
/////////////////////////////////////////////////
if(VOLT_VALUE<=185) UNDER_VOLTAGE=ON ;else UNDER_VOLTAGE=OFF;
///////////////////////////////////////////////////////////
/* The counter will be active for 1 sec and the number of pulses arrived during this interval will be recorded,
and multiplied by 60 to get the RPM . */
TMR0=0; //The counter will be active for 1 sec, start
Delay_ms(1000); // Wait for 1 sec
RPM_Value = TMR0*60;
///////////////////////////////////////////////////////////////
WordToStr(RPM_Value,RPM); // change RPM value to text => 6 characters including null
Lcd_Out(1,1,RPM);
////////////////////////////////////////////////////
Lcd_Out(1,7,"RPM");
//////////////////////////////////////////////////
if(RPM_Value > 600) RPM_SWITCH = ON ; else RPM_SWITCH = OFF;
////////////////////////////////////////////////////////////
}
}