⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plc64i32.c

📁 64输入32输出单片机程序
💻 C
字号:
//-------------------------------------------------------------------------
//	Filename :  PC64I32O.C
//	Language :  C for AT89S8252
//	Revision :  1.0
//  Initial Date :  07/10/2000
//   Last Modify :
//  System clock :  24.00MHZ
//   Description :  C program for test Plc64i32o.pcb
//-------------------------------------------------------------------------
#define _PLC6432B_H_
#include <reg8252.h>
#include "PLC64I32.h"
#undef _PLC6432B_H_
extern bit spray_end,blow_end,heat1_end,heat2_end,alarm_flag,comm_load_end;
extern heat1_time,heat2_time,run_time,comm_load_time;
extern spray_time,blow_time;
enum{INDUCTIN1=4,MAGFRCE1=10,MAGFRCE2=12,INDUCTIN2=27};
//-------------------------------------------------------------------------
#pragma OPTIMIZE(4)
//-------------------------------------------------------------------------
#define MSB_PERIOD  -20000/256
#define LSB_PERIOD  -20000%256
//--------------------------------------------------------------------------
// CLOCK = P0.2 DATA = P0.3 ST1 = P0.7 ST2 = P0.6
//	 ST3 = P0.5 ST4 = P0.4	EN = P3.7
sbit CLK = P0^2;
sbit DATA = P0^3;
sbit ST1 = P0^7;
sbit ST2 = P0^6;
sbit ST3 = P0^5;
sbit ST4 = P0^4;
sbit OE = P3^3;
sbit OST = P3^4;
sbit INR = P3^5;
sbit ENOUTPUT = P3^7;
unsigned char sel_byte = 0x01;
unsigned char in_ptr = OFF;
unsigned char out_ptr = OFF;
unsigned char inp_buf[8];
unsigned char idata inp_buf1[8];
unsigned char idata inc_ref;
//-------------------------------------------------------------------------
void _set_delay (char delay)
{
    unsigned tick;
    tick = tick_clock+delay;
    while (tick != tick_clock);
}
//-------------------------------------------------------------------------
void _scand_inport (void) using 2
{
    INR = OFF;
    if (inp_buf1[in_ptr] == P2)
	inp_buf[in_ptr] = inp_buf1[in_ptr];
    else
	inp_buf1[in_ptr] = P2;
    OE = ON;
    INR = ON;
    OST = OFF;
    sel_byte <<= 1;
    in_ptr++;
    if (!sel_byte){
	sel_byte = 0x01;
	in_ptr = OFF;
    }
    P2 = sel_byte;
    OE = OFF;
    OST = ON;
}
//-------------------------------------------------------------------------
void _send_outport (void) using 2
{
    unsigned char digit;
    unsigned char chanel;
    ST1 = OFF;
    ST2 = OFF;
    ST3 = OFF;
    ST4 = OFF;
    CLK = OFF;
    digit = outp_buf[out_ptr];
    for (chanel=0;chanel<8;chanel++){
	DATA = digit & 0x01;
	CLK = ON;
	digit >>= 1;
	CLK = OFF;
	}
    switch (out_ptr){
	case 0 :
	    ST1 = ON;
	    ST1 = OFF;
	    break;
	case 1 :
	    ST2 = ON;
	    ST2 = OFF;
	    break;
	case 2 :
	    ST3 = ON;
	    ST3 = OFF;
	    break;
	case 3 :
	    ST4 = ON;
	    ST4 = OFF;
    }
    if (++out_ptr==4)
	out_ptr = OFF;
}
//-------------------------------------------------------------------------
char _inp_port (char address)
{
    char status;
    switch (address){
	case 0x80 :
	    status = inp_buf[0];
	    break;
	case 0x81 :
	    status = inp_buf[1];
	    break;
	case 0x82 :
	    status = inp_buf[2];
	    break;
	case 0x83 :
	    status = inp_buf[3];
	    break;
	case 0x84 :
	    status = inp_buf[4];
	    break;
	case 0x85 :
	    status = inp_buf[5];
	    break;
	case 0x86 :
	    status = inp_buf[6];
	    break;
	case 0x87 :
	    status = inp_buf[7];
	    break;
	default   :
	    status = OFF;
    }
    return status;
}
//-------------------------------------------------------------------------
void _outp_port (char address, char status)
{
    switch (address){
	case 0x88 :
	    outp_buf[0] = status;
	    break;
	case 0x89 :
	    outp_buf[1] = status;
	    break;
	case 0x8a :
	    outp_buf[2] = status;
	    break;
	case 0x8b :
	    outp_buf[3] = status;
    }
}
//=================================
void _reserve_outpbuf(void)
{
    outp_buf[4]=outp_buf[0];
    outp_buf[5]=outp_buf[1];
    outp_buf[6]=outp_buf[2];
    outp_buf[7]=outp_buf[3];

}
//======================
void _reload_outpbuf(void)
{
    if(outp_buf[4]>>5)
    {
    outp_buf[0]=outp_buf[4]&0x1f;
    _set_delay(150);
    }
    outp_buf[0]=outp_buf[4];
    outp_buf[1]=outp_buf[5];
    outp_buf[2]=outp_buf[6];
    outp_buf[3]=outp_buf[7];

}
//-------------------------------------------------------------------------
char _inp_bit (char num)
{
    char stus_bit = 0x01;
    char in_stus;
    char chanel;
    for (chanel=0;num>8;chanel++){
	num -= 8;}
    in_stus = inp_buf[chanel];
    stus_bit <<= num-1;
    in_stus &= stus_bit;
    return in_stus? ON:OFF;
}
//-------------------------------------------------------------------------
bit _outp_stus (char num)
{
    char chanel;
    char out_stus;
    unsigned char stus_bit = 0x80;
    for (chanel=0;num>8;chanel++){
	num -= 8;}
    out_stus = outp_buf[chanel];
    stus_bit >>= num-1;
    out_stus &= stus_bit;
    return out_stus? ON:OFF;
}
//-------------------------------------------------------------------------
void _outp_bit (char num, char status)
{
    char chanel;
    char out_stus;
    unsigned char stus_bit = 0x80;
    for (chanel=0;num>8;chanel++){
	num -= 8;}
    out_stus = outp_buf[chanel];
    stus_bit >>= num-1;
    status &= 0x01;
    if (status == ON)
	out_stus |= stus_bit;
    else
	out_stus &= ~stus_bit;
    outp_buf[chanel] = out_stus;
}
//-------------------------------------------------------------------------
/*
unsigned _read_eepword (unsigned xdata* ptr)
{
    unsigned val;
    WMCON = 0x0a;		 // set read eeprom enable
    val = *ptr;			 // read eeprom value
    WMCON = 0x02;		 // clear eeprom RDY/-BSY = 1
    return val;
}
//-------------------------------------------------------------------------
void _write_eepword (unsigned xdata* ptr,unsigned val)
{
    WMCON = 0x1a;		 // set write eeprom & WDT enable
    while(!(WMCON & 0x02));
    *ptr = val;
    while (!(WMCON & 0x02));
    WMCON = 0x02;		 // disenable WDT
}
  */
