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

📄 ioserial.c

📁 pdh控制程序
💻 C
字号:
#ifndef _IO_SERIAL_C_
#define _IO_SERIAL_C_

#include "ioserial.h"
#include "serial.h"

EMULATE_UART data giocomm;
static bit rcvBit;

#define TIME_HALF_BAUDTO_9600_TH2 0xff
#define TIME_HALF_BAUDTO_9600_TL2 0xa0

void Extern_Interrupt(void) interrupt EXTERN0_INTERRUPT_VECTOR
{
/*	EMULATE_START_HALF_TIMER;*/
	TH2 = TIME_HALF_BAUDTO_9600_TH2;
	TL2 = TIME_HALF_BAUDTO_9600_TL2;

	/*start timer*/
	EMULATE_START_BAUD;

	/*stop extern interrupt,only startbit enable interrupt.*/
	EMULATE_STOP_EXT;
}

void Time1_Interrupt(void) interrupt TIME1_INTERRUPT_VECTOR using 1
{
	EMULATE_CLEAR_PEND;

	/*receive emulate UART*/
	if( giocomm.status == EMULATE_RECEIVE )
	{
		rcvBit = RECV; 

		/*start bit*/
		if( giocomm.bitCount == 0 )
		{
			giocomm.bitCount ++;
			giocomm.bitTemp = 0;
			return;
		}

		/*receive 8bits data*/
		else if( giocomm.bitCount < 9 )
		{
			giocomm.bitCount ++;    

			if( rcvBit )
				giocomm.bitTemp =  (giocomm.bitTemp>>1) | 0x80;
			else
				giocomm.bitTemp >>= 1;

			return;
		}

		/*receive the ten bits*/
		else if( giocomm.bitCount == 9 )
		{
			giocomm.bitCount ++;    
			return;
		}

		/*stop bit*/
		else if( giocomm.bitCount == 10 )
		{
			/*stop timer and receive bit*/
			EMULATE_STOP_BAUD;

			/*use interrupt, check start bit.*/
			EMULATE_START_EXT;

			giocomm.bitCount = 0;
			giocomm.byteTemp = giocomm.bitTemp;
			if( rcvBit )
			{
				gIoSerial.ReceiceBuffer[gIoSerial.Iocounter ++] = giocomm.byteTemp;
				gIoSerial.ReveiveOverTime = RECEIVE_TIME_START;

//				emulateReceiveIsr( giocomm.byteTemp );
				return;
			}
			else
			{
				emulateStartReceive();
				return;
			}
		}
		return;
	}

	/*send emulate UART */
	if( giocomm.status == EMULATE_TRANSMIT )
	{
		if( giocomm.bitValid == 1 )
		{
			/*send the start bit,start bit is 1*/
			if( giocomm.bitCount == 0 )
			{
				sendbit( LOW );
				giocomm.bitCount ++;
			}

			/*send the eight bit data*/
			else if( giocomm.bitCount < 9 )
			{
				sendbit( giocomm.bitTemp );
				giocomm.bitTemp >>= 1;
				giocomm.bitCount ++;
			}

			/*send the ten bit,is a verify but no use*/
			else if(giocomm.bitCount == 9)
			{
				giocomm.bitCount ++;
				sendbit( LOW );
			}

			/*send the stop bit*/
			else if(giocomm.bitCount == 10)
			{
				giocomm.bitCount ++;
				giocomm.bitValid = 0;
				sendbit( HIGH );
				emulateTransmitIsr();
			}
		}
		return;
	}
}

void setEmulateTransmitByte(BYTE value)
{
    giocomm.bitCount = 0;
    giocomm.bitValid = 1;
    giocomm.bitTemp = value;
    return;
}


void emulateStopReceive(void)
{
	DISABLE_INTERRUPT;

	EMULATE_STOP_EXT;
	EMULATE_STOP_BAUD;

	ENABLE_INTERRUPT;
}



void emulateStartSend(void)
{
	DISABLE_INTERRUPT;

	giocomm.status = EMULATE_TRANSMIT;

	giocomm.bitValid = 0;
	emulateTransmitIsr();  /*get bit temp*/

	EMULATE_STOP_EXT;    /*disable extern interrupt*/
	EMULATE_START_BAUD;

	ENABLE_INTERRUPT;
}

void initIocomm( void )
{
	IP = 0;       /*clear all priority*/
	EXT_IP = 1;
	EXT_IE = 1;
	EXT_EDGE = 1;   /*down edge interrupt*/

	TIMER_IP = 1;    /*timer in high priority*/
	TIMER_IE = 1;    /*enable timer interrupt*/

	T2CON = 0;
//	T2MOD = 0;
	RCAP2H = EMULATE_TIMER/256;
	RCAP2L = EMULATE_TIMER%256;

	emulateStartReceive();
}


#endif

⌨️ 快捷键说明

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