📄 pio.c
字号:
//-----------------------------------------------------------------------------
// 20.c
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR declarations
//-----------------------------------------------------------------------------
// 16-bit SFR Definitions for 'F02x
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // data pointer
sfr16 TMR3RL = 0x92; // Timer3 reload value
sfr16 TMR3 = 0x94; // Timer3 counter
sfr16 ADC0 = 0xbe; // ADC0 data
sfr16 ADC0GT = 0xc4; // ADC0 greater than window
sfr16 ADC0LT = 0xc6; // ADC0 less than window
sfr16 RCAP2 = 0xca; // Timer2 capture/reload
sfr16 T2 = 0xcc; // Timer2
sfr16 RCAP4 = 0xe4; // Timer4 capture/reload
sfr16 T4 = 0xf4; // Timer4
sfr16 DAC0 = 0xd2; // DAC0 data
sfr16 DAC1 = 0xd5; // DAC1 data
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);
void UART1_Init (void);
void ADC0_Init (void);
void UART0_ISR (void);
void UART1_ISR (void);
void Timer3_Init (int counts);
//void IntPriority_Init (void);
void CommoIni0(void);
void CommoIni1(void);
void SendAD0(void);
void SendAD1(void);
void IOoutChange(unsigned char OutChar);
void IOinSample(void);
void IOinChange(void);
unsigned char IOsetChange(unsigned char a,unsigned char b);
unsigned int getASCIIfromHEX(unsigned char hexvalue);
void FlashProtect(void);
void MainIni(void);
void delay(unsigned char n);
//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // SYSCLK frequency in Hz
#define BAUDRATE0 9600 // Baud rate of UART0 in bps
#define BAUDRATE1 300 // Baud rate of UART1 in bps
#define SOIofAnalog '#'
#define EOIofAnalog 0x0D
#define SOIofDigitalCon '$'
#define SOIofDigitalChk '#'
#define EOIofDigital 0x0D
#define maxCom 30
#define NunCom 0
#define StartCom 1
#define Sta0 0x00
#define Sta1 0x01
#define Sta2 0x02
#define Sta3 0x03
#define InSampleSetTimes 40
//-----------------------------------------------------------------------------
// Global VARIABLES
//-----------------------------------------------------------------------------
unsigned char ConTime00;
unsigned char ConTime01;
unsigned char ConTime02;
unsigned char ConTime10;
unsigned char ConTime11;
unsigned char ConTime12;
sbit TEST = P1^7; //LED(green)
bit ComInfoAvalible0;
bit ComInfoAvalible1;
bit TransComplete0;
bit TransComplete1;
bit Send1Complete;
bit Send1LastBit;
bit CommandL;
unsigned char xdata RXsave0[maxCom];
unsigned char RXstatus0;
unsigned char PCom0;
unsigned char AnsPoint0;
unsigned char xdata RXsave1[maxCom];
unsigned char RXstatus1;
unsigned char PCom1;
unsigned char AnsPoint1;
unsigned char xdata TXsave0[maxCom];
unsigned char xdata TXsave1[maxCom];
unsigned char xdata WorkStatus;
unsigned char xdata OutBackUp;
unsigned char xdata InBackUp;
unsigned char InSampleCon;
unsigned char xdata In0Sum;
unsigned char xdata In1Sum;
unsigned char xdata In2Sum;
unsigned char xdata In3Sum;
unsigned char xdata In4Sum;
unsigned char xdata In5Sum;
unsigned char xdata In6Sum;
unsigned char xdata In7Sum;
unsigned char infoBackL;
unsigned char infoBackH;
//-----------------------------------------------------------------------------
// 主程序
//--------------------------------------------------------------------
void main (void)
{
unsigned int temptInt;
WDTCN = 0x07; //设置WDT周期为47ms
WDTCN = 0xA5; //复位WDT
// WDTCN = 0xDE; // Disable WDT///////////////////////// // WDTCN = 0xAD;///////////////////////////////////////////
PORT_Init (); // initialize crossbar and GPIO
if (RSTSRC & 0x08)
{
P2=OutBackUp;
infoBackL = 0xF;
infoBackH = 0xF;
}
else
{
OutBackUp=0;
P2=OutBackUp;
In0Sum=128;
In1Sum=128;
In2Sum=128;
In3Sum=128;
In4Sum=128;
In5Sum=128;
In6Sum=128;
In7Sum=128;
}
SYSCLK_Init (); // initialize oscillator
FLSCL=0x80;
PSCTL=0x04;
UART0_Init (); // initialize UART0
UART1_Init (); // initialize UART1
ADC0_Init ();
Timer3_Init (SYSCLK / 100000); // initialize Timer3 to overflow at a 100kHz rate.(0.01ms)
MainIni();
delay(200);
EA = 1; // Enable global interrupts
while (1)
{
WDTCN = 0xA5; //复位WDT
if (ComInfoAvalible0)
{
if((RXsave0[1]=='0')&(RXsave0[2]=='1'))
{
SendAD0();
}
if((RXsave0[1]=='0')&(RXsave0[2]=='2'))
{
SendAD1();
}
ComInfoAvalible0=0;
}
if (ComInfoAvalible1)
{
if((RXsave1[0]=='#')&(RXsave1[1]=='1')&(RXsave1[2]=='D')&(RXsave1[3]=='I'))
{
if (CommandL==0)
{
WDTCN = 0xA5; //复位WDT///////////////////////////////////死锁问题
TXsave1[0]=0;
TXsave1[1]='*';
TXsave1[2]='1';
TXsave1[3]='D';
TXsave1[4]='I';
TXsave1[5]='F';
TXsave1[6]='F';
TXsave1[7]='F';
TXsave1[8]='F';
TXsave1[9]='F';
TXsave1[10]='F';
TXsave1[11]='F';
TXsave1[12]='F';
TXsave1[13]='F';
TXsave1[14]='F';
TXsave1[15]='F';
TXsave1[16]='F';
TXsave1[17]=infoBackH;//'F';//infoBackH
TXsave1[18]=infoBackL;//'F';//infoBackL
TXsave1[19]='F';
TXsave1[20]='F';
temptInt=getASCIIfromHEX(InBackUp);
TXsave1[21]=temptInt>>8;
TXsave1[22]=temptInt;
TXsave1[23]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
else if (CommandL==1)
{
WDTCN = 0xA5; //复位WDT///////////////////////////////////死锁问题
TXsave1[0]=0;
TXsave1[1]='*';
TXsave1[2]='1';
TXsave1[3]='D';
TXsave1[4]='I';
TXsave1[5]=infoBackH;//'F';//infoBackH
TXsave1[6]=infoBackL;//'F';//infoBackL
temptInt=getASCIIfromHEX(InBackUp);
TXsave1[7]=temptInt>>8;
TXsave1[8]=temptInt;
TXsave1[9]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
}
if((Send1Complete)&(RXsave1[0]=='#')&(RXsave1[1]=='1')&(RXsave1[2]=='A')&(RXsave1[3]=='I')&(RXsave1[4]=='O')&(RXsave1[5]=='0')&(RXsave1[6]=='0'))
{
if((RXsave1[7]=='0')&(RXsave1[8]=='0')&(RXsave1[9]=='0')&(RXsave1[10]=='0')&(RXsave1[11]=='0'))
{
if((RXsave1[12]=='0')&(RXsave1[13]=='0')&(RXsave1[14]=='0')&(RXsave1[15]=='0')&(RXsave1[16]=='0'))
{
if((RXsave1[17]=='F')&(RXsave1[18]=='F')&(RXsave1[19]=='0')&(RXsave1[20]=='0'))
{
WDTCN = 0xA5; TXsave1[0]=0;//0000000000FF0060
TXsave1[1]='*';
TXsave1[2]='1';
TXsave1[3]='A';
TXsave1[4]='I';
TXsave1[5]='O';
TXsave1[6]='0';
TXsave1[7]='0';
TXsave1[8]='0';
TXsave1[9]='0';
TXsave1[10]='0';
TXsave1[11]='0';
TXsave1[12]='0';
TXsave1[13]='0';
TXsave1[14]='0';
TXsave1[15]='0';
TXsave1[16]='0';
TXsave1[17]='0';
TXsave1[18]='F';
TXsave1[19]='F';
TXsave1[20]='0';
TXsave1[21]='0';
TXsave1[22]='6';
TXsave1[23]='0';
TXsave1[24]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
}
}
else if ((RXsave1[7]=='F')&(RXsave1[8]=='F')&(RXsave1[9]=='0')&(RXsave1[10]=='0'))
{
WDTCN = 0xA5; TXsave1[0]=0;//0000000000FF0060
TXsave1[1]='*';
TXsave1[2]='1';
TXsave1[3]='A';
TXsave1[4]='I';
TXsave1[5]='O';
TXsave1[6]='0';
TXsave1[7]='0';
TXsave1[8]='F';
TXsave1[9]='F';
TXsave1[10]='0';
TXsave1[11]='0';
TXsave1[12]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
}
if((RXsave1[0]=='#')&(RXsave1[1]=='1')&(RXsave1[2]=='W')&(RXsave1[3]=='E'))
{
WDTCN = 0xA5; //复位WDT///////////////////////////////////死锁问题
WorkStatus=Sta1;
TXsave1[0]=0;
TXsave1[1]='*';
TXsave1[2]='1';
TXsave1[3]='W';
TXsave1[4]='E';
TXsave1[5]='F';
TXsave1[6]='7';
TXsave1[7]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
if((RXsave1[0]=='#')&(RXsave1[1]=='1')&(RXsave1[2]=='A')&(RXsave1[3]=='C')&(RXsave1[4]=='K'))
{
WDTCN = 0xA5; //复位WDT///////////////////////////////////死锁问题
TXsave1[0]=0;
TXsave1[1]='*';
TXsave1[2]='1';
TXsave1[3]='A';
TXsave1[4]='C';
TXsave1[5]='K';
TXsave1[6]='2';
TXsave1[7]='A';
TXsave1[8]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
if((RXsave1[0]=='$')&(RXsave1[1]=='1')&(RXsave1[2]=='D')&(RXsave1[3]=='O')&(RXsave1[4]=='0')&(RXsave1[5]=='0'))
{
if((RXsave1[6]=='0')&(RXsave1[7]=='0')&(RXsave1[8]=='0')&(RXsave1[9]=='0')&(RXsave1[10]=='0')&(RXsave1[11]=='0')&(RXsave1[12]=='0')&(RXsave1[13]=='0')&(RXsave1[14]=='0')&(RXsave1[15]=='0'))
{
if((RXsave1[18]=='0')&(RXsave1[19]=='0')) //$1DO000000000000ab00
{
//if(WorkStatus==Sta1)
//{
if (((RXsave1[16]>=0x30)&(RXsave1[16]<=0x39))|((RXsave1[16]>=0x41)&(RXsave1[16]<=0x46))|((RXsave1[16]>=0x61)&(RXsave1[16]<=0x66)))
{
if (((RXsave1[17]>=0x30)&(RXsave1[17]<=0x39))|((RXsave1[17]>=0x41)&(RXsave1[17]<=0x46))|((RXsave1[17]>=0x61)&(RXsave1[17]<=0x66)))
{
IOoutChange(IOsetChange(RXsave1[16],RXsave1[17]));
WorkStatus=Sta0;
CommandL=0;
WDTCN = 0xA5; //复位WDT///////////////////////////////////死锁问题
TXsave1[0]=0;
TXsave1[1]='*';
TXsave1[2]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
}
}
//}
}
}
else if ((RXsave1[8]=='0')&(RXsave1[9]=='0'))
{
CommandL=1;
//if(WorkStatus==Sta1)
//{
IOoutChange(IOsetChange(RXsave1[6],RXsave1[7]));
WorkStatus=Sta0;
WDTCN = 0xA5; //复位WDT///////////////////////////////////死锁问题
TXsave1[0]=0;
TXsave1[1]='*';
TXsave1[2]=0x0D;
AnsPoint1=0;
Send1Complete=0;
Send1LastBit=0;
SBUF1=TXsave1[AnsPoint1];
//}
}
}
ComInfoAvalible1=0;
}
}
}
//-----------------------------------------------------------------------------
// 串口0初始化 N-8-1
//-----------------------------------------------------------------------------
void UART0_Init (void)
{
SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
T2CON=0x30;
RCAP2=-(SYSCLK/BAUDRATE0/32);
TR2 = 1; // start Timer2
PCON |= 0x90; // SMOD00 = 1
TI0=0;
RI0=0;
ES0=1;
}
//-----------------------------------------------------------------------------
// 串口1初始化 N-8-1
//-----------------------------------------------------------------------------
void UART1_Init (void)
{
SCON1 = 0x50; // SCON1: mode 1, 8-bit UART, enable RX,TI1=0,RI1=0
T4CON=0x30;
RCAP4=-(SYSCLK/BAUDRATE1/32);
T4CON |= 0x04; // start Timer1
PCON |= 0x90; // SMOD00 = 1
SCON1 &= 0xfc;
EIE2 |=0x40; //ES1=1
}
//-----------------------------------------------------------------------------
// ADC0初始化
//-----------------------------------------------------------------------------
//
void ADC0_Init (void)
{
ADC0CN = 0x40; // ADC0 disabled; normal tracking
// mode; ADC0 conversions are initiated
// on software start; ADC0 data is
// right-justified
REF0CN = 0x07; // enable temp sensor, on-chip VREF,
// and VREF output buffer
AMX0CF =0X00; //
ADC0CF = (SYSCLK/500000) << 3; // ADC conversion clock = 0.5MHz
ADC0CF &= ~0x07; // PGA gain = 1
EIE2 |= 0x02; // enable ADC0 interrupts
AD0INT = 0;
AD0EN = 1; // enable ADC0
}
//-----------------------------------------------------------------------------
// I/O口初始化
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR0 = 0x04; // Enable UART0
XBR1 = 0x00;
XBR2 = 0xc4; // Enable crossbar and weak pull-ups,and enable UART1
P0MDOUT |= 0x01; // enable TX0 and TX1 open C output
P2MDOUT = 0xff; // enable P3 as open C output
P1MDOUT = 0xff;
}
//-----------------------------------------------------------------------------
// 外部晶体初始化
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
int i; // delay counter
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
}
//-----------------------------------------------------------------------------
// 定时器2初始化
//-----------------------------------------------------------------------------
void Timer3_Init (int counts)
{
TMR3CN = 0x02; // Stop Timer3; Clear TF3;
// use SYSCLK as timebase
TMR3RL = -counts; // Init reload values
TMR3 = 0xffff; // set to reload immediately
EIE2 |= 0x01; // enable Timer3 interrupts
TMR3CN |= 0x04; // start Timer3
}
//-----------------------------------------------------------------------------
// 中断优先级设置
//-----------------------------------------------------------------------------
//void IntPriority_Init (void)
//{
// IP = 0x00;
// EIP1 = 0x00;
// EIP2 = 0x01; //set Timer3 interupt priority is the highest
//}
//------------------------------------------------------------------------------------
// 定时器3中断服务例程
//------------------------------------------------------------------------------------
void Timer3_ISR (void) interrupt 14
{
TMR3CN &= ~(0x80); // clear TF3
if(++ConTime00==0)
{
IOinSample();
if(++InSampleCon==40)
{
InSampleCon=0;
IOinChange();
}
if(++ConTime01==0)
{
TEST=~TEST;
if(++ConTime02==10)
{
CommoIni0();
RXstatus0=NunCom;
}
}
}
if(++ConTime10==0)
{
if(++ConTime11==0)
{
if(++ConTime12==50)
{
CommoIni1();
RXstatus1=NunCom;
WorkStatus=Sta0;
}
}
}
}
//------------------------------------------------------------------------------------
// 串口0中断服务例程(用于AIO通讯)
//------------------------------------------------------------------------------------
void UART0_ISR (void) interrupt 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -