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

📄 uart.c

📁 用CS5532做的无线吊钩称的吊称端程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>

#define TRUE        1
#define FALSE       0

#define TRANSMAX    12					//发送缓冲区的长度
#define RECNUM      64					//接受数组的长度

#define RESENDNUM   3					//先定义重发次数为3次

unsigned char xdata outbuff[TRANSMAX];		//发送缓冲区
unsigned char out_num;					//待发送的数据长度
unsigned char out_ptr;					//发送数据的指针
extern   signed long  data ad_out;			//读出的内码

extern bit in_send;					//正在发送数据标志
extern bit r_succes_b;					//成功接受一个字符的标志
extern bit pick;
extern bit stab1;
extern bit bat_crane;
extern bit BRecData;				//接收端已接收到数据(长度>=7个)标志

extern unsigned char bdata flag;

//接收用 
unsigned char xdata RecChar[RECNUM];	//接受数组
  signed char xdata RecCounter;		//接受字符指针
  signed char xdata RdCounter;		//读接收缓冲区的指针
unsigned char xdata TmpData[7];
unsigned  int RecInt;			//接收到数据转换成的整数 如OK__  为0x4f4b

//调用CRC校验程序
extern unsigned char CalCrc(unsigned char CRC_t,unsigned char dat);
unsigned char xdata Crc;


union
{
	float              f;
	unsigned char      c[4];
	unsigned long int  li;
	unsigned  int      i[2];
}tmp;


extern void DispStr(unsigned char code  *ptr_code);
extern unsigned char code err_10[];
extern void DispDigital(signed long li,signed char pos);
extern void delay (unsigned int loop);



extern unsigned char code err_11[];	//    = {0x0e,0x1a,0x1a,0x20,0x01,0x01};		//Err 11



unsigned char code SENDCHAR[] = {
	  0x02,0x12,'O','K',0x20,0x20,0,			//接收的数据正确。
	  0x02,0x12,'N','G',0x20,0x20,0,			//接收的数据错误,并请求重发
	  0x02,0x12,'A','S',0x20,0x20,0,			//请求发送数据。
	  0x02,0x12,'A','K',0x20,0x20,0,			//接收的数据正确并请求再次发送。
	  0x02,0x12,'S','U',0x20,0x20,0,			//关闭传感器和A/D转换的电源。
	  0x02,0x12,'N','A',0x20,0x20,0,			//没有有效的内码可发送
};


void chk_oe(void)
{
//	out_num = 0x5;			//发送长度-1
	out_ptr = 1;
	SBUF = outbuff[0];
	in_send = 1;
}


void SendStr(unsigned char num)
{
	unsigned char loop,ch;
//	num = num*7;
	Crc = 0;
	for (loop = 0; loop<6;loop++)
	{
		ch = SENDCHAR[loop+num*7];
		outbuff[loop] = ch;
		Crc = CalCrc(Crc,ch);
	}
	outbuff[6] = Crc;
	out_num = 0x06;
	chk_oe();
}

void SendDigital(signed long int li)
{
	Crc = 0;
	tmp.li = (unsigned long int)li;
	tmp.c[0] = flag;
	Crc = CalCrc(Crc,0x02);
	outbuff[0] = 0x02;
	Crc = CalCrc(Crc,0x11);
	outbuff[1] = 0x11;
	Crc = CalCrc(Crc,tmp.c[0]);
	outbuff[2] = tmp.c[0];
	Crc = CalCrc(Crc,tmp.c[1]);
	outbuff[3] = tmp.c[1];
	Crc = CalCrc(Crc,tmp.c[2]);
	outbuff[4] = tmp.c[2];
	Crc = CalCrc(Crc,tmp.c[3]);
	outbuff[5] = tmp.c[3];
	outbuff[6] = Crc;
	out_num = 0x06;
	chk_oe();
}