unsigned char _read_eepbyte (unsigned char xdata* ptr)
{
    unsigned char val;
    WMCON = 0x0a;		 // set read eeprom enable
    val = *ptr;			 // read eeprom value
    WMCON = 0x02;		 // clear eeprom RDY/-BSY = 1
    return val;
}
//-------------------------------------------------------------------------
void _write_eepbyte (unsigned char xdata* ptr,unsigned char val)
{
    WMCON = 0x1a;		 // set write eeprom & WDT enable
    while(!(WMCON & 0x02));
    *ptr = val;
    while (!(WMCON & 0x02));
    WMCON = 0x02;		 // disenable WDT
}

//-------------------------------------------------------------------------
//	Power on Delay for ISP serial port
//-------------------------------------------------------------------------
void _powon_delay (void)
{
    unsigned char timer_ref = 200;
    unsigned char delay_time = 50;
    while (delay_time--){
	while (timer_ref--);
    }
}
//-------------------------------------------------------------------------
void _init_system(void)
{
    ENOUTPUT = OFF;	 // set output enable
    // setup timer0 interrupt initalization
    tick_clock = OFF;
    TH0 = MSB_PERIOD;	 // set timer0 period
    TL0 = LSB_PERIOD;
    TMOD |= 0x01;	 // select mode 1 16 counter
    TR0 = ON;		 // start timer0
    ET0 = ON;		 // enable timer0 interrupt
    EA	= ON;		 // global interrupt enable
    // Power On delay for SPI progrmming port
    _powon_delay ();
}
//-------------------------------------------------------------------------
//	    Timer0 interrupt service function
//	    Executes each 10ms @24MHZ Crystal clock
//-------------------------------------------------------------------------
timer0() interrupt 1 using 2	 // Int Vector at 000BH, Reg Bank 2
{
    TH0 = MSB_PERIOD;	 // re-load timer0 period
    TL0 = LSB_PERIOD;
    tick_clock++;
    _send_outport();
    _scand_inport();
    if (++inc_ref == 10){
	ref_100ms++;
	inc_ref = OFF;
    }
    if(spray_time==tick_clock)
	spray_end=1;

    if(blow_time==tick_clock)
	blow_end=1;

    if(heat1_time==tick_clock)

	      {
			heat1_end=1;
	       _outp_bit(INDUCTIN1,OFF);
	       _outp_bit(MAGFRCE1,OFF);
	      }
    if(heat2_time==tick_clock)
	      {
		   heat2_end=1;
	       _outp_bit(INDUCTIN2,OFF);
	       _outp_bit(MAGFRCE2,OFF);
	      }
    if(run_time==tick_clock)
	alarm_flag=1;
    if(comm_load_time==tick_clock)
	comm_load_end=1;
}
//-------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -