📄 plc64i32.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 + -