void int_es(void) interrupt 4				//串口中断
{	
	if ( _testbit_(RI) ) 
	{   		
		RecChar[RecCounter]=SBUF;
		RecCounter ++;
		r_succes_b = TRUE;
		if(RecCounter >= RECNUM)
		{
			RecCounter = 0;
		}
	}
	if (TI)
	{
		TI=0;
		if (in_send)
		{
			if (out_num)
			{
				SBUF = outbuff[out_ptr++];	   		//polishrequest[out_ptr++];
				out_num--;
			}
			else in_send = 0;
		}
	}

}

void InitUart(void)
{
	EA = 0;
/*	T2CON=0x30;
	TR2=FALSE;
	TH2=0xff;			///9600
	RCAP2H=0xff;
	TL2=0xdc;
	RCAP2L=0xdc;
	TR2 = TRUE;


	T2CON=0x30;
	TR2 = FALSE;
	TH2=0xff;			///4800
	RCAP2H=0xff;
	TL2=0xb8;
	RCAP2L=0xb8;
	TR2 = TRUE;

	
	T2CON=0x30;
	TR2 = FALSE;
	TH2=0xff;			///2400
	RCAP2H=0xff;
	TL2=0x70;
	RCAP2L=0x70;
	TR2 = TRUE;*/


	T2CON=0x30;
	TR2 = FALSE;
	TH2 = 0xfe;			///1200
	RCAP2H = 0xfe;
	TL2 = 0xe0;
	RCAP2L = 0xe0;
	TR2 = TRUE;
	EA = 1;
	RdCounter = RecCounter = 0;
}


unsigned char GetChar(void)		//从接收缓冲区读出字符
{
	unsigned char ch;
	if (RdCounter == RecCounter) return(0);

	ch = RecChar[RdCounter];
	RdCounter++;
	if ( RdCounter >= RECNUM ) RdCounter = 0;
	return(ch);
}

/*void find_CR(void)
{
	
	for ( ; ; )
	{
		if (RdCounter == RecCounter) return;
		if (RecChar[RdCounter] == 0x0d) return;
		RdCounter++;
		if ( RdCounter >= RECNUM ) RdCounter = 0;
	}
}*/


//从接收缓冲区的读指针之后num个位置读出字符,但读指针不变化
unsigned char RdChar(unsigned char num)
{
	num = RdCounter+num;
	if ( num >= RECNUM) num = num - RECNUM;
	return(RecChar[num]);
}

//读出缓冲区中的数据(主要是内码)
bit RdBufData(void)
{
	  signed char num;
	unsigned char ch;
	unsigned char Crc;
	unsigned char loop;

	num = RecCounter - RdCounter;
	if (num < 0) num = num + RECNUM;
	if (num < 7) return(FALSE);
	BRecData = TRUE;
	for ( ; ; )
	{
		ch = RdChar(0);
		if (ch == 0x02)
		{
			Crc = 0;	
			for (loop=0; loop<6; loop++)
			{
				ch = RdChar(loop);
				TmpData[loop] = ch;
				Crc = CalCrc(Crc,ch);
			}
			if (Crc != RdChar(6) ) goto Rd_0;
			tmp.c[0] = TmpData[2];
			tmp.c[1] = TmpData[3];
			RecInt = tmp.i[0];
/*			ACC = TmpData[2];
			ACC = ACC >> 4;
			CY = ACC & 0x01;		//ax带进位右移
			pick = CY;
			CY = ACC & 0x01;
			stab1 = CY;
			CY = ACC & 0x01;		//ax带进位右移
			bat_crane = CY;
			tmp.c[0] = 0;
			tmp.c[1] = TmpData[3];
			tmp.c[2] = TmpData[4];
			tmp.c[3] = TmpData[5];
			ad_out = tmp.li;*/
			RdCounter = RdCounter + 7;
			if (RdCounter >= RECNUM)  RdCounter = RdCounter - RECNUM;
			if (TmpData[1] != 0x12) return(FALSE);		//不是发给无线吊秤的数据
			return(TRUE);
		}
		else
		{
Rd_0:			GetChar();			//跳过0x02字符
			num--;
			if (num<7) return(FALSE);
		}
	}
}


⌨️ 快捷键说明

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