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

📄 pio.c

📁 基于80C51F020的16路开关量两路模拟量控制通用程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//-----------------------------------------------------------------------------
// 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 + -