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

📄 main.c

📁 C8051F020的全面应用,包括两个UART口、SPI、I2C
💻 C
字号:
/*	This program is used for Signalmachine.
	Copyright by Wangr
	2006-05-27
	LOG:
	2006-05-27: C8051F020 configured
	*/
#include <intrins.h>
#include <absacc.h>
#include <math.h>
#include <string.h>
#include <config.c>
#include <maindef.h>
#include <Flash.c>
#include <ram.c>
#include <calender.c>

/******* parameter declare *********/
/*******                  *********/
uchar xdata Com0RecBuf[RecBufLen], Com1RecBuf[RecBufLen],Com0SendBuf[SendBufLen], Com1SendBuf[SendBufLen], ComProcessBuf[RecBufLen];
uchar xdata Com0RecBufIdx, Com1RecBufIdx;
bit Com0SaveEn, Com1SaveEn, Com0RecComplete, Com1RecComplete;

uchar xdata SystemState, PhaseNum, DectNum, RunMode, RunPlanNum, TotalPlanNum;


/******* function declare *********/
/*******                  *********/
void config (void);
void McuInit (void);

void delayus(uchar delayvalue);

void ComDataProcess(uchar *ComRecDataAdr, uchar *ComSendDataAdr);

void FlashWE(void) ;/*Write Enable (WREN) Instruction*/
void FlashWD(void);/*Write Disable (WRDI) Instruction*/
uchar FlashRDSR(void)  ;/*Read Status Register (RDSR) Instruction*/
						/*Status Register :bit7-2 non-used; bit1 WEL(write enable latch); bit0 WIP(write in progress)*/
void FlashRDB(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf);/*Read Data Bytes (READ)*/
void FlashReadFast(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf)	;/*Read Data Bytes at Higher Speed (FAST_READ)*/
void FlashPW(uint PageAdr, uchar Colum, uchar length, uchar *FlashBuf);/*Page Write (PW)*/
void FlashPE(uint PageAdr, uchar Colum) ;/*Page Erase (PE)*/ 
void FlashSE(uint PageAdr, uchar Colum) ;/*Sector Erase (SE)*/

void RamByteWR(uchar RowAdr, uchar ColumnAdr, uchar ramdata);/*write 1 byte to RAM*/
uchar RamByteRD(uchar RowAdr, uchar ColumnAdr);/*read 1 byte from RAM*/

/*******  main function   *********/
/*******                  *********/
void main()
{
	config();
	McuInit();

	/*read info from flash*/
	do
	{
		FlashRDB(BasicInfoStartAddr, 0x00, 256, FlashBuf);
	}while(FlashBuf[0]==0xFF);/*judge the first use ?*/

	PhaseNum = FlashBuf[64];
	DectNum = FlashBuf[65];

	FlashRDB(BasicInfoStartAddr+1, 0x00, 256, FlashBuf);
	RunMode = FlashBuf[0];
	RunPlanNum = FlashBuf[1];
	TotalPlanNum = FlashBuf[2];

	do
	{
		if(Com0RecComplete)
		{
			ComDataProcess(Com0RecBuf, Com0SendBuf);
			Com0RecComplete = 0;
		}
		if(Com1RecComplete)
		{
			Com1RecComplete = 0;
		}
	}while(1);
}

/*******  function body   *********/
/*******                  *********/
void McuInit (void)
{
	/*Timer2 for UART0; Timer4 for UART1; Timer3 for 1 second control
	SPI for FLASH; I2C for calender IC*/
	
	/*****  UART *****/
	Com0RecBufIdx = 0;
	Com1RecBufIdx = 0;
	Com0SaveEn = 0;
	Com1SaveEn = 0;
	Com0RecComplete = 0;
	Com1RecComplete = 0;
	
	/* FLASH */
	FlashCS = 1;
	FlashWD();/*Flash writtten disabled*/
	
	/*I2C master mode*/
	i2c_init();
}

/* delay function ; us unit for 22.1184 MHz*/
void delayus(uchar delayvalue)
{
	uchar idata i;
	for(i=0;i<delayvalue;i++)
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}
}

/**** timer3 for 1 second control ****/
void timer3_int(void) interrupt 14 using 0
{
	TMR3CN &= 0x7F;
}


void serial0_int(void) interrupt 4 using 1
{
	if(RI0)
    {
        RI0 = 0;
		if(Com0SaveEn)
		{
			Com0RecBuf[Com0RecBufIdx++] = SBUF0;	
			if(Com0RecBufIdx==RecBufLen)
				{
					Com0SaveEn = 0;
					Com0RecComplete = 1;
				}	
		}
		else
		{
			Com0RecBuf[0] = Com0RecBuf[1];
			Com0RecBuf[1] = SBUF0;
			if(Com0RecBuf[0]==0xEB&&Com0RecBuf[1]==0x90)
				{
					Com0SaveEn = 1;
					Com0RecBufIdx = 2;
				}
		}
    }
    if(TI0)
    {
        TI0=0;
/*		if (PacketIdx < TxPacketLen)	// Downlink Packet is unique to 32 Bytes.
		{
			IsTxBusy = TRUE;
			SBUF = *(BYTE *)(pTX_Buf + PacketIdx);
			PacketIdx ++;
		}
		else
		{
			IsTxBusy = FALSE;
			SBUF0 = 0x55;
		}*/
    }
}

