|
#include <pic.h>
#include "inc_pic16f1827.h"
__CONFIG(INTCLK & PWRTEN & WDTDIS & PWRTEN & BOREN & PWRTDIS & PROTECT&MCLRDIS);
#define PERIOD 20 // period in uS - one second here
#define XTAL 4000000 // crystal frequency - 4MHz
#define ICLK (XTAL/4) // crystal is divided by four
#define SCALE 2 // prescale by 16 - check for overflow!
#define PRELOAD PERIOD*ICLK/SCALE/1000000
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define true 1
#define false 0
typedef bit bool;
#define const code
#define BDATA bdata
#define DATA data
#define IDATA idata
#define XDATA xdata
#define PDATA pdata
#define CODE code
#define BOOL bool
#define true 1
#define false 0
#define out 0
#define in 1
//======================================================
#define COUNT 1000
#define SUCCESS 0
#define FAIL 1
#define AD_MAX 100
unsigned short int timer_count;
void port_init(void);
void adc_init(void);
void usart_init(void);
void int_init(void);
void timer0_init(void);
void oscillator_init(void);
void putch(unsigned char byte);
unsigned char getch(void);
unsigned char getche(void);
unsigned short int AD_Sample(void);
unsigned char AD_Process(unsigned short int AD_Value);
int main(void)
{
unsigned short int AD_Value;
unsigned char res;
//initial
oscillator_init();
port_init();
adc_init();
usart_init();
int_init();
timer0_init();
timer_count = 0;
//启动阀门和起振
RC0 = 1; //启动阀门线圈
RA2 = 1; //维持阀门线圈
RA4 = 1; //主起振
RA5 = 1; //维持电流采集振荡
//定时器0中断开启
// TMR0IE = 1;
//采集点火感应电压
while(1)
{
AD_Value = AD_Sample();
res =AD_Process(AD_Value);
if(!SUCCESS)
{
timer_count = 0;
RC0 = 1; //启动阀门线圈
RA2 = 1; //维持阀门线圈
RA4 = 1; //主起振
RA5 = 1; //维持电流采集振荡
}
else
{
if(timer_count == COUNT)
{
RC0 = 0; //启动阀门线圈
RA2 = 0; //维持阀门线圈
RA4 = 0; //主起振
RA5 = 0; //维持电流采集振荡
break;
}
}
}
return 0;
}
unsigned char AD_Process(unsigned short int AD_Value)
{
if(AD_Value> 100)
return FAIL;
else
return SUCCESS;
}
unsigned short int AD_Sample(void)
{
unsigned char i;
unsigned short int ad;
unsigned short int AD_Value = 0;
unsigned char send;
unsigned short int ad_av;
for(i=0;i<8;i++)
{
GODONE = 1;//启动AD采集
while(ADIF);
{
ad = ADRESH;
ad = ad << 8 + ADRESL;
AD_Value = AD_Value + ad;
send = (unsigned char)ad;
putch(send);
send = (unsigned char)((ad >>8) & 0x00ff);
putch(send);
ADIF = 0;
}
}
return ad_av = (ad>>3);
}
void port_init(void)
{
TRISA = 0x00;
PORTA = 0x00;
TRISC = 0x00;
}
void adc_init(void)
{
ANSEL = 0x80;
ADCON0 = 0x1c; //ADFM VCFG — CHS2 CHS1 CHS0 GO/DONE ADON
ADCON1 = 0x70; //— ADCS2 ADCS1 ADCS0 — — — —
}
void usart_init(void)
{
RCSTA = 0x80; //SPEN RX9 SREN CREN ADDEN FERR OERR RX9D
TRISC = 0x30; //— — TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC0
BAUDCTL = 0x85; //ABDOVF RCIDL — SCKP BRG16 — WUE ABDEN
SPBRGH = 0x00; //Baud Rate Generator register, high byte
SPBRG = 0x19; //Baud Rate Generator register, low byte
TXSTA = 0x20; //CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D
}
void int_init(void)
{
INTCON = 0xc0; //GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
PIE1 =0x40; //EEIE ADIE RCIE C2IE C1IE OSFIE TXIE TMR1IE
PIR1 = 0x00; //EEIF ADIF RCIF C2IF C1IF OSFIF TXIF TMR1IF
ADIE = 1;
}
void timer0_init(void)
{
OPTION = 0x03; //RAPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
TMR0 = 0x4e; //5ms
}
//
void oscillator_init(void)
{
OSCCON = 0x47; //— IRCF2 IRCF1 IRCF0 OSTS(1) HTS LTS SCS 1MHz
}
void putch(unsigned char byte)
{
/* output one byte */
while(!TXIF) /* set when register is empty */
continue;
TXREG = byte;
}
unsigned char getch(void)
{
/* retrieve one byte */
while(!RCIF) /* set when register is not empty */
continue;
return RCREG;
}
unsigned char getche(void)
{
unsigned char c;
putch(c = getch());
return c;
}
void __ISR(_TIMER_0_VECTOR, ipl2) Timer0Handler(void)
{
timer_count++;
T0IF = 0;
}