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

📄 comok.c

📁 下位机串口模块程序
💻 C
字号:
#include <reg51.h>     
#include <intrins.h>   
sbit	P21=P2^1;
sbit	P16=P1^6;
sbit	P17=P1^7;
bit	flag_RECend=0;
bit flag_order=0;
bit flag_chksum=0;
unsigned	char	num=0;
unsigned	char	tnum=0;
unsigned	char	cnum=0;
unsigned   	char   	buffer1[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void	send_str(void);
void	delaytime(void);
void	order_is(void);
void	chksum(void);

void main(void)   
{   
	unsigned	char	k;
	num=0;
   	SP=0x60;                   
   	SCON=0x50;     
   	TMOD=0x20;   				
   	TH1=0xfd;   				
   	TL1=0xfd;   
   	PCON=0x00;   
   	TR1=1;  				
	EA=1;
   	ES=1;
	RI=0;
	TI=0; 
	while(1)
	{		
		if (flag_RECend==1)
		{	
			flag_RECend=0;
			delaytime();
			chksum();
			order_is();
			if ((flag_order==1) && (flag_chksum==1)) 
			{
				send_str();
				flag_order=0;
				flag_chksum=0;
			}
			delaytime();
			for (k=0;k<15;k++)
			{
				buffer1[k]=0;
			}
 		}
		P21=1; 
		P17=1;
		ES=1;
	}
}

void serial(void) interrupt 4 using 1 
{ 
	ES=0;
	P16=1;
	if (RI)
	 {
	 	unsigned	char	ch;
		RI=0;
		ch=SBUF;
		buffer1[num++]=ch;
		
		if (buffer1[0]!=0x5E)
		{
			num=0;
			goto exit;
		}
		
		if (buffer1[3]!=0)
		{
			if (buffer1[3]!=0xB2)
			{
				num=0;
				goto exit;
			}
		}
					
		if ((num==(buffer1[4]+7)) && (buffer1[num-1]=0xd))
		 {
			cnum=num;
			flag_RECend=1;
			num=0;
			P16=0;
		 }
	
	  }

exit:
	P16=1;
	ES=1;
}

void send_str(void)
{	
	unsigned	char	i;
	ES=0;
	P21=0;
	flag_RECend=0;
	for (i=0;i<tnum;i++)
	 {
      	SBUF=buffer1[i];
		P17=0;			
      	while (!TI); 
      	TI=0;
	 }
	ES=1;	
}

void chksum(void)
{
	unsigned	char	chksum;
	unsigned	int	j;
	chksum=0;
	for (j=1;j<cnum-2;j++)
	{
		chksum+=buffer1[j];
	}
	if (buffer1[cnum-2]==chksum)
	{
		flag_chksum=1;	
	}
}

void order_is(void)
{
	unsigned	char	n;
	switch (buffer1[5])
	{
		case 1:
			buffer1[4]=0x2;
			buffer1[5]=0x2;
			buffer1[6]=0x1;
			buffer1[7]=0;
			for (n=1;n<7;n++)
			{
				buffer1[7]+=buffer1[n];
			}
			buffer1[8]=0xd;
			tnum=9;
			flag_order=1;
			break;
		case 3:
			buffer1[4]=0x2;
			buffer1[5]=0x4;
			buffer1[6]=0x1;
			buffer1[7]=0;
			for (n=1;n<7;n++)
			{
				buffer1[7]+=buffer1[n];
			}
			buffer1[8]=0xd;
			tnum=9;
			flag_order=1;
			break;
		default:
			buffer1[0]=0x5e;
			buffer1[1]=0x10;
			buffer1[2]=0x1;
			buffer1[3]=0xb2;
			buffer1[4]=0x1;
			buffer1[5]=0x0;
			buffer1[6]=0;
			for (n=1;n<6;n++)
			{
				buffer1[6]+=buffer1[n];
			}
			buffer1[7]=0xd;
			tnum=8;
			flag_order=1;	
	 }
}

void delaytime(void)
{
	#pragma asm
	DELAY:	MOV	 70h,#1BH			
	DELAY2: PUSH 70h
	DELm1:  DJNZ 70h,DELm1  
	POP     70h           
    DJNZ    70h,DELAY2
    NOP
    NOP
    RET	
    #pragma endasm
}

⌨️ 快捷键说明

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