void serial1_int(void) interrupt 20 using 2
{
	if((SCON1&0x01)==1)
    {
        SCON1 &= 0xFE;
		if(Com1SaveEn)
		{
			Com1RecBuf[Com1RecBufIdx++] = SBUF1;	
			if(Com1RecBufIdx==RecBufLen)
				{
					Com1SaveEn = 0;
					Com1RecComplete = 1;
				}	
		}
		else
		{
			Com1RecBuf[0] = Com1RecBuf[1];
			Com1RecBuf[1] = SBUF1;
			if(Com1RecBuf[0]==0xEB&&Com1RecBuf[1]==0x90)
				{
					Com1SaveEn = 1;
					Com1RecBufIdx = 2;
				}
		}
    }
    if((SCON1&0x02)==1)
    {
        SCON1 &= 0xFD;
/*		if (PacketIdx < TxPacketLen)	// Downlink Packet is unique to 32 Bytes.
		{
			IsTxBusy = TRUE;
			SBUF = *(BYTE *)(pTX_Buf + PacketIdx);
			PacketIdx ++;
		}
		else
		{
			IsTxBusy = FALSE;
			SBUF1 = 0x55;
		}*/
    }
}

/*process data received from com0 or com1*/
void ComDataProcess(uchar *ComRecDataAdr, uchar *ComSendDataAdr)
{
	uchar idata i,temp;
	uchar idata *point;
	uchar idata PlanNum, StageNum, TotalStage;

	uint idata PageAdr;
	uchar idata Colum, length;

	point = ComRecDataAdr;
	for(i=0;i<RecBufLen;i++)
	{
		ComProcessBuf[i] = *(point+i);
	}

	temp = ComProcessBuf[2];
	for(i=3;i<RecBufLen-1;i++)
	{
		temp ^=	ComProcessBuf[i];
	}

	if(temp==ComProcessBuf[RecBufLen-1])  /*valid data frame, process data received*/
	{
		switch (ComProcessBuf[2])
		{
		case WritePlans:	/*write plans to Flash*/
			RunMode = IsSetMode;
			PlanNum = ComProcessBuf[3];
			TotalStage = ComProcessBuf[4];
			StageNum = ComProcessBuf[5];
			PageAdr = PlanStartAddr + (uint)(PlanNum*10) + (uint)(StageNum/10);
			Colum = (StageNum%10)*25;
			length = 25;
			FlashWE();
			FlashPW(PageAdr, Colum, length, ComProcessBuf+6);
			if(StageNum==0x00)
			{
				PageAdr = PlanStartAddr + (uint)(PlanNum*10);
				Colum = 250;
				length = 1;
				*point = TotalStage;
				FlashPW(PageAdr, Colum, length, point);
			}
			break;
	
		case ReadPlans: /*read plans from Flash and send*/
			PlanNum = ComProcessBuf[3];
			StageNum = ComProcessBuf[5];
			PageAdr = PlanStartAddr + (uint)(PlanNum*10) + (uint)(StageNum/10);
			Colum = (StageNum%10)*25;
			length = 25;
			FlashWE();
			FlashRDB(PageAdr, Colum, length, ComSendDataAdr+6);
			for(i=0;i<6;i++)
			{
				*(ComSendDataAdr+i) = *(ComProcessBuf+i);
			}
			temp = *(ComSendDataAdr+2);
			for(i=3;i<RecBufLen-1;i++)
			{
				temp ^=	*(ComSendDataAdr+i);
			}
			*(ComSendDataAdr+RecBufLen-1) = temp;
			if(Com0RecComplete)
			{
				TI0 = 1;
			}
			if(Com1RecComplete)
			{
				SCON1 |= 0x02;
			}
			break;
		case WriteFaultTables:
			break;
		case ReadFaultTables:
			break;
		case WriteUserInfo:
			break;
		case ReadUserInfo:
			break;
		case WriteHardwareInfo:
			break;
		case ReadHardwareInfo:
			break;
		case WriteRunInfo:
			break;
		case ReadRunInfo:
			break;
		case WriteCalender:
			break;
		case ReadCalender:
			break;
		case DelLog:
			break;
		case ReadLog:
			break;
		case WriteDatetoPlan:
			break;
		case WritePhasetoVehicleDect:
			break;
		default:
			break;
		}
	}
	else /*invalid data frame*/
	{
	}
}

⌨️ 快捷键说明

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