📄 c8051f064.c
字号:
K3=1 ; //继电器断开,测量常闭触电
bcdchang ();
t1_buffer[24]=r0_buffer[6]<<4|r0_buffer[5];
t1_buffer[25]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[26]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test3(void)
{
test11();
bcdchang ();
t1_buffer[19]=r0_buffer[6]<<4|r0_buffer[5];
t1_buffer[20]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[21]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test4(void)
{
delay(n);
adch();
if (admn<298) //小于16V
{
K2=0;
delay(n);
adch();
adc=(unsigned long)admn*3/100; //*61/6/2*2470/4096/100
K2=1;
}
else adc=(unsigned long)(admn*337/500); //*1342/6/2*2470/4096/100
bcdchang ();
t1_buffer[22]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[23]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test11(void)
{
delay(n);
adch();
if (admn<298) //小于16V
{
K2=0;
delay(n);
adch();
adc=(unsigned long)(admn*3/100); //61/6/2*2470/4096
K2=1;
}
// admn=admn*48; //6175/128;
else adc = (unsigned long)(admn*337/500); //1342/6/2*2470/4096
}
//*******************************************************
void test5(void)
{
delay(4*n); //91H
adch1();
if (admn<298) //小于16V
{
K2=0;
delay(4*n); //190.24ms
adch1();
adc=( unsigned long)(admn*3/100);
K2=1 ;
}
else adc=( unsigned long)(admn*337/500); //*80*2470/4096/100
K3=1;
bcdchang ();
t1_buffer[27]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[28]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test6(void)
{
test12(); //92H
K3=1 ;//继电器断开,测量常闭触电
bcdchang ();
t1_buffer[24]=r0_buffer[6]<<4|r0_buffer[5];
t1_buffer[25]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[26]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test7(void)
{
test12(); //93H
bcdchang ();
t1_buffer[19]=r0_buffer[6]<<4|r0_buffer[5];
t1_buffer[20]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[21]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test8(void)
{
delay(4*n); //94H
adch1();
if (admn<298) //小于16V
{
K2=0;
delay(4*n);
adch1();
adc=( unsigned long)(admn*3/100);
K2=1;
}
else adc=( unsigned long)(admn*337/500); //*80*2470/4096/100
bcdchang ();
t1_buffer[22]=r0_buffer[4]<<4|r0_buffer[3];
t1_buffer[23]=r0_buffer[2]<<4|r0_buffer[1];
}
//*******************************************************
void test12(void)
{
delay(4*n);
adch1();
if (admn<298) //小于16V
{
K2=0;
delay(4*n);
adc=( unsigned long)(admn*3/100);
K2=1;
}
else adc=( unsigned long)admn*337/500; //*1342/2/6*2470/4096
}
//*******************************************************
void test21(void) //86H 88H
{
K3=0 ; //继电器吸合,测量常开触电
test1();
test3();
}
//*******************************************************
void test22(void) //87H 89H
{
K3=0 ; //继电器吸合,测量常开触电
test2();
test4();
}
//*******************************************************
void test23(void) //91H 93H
{
K3=0 ; //继电器吸合,测量常开触电
test5();
test7();
}
//*******************************************************
void test24(void) //92H 94H
{
K3=0;
test6();
test8();
}
//*******************************************************
void adch(void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = ADC0_PAGE; // Switch to ADC0 Page
t5=208;
for (i=0;i<12;i++)
{
delay(t5);
ADC0CN = 0x090; // 启动转换
while ((ADC0CN&0x20)==0);
ad[i]=ADC0;
}
for (i=0;i<12;i++)
{
for (j=i;j<12;j++)
{
if (ad[i]< ad[j])
{
ad[12]= ad[i];
ad[i]= ad[j];
ad[j]=ad[12];
}
}
}
admn=(ad[4]+ad[5]+ad[6]+ad[7] )/4;
SFRPAGE = old_SFRPAGE;
}
//*******************************************************
void adch1(void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = ADC1_PAGE; // Switch to ADC0 Page
t5=208;
for (i=0;i<12;i++)
{
delay(t5);
ADC1CN = 0x090; // 启动转换
while ((ADC1CN&0x20)==0);
ad[i]=ADC1;
}
for (i=0;i<12;i++)
{
for (j=i;j<12;j++)
{
if (ad[i]< ad[j])
{
ad[12]= ad[i];
ad[i]= ad[j];
ad[j]=ad[12];
}
}
}
admn=(ad[4]+ad[5]+ad[6]+ad[7] )/4;
SFRPAGE = old_SFRPAGE;
}
//*******************************************************
void cpinit(void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CPT0_PAGE ;
CPT0CN=0x8a;
SFRPAGE = CPT1_PAGE ;
CPT1CN=0x8a;
SFRPAGE = old_SFRPAGE;
}
//--------------------------------------------------------------------------
// Initialization Subroutines
// SYSCLK_Init 使用11.0592MHz外部晶体振荡器
// This routine initializes the system clock to use an 11.0592MHz crystal
// as its clock source.
void SYSCLK_Init (void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CONFIG_PAGE; // Switch to Configuration Page
OSCXCN = 0x67; // start external oscillator with
// 22.1184MHz crystal on TB
for (i=0; i <5000; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
RSTSRC = 0x04; // enable missing clock detector reset
CLKSEL = 0x01; // change to external crystal
OSCICN = 0x00; // disable internal oscillator
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
/*
void SYSCLK_Init (void)
{
OSCXCN = 0x67; // start external oscillator with
for (i=0; i < 256; i++) ; // XTLVLD blanking interval (>1ms)
while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK
} */
//******************************************************************
//该函数为延时函数,延时长短由X决定,
void delay(unsigned int x)
{
for (i = x; i > 0; i--)
{
LED = 0;
WDTCN = 0xa5; // 开看门狗,清看门狗
LED = 1;
}
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CONFIG_PAGE; // Switch to configuration page
XBR0 = 0x04; // Enable UART0 on crossbar
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-ups
P0MDOUT |= 0xFF; // enable Port0 outputs as push-pull
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
/*
// Configure the Crossbar and GPIO ports
void PORT_Init (void)
{
XBR0 = 0x04; // Enable UART0
XBR1 = 0x00;
XBR2 = 0x44; // Enable UART1
// Enable crossbar and weak pull-ups
P0MDOUT |= 0x35; // enable P0 as a push-pull output
// P0.5 P0.4 P0.2 P0.0
P1MDOUT |= 0x3f; // enable P1 as a push-pull output
// P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
} */
//----------------------------------------------------------------------------
// UART_Init
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = UART0_PAGE; // Switch to UART0 page
SCON0 = 0x50; // SCON: mode 1, 8-bit UART, enable RX
SSTA0 = 0x10; // Timer 1 generates UART0 baud rate and
// UART0 baud rate divide by two disabled
SFRPAGE = TIMER01_PAGE; // Switch to Timer 0/1 page
TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload
TH1 = -(SYSCLK/BAUDRATE/16); // set Timer1 reload value for baudrate
TR1 = 1; // start Timer1
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
// PCON |= 0x80; // SMOD = 1
SFRPAGE = UART0_PAGE; // Switch to UART0 page
TI0 = 1; // Indicate TX ready
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
//-----------------------------------------------------------------------------
// ADC0_Init
void ADC0_Init (void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = ADC0_PAGE; // Switch to ADC0 Page
ADC0CN = 0x40; // ADC abled, AD0BUSY=1 start-of-conversion
REF0CN = 0x03; // turn on bias generator and internal reference.
for(i=0;i<10000;i++); // Wait for Vref to settle (large cap used on target board)
AMX0SL = 0x00; // Single-ended mode
ADC0CF = (SYSCLK/25000000) << 4; // Select SAR clock frequency =~ 25MHz
SFRPAGE = ADC1_PAGE;
ADC1CN = 0x40; // ADC abled, AD1BUSY=1 start-of-conversion
REF1CN = 0x03;
for(i=0;i<10000;i++); // Wait for Vref to settle (large cap used on target board)
ADC1CF = (SYSCLK/25000000) << 4; // Select SAR clock frequency =~ 25MHz
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
/*
void ADC0_Init (void)
{
ADC0CN = 0x00; // ADC0 disabled; normal tracking
// mode; ADC0 conversions are initiated
// on overflow of Timer3; ADC0 data is
// left-justified
REF0CN = 0x03; // enable temp sensor, on-chip VREF,
// and VREF output buffer
AMX0SL = 0x00; // Select ADC mux output Ch0
// AMX0CF = 0x00;
// ADC0CCF = 0x00;
ADC0CF = (SYSCLK/2500000) << 3; // ADC conversion clock = 2.5MHz
} */
//-----------------------------------------------------------------------------
// Timer3_Init
// Configure Timer3 to auto-reload and generate ADC sample rate
// specified by <counts> using SYSCLK as its time base.
//
void Timer3_Init (void)
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = TMR3_PAGE; // Switch to Timer 3 page
TMR3CF = 0x08; // use SYSCLK as timebase
TMR3CN = 0x00; // Stop Timer3; Clear TF3;
// RCAP3 = -counts; // Init reload values
TMR3 = 0x0000; // set to reload immediately
// TR3 = 1; // start Timer3
SFRPAGE = old_SFRPAGE; // restore SFRPAGE
}
/*
void Timer3_Init (void)
{
TMR3CN = 0x02; // Stop Timer3; Clear TF3;
// use SYSCLK as timebase
TMR3RL =0x0000; // Init reload values
TMR3 = 0x0000; // set to reload immediately
} */
//************************************************************************
void UART0RX_VECTOR (void) interrupt 4
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = UART0_PAGE; // Switch to UART0 page
if (RI0==1)
{
RI0=0;
r0_buffer[r0]=SBUF0;//接受缓冲区读数
r0=++r0&0x0007;
if ((r0==2)&&(r0_buffer[1]!=top1))
{
r0=1;
r0_buffer[0]= r0_buffer[1];
}
if ((r0==1)&&(r0_buffer[0]!=top0))
{
r0=0;
}
}
SFRPAGE = old_SFRPAGE;
}
//************************************************************************
void CP0DOWN (void) interrupt 10
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CPT0_PAGE ;
CPT0CN &=~ 0x10;
SFRPAGE = TMR3_PAGE; // Switch to Timer 3 page
dodata1[cp1]=TMR3;
dodata2[cp1]=count;
if (cp1<1)
{
cp1++;
}
SFRPAGE = old_SFRPAGE;
}
//************************************************************************
void CP0UP (void) interrupt 11
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CPT0_PAGE ;
CPT0CN &=~ 0x20;
SFRPAGE = TMR3_PAGE;
updata1[cp2]=TMR3;
updata2[cp2]=count;
if (cp2<1)
{
cp2++;
}
SFRPAGE = old_SFRPAGE;
}
//************************************************************************
void CP1DOWN (void) interrupt 12
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CPT1_PAGE ;
CPT1CN &=~ 0x10;
SFRPAGE = TMR3_PAGE;
dodata3[cp3]=TMR3;
dodata4[cp3]=count;
if (cp3<1)
{
cp3++;
}
SFRPAGE = old_SFRPAGE;
}
//************************************************************************
void CP1UP (void) interrupt 13
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = CPT1_PAGE ;
CPT1CN &=~ 0x20;
SFRPAGE = TMR3_PAGE;
updata3[cp4]=TMR3;
updata4[cp4]=count;
if (cp4<1)
{
cp4++;
}
SFRPAGE = old_SFRPAGE;
}
//****************************************************************
void Time3_vecter (void) interrupt 14
{
char old_SFRPAGE = SFRPAGE;
SFRPAGE = TMR3_PAGE;
count++;
TMR3CN &=~ 0x80;
WDTCN = 0xa5; // 开看门狗,清看门狗
SFRPAGE = old_SFRPAGE;
}
//****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -