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

📄 ser_my.c

📁 winbond单片机W77E58双串口通讯例子,串口1采集下终端数据,串口0等待主机接受
💻 C
字号:
#include<winbond\w77e58.h>
#define ser_dis0 P1_6
#define uchar unsigned char

extern uchar ser0_cal,ser1_cal;

void ser0_wrong();
void ser1_wrong();
void serial_init();

void k1_delay(unsigned int dltime);

uchar ser_cal(uchar *ser_ptmp,uchar lng_tmp);

extern uchar in0_lng,out0_lng,in1_lng,out1_lng,i;

extern uchar ser0_in[5],ser1_in[10],ser1_out[5];  

extern bit ser0_wait,ser0_busy;
extern bit ser1_busy;
extern bit ser1_err;

extern uchar idata ser0_out[99];

#define ser1_control P1_6
#define ser0_control P3_5

//////connect to pc
void serial_0(void)interrupt 4
{
	uchar sr_tmp;

	///////串口0接收
	if(RI)
	{
		sr_tmp=SBUF0;
		RI=0;
		if(in0_lng>4){in0_lng=0;return;}
		/////判断校验字节
		if(in0_lng==4)
		{
			REN=0;
			if(sr_tmp==0xfa)
			{
				ser0_control=1;
				out0_lng=0;
				in0_lng=0;
				ser0_busy=1;
				ES0=0;
				k1_delay(100);
				ES0=1;
				SBUF0=ser0_out[0];
			}
			else
			{
				ser0_wrong();
			}
			return;
		}
	  ////继续接收
		switch(in0_lng)
		{
			case 0:if(sr_tmp==0xaa){
				ser0_in[0]=0xaa;in0_lng++;ser0_cal=0xaa;
				}
				else ser0_wrong();break;
			case 1:if(sr_tmp==0x01){
				ser0_in[1]=0x01;in0_lng++;ser0_cal++;}
				else ser0_wrong();break;
			case 2:if(sr_tmp==0xff){
				ser0_in[2]=0xff;in0_lng++;ser0_cal+=0xff;}
				else ser0_wrong();break;
			case 3:if(sr_tmp!=ser0_cal)ser0_wrong();else in0_lng++;break;
			default :break;
		}	
	}
	////////串口0发送
	if(TI)
	{
		TI=0;
		if(out0_lng<98)
  		{
			out0_lng++;
 			SBUF0=ser0_out[out0_lng];
  		}
		else 
		{
			ser0_control=0;
			in0_lng=0;
			REN=1;
//			ser0_wait=0;
			ser_dis0=0;
			ser0_busy=0;
		}
	}
}
////串口0出错处理           
void ser0_wrong()
{
	ser0_busy=0;
	in0_lng=0;				
	REN=1;
}
  
////串口1 connect to pic
void serial_1(void)interrupt 7 using 1 
{    
	uchar sr_tmp;

	if(RI1)
	{
		sr_tmp=SBUF1;
		RI1=0;
		if(in1_lng>7){in1_lng=0;return;}
		/////判断校验字节
		if(in1_lng==7)
		{
			REN1=0;
			out1_lng=0;

			if(sr_tmp==0xfa)
			{
				ser1_control=1;
				ser1_busy=0;
				TR0=0;
			}
			return;
		}
	  ////继续接收
		switch(in1_lng)
		{
			case 0:if(sr_tmp==0xaa){
				ser1_in[0]=0xaa;in1_lng++;ser1_cal=0xaa;
				}
				break;
			case 1:if(sr_tmp==ser1_out[1]){
				ser1_in[1]=sr_tmp;in1_lng++;ser1_cal+=sr_tmp;}
				else in1_lng=0;break;
			case 6:if(ser1_cal==sr_tmp)in1_lng++;else in1_lng=0;break;
			default :ser1_in[in1_lng]=sr_tmp;in1_lng++;ser1_cal+=sr_tmp;break;
		}	
	}
	if(TI1)
	{
		TI1=0;
		if(out1_lng<4)
  		{
			out1_lng++;
   			SBUF1=ser1_out[out1_lng];
  		}
		else 
		{
			ser1_control=0;
			in1_lng=0;
			out1_lng=0;
			REN1=1;
			ser1_busy=1;
			TR0=1;
		}
	}
}
/////通讯校验计算

uchar ser_cal(uchar *ser_ptmp,uchar lng_tmp)
{
	uchar ser_ctmp;
	ser_ctmp=0;
	while(lng_tmp)
	{
		lng_tmp--;
		ser_ctmp+=*(ser_ptmp+lng_tmp);
	}
	return ser_ctmp;	
}


void serial_init()
{
     //串口1的设置
     	TMOD=0x22;      //定时器1工作在模式1
     	TL1=0xe8;      //baud rate=1200
     	TH1=0xe8;
		TL0=5;
		TH0=5;

     	SCON1=0x58;   //工作在模式1,允许接收
     	PCON=0x00; // SM0=0 SM1=1 在10位异步收发模式 SMOD=0 溢出速率/32 
     	ES1=1;    //串口1中断允许
     
     	SCON0=0x58;      //工作在模式1,接收允许
     	T2CON=0x30;  //用定时器2做串口0的波特率发生器
     	RCAP2H=0xff;   // 11.0592M晶振下,baud rate=9600 
     	RCAP2L=0xdc;

     	TR2=1;
		TR1=1;
		ES0=1;
		ET0=1;
		EA=1;      //允许总中断和串口0的中断
}

void k1_delay(unsigned int dltime)
{
	while(dltime)dltime--;
}

⌨️ 快捷键说明

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