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

📄 main.c

📁 可编程光纤延迟线的开发系统!对仪器的开发很有帮助!
💻 C
字号:
/****************************************/
/* Copyright (c) 2004, 通信工程学院     */
/* All rights reserved.                 */
/****************************************/

#include "head.h"

void ClearR_bufR_data();		// 清除r_buf和r_data函数
void RecOverDeal();			    // 串口中断处理函数
void TimeOverDeal();			// 超时处理函数
void CheckErrorDeal();		    // 校验错误处理函数
void RecRightDeal();			// 接收正确处理函数

xdata uchar Flag_Data = 0 ;				//数据处理标志位
xdata uchar FLag_StartRec = 0 ;			//开始接受数据标志位
xdata uchar Flag_RecOver = 0 ;			//接收结束标志位
xdata uchar Flag_TimeOver = 0 ;			//接收超时标志位
xdata uchar Flag_CheckError = 0 ;		//校验错误标志位
xdata uchar Flag_CheckRight = 0 ;		//接收正确标志位

xdata uchar gCount = 0 ;
xdata uchar r_buf[11];					// 1开始字节"$",1长度字节LEN,
									    // 7字节数据,1校验和字节,
								    	// 1 结束字节"*"
xdata uchar r_data[7];
xdata ulong  RecData = 0 ;

xdata uchar TCount = 0 ;
xdata uchar Time0Sel = 0 ;

/* 定时器0中断服务子程序 */
void timer() interrupt 1 using 2
{	
	if (!Time0Sel) 
	{
		if (!Flag_RecOver) 
		{
			Flag_TimeOver = 1;			//超时100ms
			Flag_CheckError = 0;
			Flag_CheckRight = 0;
		}
		TH0 = -100000/256;
		TL0 = -100000%256;
		ET0 = 0;					
		TR0 = 0;
	}
	else
	{
		Time0Sel = 0;
		P1_0 = 0;				// 开关控制信号清零,形成脉冲
		ET0 = 1;					
		TR0 = 1;
	}
}

void main(void)
{
	ClearR_bufR_data();
	P1_0 = 0;
	Time0Sel = 0;
	
	/* 11.0592MHz下,设置串行口2400波特率,工作方式1
		8位数据位,1位停止位,无奇偶校验,*/
	TMOD = 0x21;
	SCON = 0xb8;
	PCON = 0x00;
	/* Timer1 定时器1 */
	TL1 = 0xf4;
	TH1 = 0xf4;	
	TR1=1;	
	
	/* Timer0 */
	PT0 = 1;
	TH0 = -100000/256;					//100ms
	TL0 = -100000%256;
		
	IE = 0x90;
	
	while (1) 
	{
		if (Flag_RecOver)
		{
			RecOverDeal();
			Flag_RecOver = 0;			
		}
		if (Flag_TimeOver)
		{		
			TimeOverDeal();	
			Flag_TimeOver = 0;
			RI = 0;
		}
		if (Flag_CheckError)
		{			
			CheckErrorDeal();	
			Flag_CheckError = 0;
			RI = 0;
		}
		if (Flag_CheckRight)
		{			
			RecRightDeal();	
			Flag_CheckRight = 0;
			RI = 0;						//打开接收中断
		}		
	}
}

/* 串口中断服务子程序 */
void serial ( ) interrupt 4 using 1 
{
	/* 判断是否收到字符'$',其数值为0x24,置开始接收标志位*/
	if ((!FLag_StartRec) && (SBUF == 0x24))
	{
		FLag_StartRec = 1;		
		
		/* 启动定时器0,计算超时*/	
		TH0 = -100000/256;
		TL0 = -100000%256;
		ET0 = 1;					
		TR0 = 1;
	}		
	if  ((FLag_StartRec) && (gCount <11))
	{
		r_buf[gCount ] = SBUF;
		gCount ++;		
	}
	/* 判断是否收到字符'*',其数值为0x2A,置接收完成标志位*/
	if ((r_buf[gCount -1] == 0x2A)||(gCount  == 11))
	{
		r_buf[gCount -1] == 0x2A;
		Flag_RecOver = 1;			//一帧接收完毕	
		gCount  = 0;		
		FLag_StartRec = 0;

		/* 关闭定时器0 */		
		ET0 = 0;					
		TR0 = 0;		
	}
	else
	{
		RI = 0 ;		
	}	
}

void ClearR_bufR_data(void)
{	
	uchar xdata k ;
	for (k=0;k++;k<11)
	{
		r_buf[k] = 0;
	}
	for (k=0;k++;k<7)
	{
		r_data[k] = 0;
	}
}

/* 接收完成处理函数*/
void RecOverDeal(void)
{
	uchar xdata j = 0;
	uchar xdata len = 0;
	uchar xdata CheckSum =0 ;
	len = r_buf[1];
	for ( j=0;j++;j<len)
	{
		r_data[j] = r_buf[j+2];
		CheckSum = CheckSum + r_data[j];
	}
	if (CheckSum == r_buf[len+2])
	{
		Flag_CheckRight = 1;				//接收正确
		Flag_CheckError = 0;
		Flag_TimeOver = 0;

		RecData  =0;
		for ( j=0;j++;j<r_data[1])
		{
			RecData =r_data[j] + RecData*10;
		}			
	}
	else
	{
		Flag_CheckError = 1;				//校验错误
		Flag_CheckRight = 0;
		Flag_TimeOver = 0;
	}	
	
}

/*  超时处理函数*/
void TimeOverDeal(void)
{
	ClearR_bufR_data();
	
	FLag_StartRec = 0;
	gCount = 0;
	
	SBUF = TIMEOVER;			//回送超时响应字节
	while ( TI ==0 );
	TI =0 ;		
}

/*  校验错误处理函数*/
void CheckErrorDeal(void)
{
	ClearR_bufR_data();	
	
	SBUF = CHECKERROR;			//回送校验错误响应字节
	while ( TI ==0 );
	TI =0 ;	
	
}

/*  接收正确处理函数*/
void RecRightDeal(void)
{
	unsigned char xdata i,j,k;
	unsigned long xdata tmp;
	unsigned char xdata D1,D2,D3 = 0;
	ClearR_bufR_data();

	TCount = 0;

	/* 产生开关控制信号*/
	tmp = RecData;
	if (tmp/V_2_19 == 1)
	{
		D3 = D3 + 0x08;		
		tmp = tmp%V_2_19;
	}
	else if (tmp/V_2_18 == 1)
	{
		D3 = D3 + 0x04;		
		tmp = tmp%V_2_18;
	}
	else if (tmp/V_2_17 == 1)
	{
		D3 = D3 + 0x02;		
		tmp = tmp%V_2_17;
	}	
	else if (tmp/V_2_16 == 1)
	{
		D3 = D3 + 0x01;		
		tmp = tmp%V_2_16;
	}	
	else if (tmp/V_2_15 == 1)
	{
		D2 = D2 + 0x80;		
		tmp = tmp%V_2_15;
	}	
	else if (tmp/V_2_14 == 1)
	{
		D2 = D2 + 0x40;		
		tmp = tmp%V_2_14;
	}
	else if (tmp/V_2_13 == 1)
	{
		D2 = D2 + 0x20;		
		tmp = tmp%V_2_13;
	}
	else if (tmp/V_2_12 == 1)
	{
		D2 = D2 + 0x10;		
		tmp = tmp%V_2_12;
	}
	else if (tmp/V_2_11 == 1)
	{
		D2 = D2 + 0x08;		
		tmp = tmp%V_2_11;
	}
	else if (tmp/V_2_10 == 1)
	{
		D2 = D2 + 0x04;		
		tmp = tmp%V_2_10;
	}
	else if (tmp/V_2_9 == 1)
	{
		D2 = D2 + 0x02;		
		tmp = tmp%V_2_9;
	}
	else if (tmp/V_2_8 == 1)
	{
		D2 = D2 + 0x01;		
		tmp = tmp%V_2_8;
	}
	else if (tmp/V_2_7 == 1)
	{
		D1 = D1 + 0x80;		
		tmp = tmp%V_2_7;
	}
	else if (tmp/V_2_6 == 1)
	{
		D1 = D1 + 0x40;		
		tmp = tmp%V_2_6;
	}
	else if (tmp/V_2_5 == 1)
	{
		D1 = D1 + 0x20;		
		tmp = tmp%V_2_5;
	}
	else if (tmp/V_2_4 == 1)
	{
		D1 = D1 + 0x10;		
		tmp = tmp%V_2_4;
	}
	else if (tmp/V_2_3 == 1)
	{
		D1 = D1 + 0x08;		
		tmp = tmp%V_2_3;
	}
	else if (tmp/V_2_2 == 1)
	{
		D1 = D1 + 0x04;		
		tmp = tmp%V_2_2;
	}
	else if (tmp/V_2_1 == 1)
	{
		D1 = D1 + 0x02;		
		tmp = tmp%V_2_1;
	}
	else if (tmp/V_2_0 == 1)
	{
		D1 = D1 + 0x01;			
	}

	P1_0 = 1;						  // 使能开关控制信号输出

	/* 写20位开关控制信号,D3取前4位 */
	KAIGUAN1 = D1;
	KAIGUAN2 = D2;
	KAIGUAN3 = D3;
	
	Time0Sel = 1;
	/* Timer0 */
	PT0 = 1;
	TH0 = -500000/256;				   //500ms, 开关控制脉冲宽度
	TL0 = -500000%256;
	/* 启动定时器0,计算超时*/		
	ET0 = 1;					
	TR0 = 1;
	

	// 延时几百毫秒
	for (i=0;i++;i<1000)
		for (j=0;j++;j<3000)
		{
			k=0;
		}
	
	SBUF = RECRIGHT;					//回送接收正确响应字节
	while ( TI ==0 );
	TI =0 ;			
}






⌨️ 快捷键说明

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