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

📄 main.c

📁 51单片机rtos源代码
💻 C
字号:
#include <absacc.h>
#include <reg51.h>

#define         uchar           unsigned char
#define 	uint		unsigned int
#define		LedPort		XBYTE[0xC000]
#define		SwitchPort	XBYTE[0xC800]

bit		fscf,crcf,tsn,rsn,tfs,rfs,wxyf,jscf,stno,secflg;
bit		mute,sound,fireflag,startflag,faultflag,negs;
uchar data	crc1,crc2,cfcs,dest,netno,
		b2btime,wxycount,sectimer,bcount;

uchar data	keynum,keyfirst,imgcode;

uint  data	rpt,spt,tpt,onlpt,onlrpt,rrpt;

uchar data	month,day,hour,min,sec;

uchar xdata	firenum=0,firefirst=0,firecur=0,faultnum=0,faultfirst=0,faultcur=0,startnum=0,startfirst=0,startcur=0 ;

sbit		WDT	= P1^6;			/*WDT复位线 */
sbit		DRV485  = P1^4;			/*485发送有郊控制线 */
sbit		SpCtr	= P1^5;
sbit		BkLCtr  = P1^7;

/*uchar xdata	TrBuf[0x400];*/			/*发送缓冲区,1k个单元 */
/*uchar xdata	ReBuf[0x400];*/			/*接收缓冲区,32个单元  */
uchar xdata 	KeyBuf[0x10];			/*键值缓冲区,16个单元  */
uchar xdata	Fire[256][32];
uchar xdata	Fault[256][32];
uchar xdata	Start[256][32];

extern uchar data zkpb;

extern void	RS485(void);			/*485接收缓冲区处理子程序*/
/*extern void 	SW485(uchar,uchar);*/		/*向发送缓冲区装配信息帧*/
extern void	SIOT(void);			/*UART中断处理子程序*/
extern void	Delay(uchar);			/*延时子程序*/
extern void	Clear(void);
extern void     IntLcd(void);
extern void	OutEvent(uchar xdata *);
extern void 	DispNoEvent(uchar);
extern void 	ShowStartImg(void);
extern void	OutTNum(uchar,uchar);
extern void	OutCur(uchar);
extern void	INTLCD();
extern void     CLEAR();

void		KeyProc(void);
void		OutSec(void);
void		SelfTest(void);
void		DispEvent(uchar,uchar);

void  sint(void) interrupt 4 using 0		/*串行口中断程序,向量为4*/
{
	WDT = ~WDT;
	SIOT();
	WDT = ~WDT;
}

void  intx0(void) interrupt 0 using 3
{
	uchar tmpkey,i,j;
	tmpkey = P1 & 0x0F;
	Delay(50);
	if(tmpkey == ( P1 & 0xF ))
	{
		tmpkey = ~tmpkey;
		for(i = 0,j = 1;i<4;i++)
		{
			if((j&tmpkey) == j)
			{
				if(keynum <0x10)
				{
					keynum += 1;
					KeyBuf[ (keyfirst + keynum) & 0x0F ] = i;
				}
				else
				{
					KeyBuf[keyfirst] = i;
					keyfirst = ( keyfirst +1 ) & 0x0F;
				}
			}
			break;
		}
	}
}


void  intt0(void) interrupt 1 using 3		/*50ms中断处理子程序,中断向量1,工作寄存器组3*/
{
	TH0 = 0x87;
	TL0 = 0xFF;

	sectimer += 1;
	if(sectimer == 20) { sectimer = 0; sec = (sec + 1) % 60 ; secflg = 1;}

	if( wxycount != 0 )			/*wxycount每中断一次减1,当为0时置无响应标志位wxyf*/
	  {
	  	wxycount = wxycount - 1;
	  	if( wxycount == 0 ) wxyf = 1;
	  }
	if( b2btime != 0 )			/*b2bcount每中断一次减1,当为0时置接收错标志位jscf*/
	  {
	  	b2btime = b2btime - 1;
	  	if ( b2btime == 0 ) jscf = 1;
	  }
}


void main(void)
{

	PCON = 0x0;
	SCON = 0xF0;
	TMOD = 0x21;
	TH0 = 0xFB;
	TL0 = 0x32;
	SM2 = 1;
	netno = ( SwitchPort & 0x3F ) + 73;		/*拔码开关数据低3位加73为本机号*/
	stno = 1;
	WDT = ~WDT;

	if((SwitchPort & 0x80) == 0x80) { TH1 = TL1 = 0xFE; }	/*拔码开关数据第四位为0时baud = 4800bps,为1时baud = 9600bps*/
 	else { TH1 = TL1 = 0xFC; }

	SelfTest();
 	ET0 = 1;
 	TR0 = 1;
 	ES  = 1;
 	PS  = 1;
 	TR1 = 1;
 	EA = 1;
 	DRV485 = 0;
 	BkLCtr = 1;

        INTLCD();
        CLEAR();
 	ShowStartImg();

 	while (1)
 	{
 		if(keynum !=0) 	KeyProc();
 		if(secflg == 1)	{ OutSec(); secflg = 0;}
                /*if(rpt != rrpt)*/ RS485();
                if(fireflag == 1) {imgcode = 1; DispEvent( 0x01,firefirst + firecur ); fireflag = 0;}
                if(startflag == 1) {imgcode = 2; DispEvent( 0x02,startfirst + startcur ); startflag = 0;}
                if(faultflag == 1) {imgcode = 3; DispEvent( 0x03,faultfirst + faultcur ); faultflag = 0;}
        }
}


void SelfTest(void)
{
	uchar i;
	zkpb = 	LedPort;
	LedPort = LedPort | 0x0f;
	for(i = 0;i<100;i++);
	LedPort = zkpb;
}

void KeyProc(void)
{
	switch(KeyBuf[keyfirst])
	{
		case 0x00:
		{
			switch(imgcode)
			{
				case 0x00 : break;
				case 0x01 :
				{

					if(firecur > 0) firecur -= 1;
					DispEvent( 0x01,firefirst + firecur );
					break;
				}
				case 0x02 :
				{
					if(startcur >0) startcur -= 1;
					DispEvent( 0x02,startfirst + startcur );
					break;
				}
				case 0x03 :
				{
					if(faultcur >0) faultcur -= 1;
					DispEvent( 0x03,faultfirst + faultcur );
					break;
				}
				case 0x04 : break;
				default   : break;
			}
		}
		case 0x01:
		{
			switch(imgcode)
			{
				case 0x00 : break;
				case 0x01 :
				{
					if(firecur < (firenum - 1 )) firecur += 1;
					DispEvent( 0x01,firefirst + firecur );
					break;
				}
				case 0x02 :
				{
					if(startcur < (startnum - 1)) startcur += 1;
					DispEvent( 0x02,startfirst + startcur );
					break;
				}
				case 0x03 :
				{
					if(faultcur < (faultnum - 1)) faultcur += 1;
					DispEvent( 0x03,faultfirst + faultcur );
					break;
				}
				case 0x04 : break;
				default   : break;
			}
		}
		case 0x02:
		{
			if(imgcode != 0) imgcode = ( imgcode & 0x03 ) + 1 ;
			else break;

                        switch(imgcode)
			{
				case 0x01 :
				{
					if(firenum > 0)
					{
						DispEvent( 0x01,firefirst + firenum - 1 );
					        break;
					}
					else DispNoEvent( 0x01 );
					break;
				}
				case 0x02 :
				{
					if( startnum > 0)
					{
						DispEvent( 0x02,startfirst + startnum - 1 );
						break;
					}
					else DispNoEvent( 0x02 );
					break;
				}
				case 0x03 :
				{
					if( faultnum > 0 )
					{
						DispEvent( 0x03,faultfirst + faultnum - 1 );
					        break;
					}
					else DispNoEvent( 0x03 );
					break;
				}
			}
			break;
		}
		case 0x03:
		{
			mute = 1;
			sound = 0;
			break;
		}
	}
	keyfirst = ( keyfirst + 1 ) & 0x0F;
	keynum -= 1;
}

void DispEvent(uchar type,uchar loc)
{
	switch(type)
	{
		case 0x01 :
		{
			OutEvent(Fire[loc]);
		  	OutTNum(firenum,type);
		  	OutCur(firecur);
		  	break;
		}
		case 0x02 :
		{
			 OutEvent(Start[loc]);
			 OutTNum(startnum,type);
			 OutCur(startcur);
			 break;
		}
		case 0x03 :
		{
			OutEvent(Fault[loc]);
			OutTNum(faultnum,type);
			OutCur(faultcur);
		}

	}
}

⌨️ 快捷键说明

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