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

📄 rs485串口.c

📁 485程序,用于串口的开发.Ofdm-UWB的仿真模型图
💻 C
字号:
const char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ; 
#include "16f873.h"
#include "int16cxx.h"

#define ENABLE	1
#define DISABLE	0
#define TRUE	1
#define FAULT	0
#define RECEIVE_EN	0
#define TRANSFER_EN	1

#pragma bit IO1	@ PORTB.5
#pragma bit IO2	@ PORTB.6
#pragma bit IO3	@ PORTB.7
#pragma bit C_EN @ PORTC.2

#pragma	origin = 0x4

uns8 rc_temp,rxbuf[8],uchCRCHi,uchCRCLo,addr,txbuf[8],receive_count,dis_hz,dis_current;
uns8 set_hz,set_run;
uns16 dis_error,dis_running;
bit receive_ok,transfer_ok,_8ms_count_ok;

/* Table of CRC values for high-order byte */


/* Table of CRC values for low-order byte */

const char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;

interrupt server(void)
{
	uns8 temp8;
	int_save_registers	// W, STATUS (and PCLATH)
	char sv_FSR=FSR;
	if(T0IF)
	{
		TMR0=100;	//8ms interrupt
		PS2=1;		//prescale value=1:256
		PS1=1;		//5000KHz/256=19.53125KHz,19.53125K/156=0.125KHz(8ms)
		PS0=1;
		_8ms_count_ok=ENABLE;
		T0IF=0;
	}
	if(INTF)
	{
		INTF=0;
	}
	if(TMR1IF)
	{
		TMR2IF=0;
	}
	if(RCIF)
	{
		rc_temp=RCREG;
		if(receive_ok==FAULT)
		{
			if(_8ms_count_ok)
				receive_count=0;
			if(receive_count<8)
				rxbuf[receive_count]=rc_temp;
			if(receive_count==7 && addr==rxbuf[0])
				receive_ok=TRUE;
			receive_count++;
		}
		
		_8ms_count_ok=DISABLE;
		TMR0=100;		//timer0 reset,count again
		
		RCIF=0;
	}
	if(SSPIF && SSPIE)
	{
		SSPIF=0;
	}
	FSR=sv_FSR;
	int_restore_registers
}

page1 uns16 crc16(uns8 *puchMsg,uns8 crc_count)
{
	uns8 uindex;
	uns16 temp16;
	uchCRCHi=0xff;
	uchCRCLo=0xff;
	while(crc_count)
	{
		uindex=uchCRCHi ^ *puchMsg;
		puchMsg++;
		uchCRCHi=uchCRCLo ^ auchCRCHi[uindex];
		uchCRCLo=auchCRCLo[uindex];
		crc_count--;
	}
	temp16=(uns16)uchCRCHi << 8;
	temp16=temp16 | uchCRCLo;
	return temp16;
}

page0 void main(void)
{
	uns8 i;
	uns16 temp16;
	TRISA=0b11111111;
	TRISB=0b00011111;	//RB7(IO3) RB6(IO2) RB5(IO1)->output
	TRISC=0b10111011;	//RC7(RX) RC6(TX) RC2(C_EN)->output
	IO1=0;
	IO2=0;
	IO3=0;
	addr=0x06;
	dis_hz=79;
	dis_current=80;
	dis_error=87;
	dis_running=85;		//bit2->0=stop,1=run
						//bit14->0=FR,1=RR
	_8ms_count_ok=DISABLE;
	receive_ok=FAULT;
	transfer_ok=TRUE;
	receive_count=0;
	C_EN=RECEIVE_EN;
	BRGH=1;
	SYNC=0;
	SPEN=1;
	TXIE=0;
	RCIE=1;
	TX9=0;	//8 data bit transfer
	SPBRG=64;	// baud rate=20M/16(64+1)=19230
	TXEN=1;
	CREN=1;		//receive enable
	
	T0CS=0;		//TIMER0 clock=Fosc/4=20MHz/4=5MHz
	TMR0=100;	//256-156
	PSA=0;		//use prescaler
	PS2=1;		//prescale value=1:256
	PS1=1;		//5000KHz/256=19.53125KHz,19.53125K/156=0.125KHz(8ms)
	PS0=1;
	T0IE=1;		//TIMER0 enable
	
	PEIE=1;
	GIE=1;
	rxbuf[0]=0x11;
	rxbuf[1]=0x03;
	rxbuf[2]=0x00;
	rxbuf[3]=0x6b;
	rxbuf[4]=0x00;
	rxbuf[5]=0x03;
	rxbuf[6]=0x01;
	rxbuf[7]=0x02;
	i=0;
	while(1)
	{
		if(receive_ok==TRUE)
		{
			temp16=crc16(rxbuf,6);
			if(rxbuf[6]==temp16.high8 && rxbuf[7]==temp16.low8)
			{
				switch(rxbuf[1])
				{
					case 0x03:
						txbuf[0]=rxbuf[0];
						txbuf[1]=rxbuf[1];
						txbuf[2]=2;		//byte count
						txbuf[3]=0;		//data high byte
						switch(rxbuf[3])
						{
							case 0:
								txbuf[4]=set_hz;	//set hz
								break;
							case 85:
								txbuf[4]=set_run;	//set run
								break;
							case 78:	//display Hz
								txbuf[4]=dis_hz;	//data low byte
								break;
							case 79:	//display current
								txbuf[4]=dis_current;	//data low byte
								break;
							case 84:	//display running state
								txbuf[3]=dis_running.high8;	//data high byte
								txbuf[4]=dis_running.low8;	//data low byte
								break;
							case 86:	//display error code
								txbuf[3]=dis_error.high8;	//data high byte
								txbuf[4]=dis_error.low8;	//data low byte
						}
						temp16=crc16(txbuf,5);
						txbuf[5]=temp16.high8;
						txbuf[6]=temp16.low8;
						transfer_ok=FAULT;
						break;
					case 0x06:
						txbuf[0]=rxbuf[0];
						txbuf[1]=rxbuf[1];
						txbuf[2]=rxbuf[2];
						txbuf[3]=rxbuf[3];
						txbuf[4]=rxbuf[4];
						txbuf[5]=rxbuf[5];
						txbuf[6]=rxbuf[6];
						txbuf[7]=rxbuf[7];
						switch(rxbuf[3])
						{
							case 0:		//set Hz
								set_hz=rxbuf[5];
								break;
							case 85:	//set run
								set_run=rxbuf[5];
							
						}
						transfer_ok=FAULT;
				}
			}
			receive_ok=FAULT;
		}
		if(TXIF && TRMT && transfer_ok==FAULT)
		{
			C_EN=TRANSFER_EN;
			TXREG=txbuf[i];
			i++;
			if(i==7 && txbuf[1]==3)
			{
				transfer_ok=TRUE;
				i=0;
			}
			if(i==8 && txbuf[1]==6)
			{
				transfer_ok=TRUE;
				i=0;
			}
		}
		if(TRMT)
			C_EN=RECEIVE_EN;
	}
}

⌨️ 快捷键说明

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