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

📄 serial.c

📁 64输入32输出单片机程序
💻 C
字号:
//-------------------------------------------------------------------------
//	Filename :  Serial.C
//	Language :  C for AT89S8252
//	Revision :  1.0
//  Initial Date :  07/10/2000
//   Last Modify :
//  System clock :  24.00MHZ
//   Description :  Panel controller serial communication Plc64i32o
//-------------------------------------------------------------------------
#define _SERIAL_H_
#include <reg52.h>
#include "serial.h"
#undef _SERIAL_H_
//-------------------------------------------------------------------------
bit TransOK;
bit ReceEnd;
bit ReceData;
bit SerialMode;
unsigned char out_proc;
unsigned char in_proc;
unsigned char reply_wait;
sbit DE_RE = P3^2;
//-------------------------------------------------------------------------
void _init_serial (unsigned baud)
{
    RCAP2H = baud/256;
    RCAP2L = baud%256;
    T2CON = 0x34;
    SCON = 0x70;		// serial port mothed 1
    ES = ON;			// open serial port interrupt
    ReceData = TRUE;
    DE_RE = RXENABL;		// enable receive
    SerialMode = RXENABL;
    in_proc = RECE_STFLAG;
}
//-------------------------------------------------------------------------
void _trf_msge (char a,char c,char l)
{
    TransOK = FALSE;
    TranStream.address = a;
    TranStream.command = c;
    TranStream.length = l;
    SerialMode = TXENABL;
    DE_RE = TXENABL;
    SBUF = 0x7e;
    out_proc = SEND_ADDRESS;
}
//-------------------------------------------------------------------------
void _out_comm(void)	using 3
{
    if (TI == 1){
	TI = 0;
	if (SerialMode == TXENABL){
	    switch (out_proc){
		case SEND_ADDRESS :
		    SBUF=TranStream.address;
		    out_proc++;
		    break;
		case SEND_COMMAND :
		    SBUF=TranStream.command;
		    out_proc++;
		    break;
		case SEND_LENGTH :
		    SBUF=TranStream.length;
		    if (!TranStream.length)
			out_proc = SEND_WAIT;
		    else{
			out_proc++;
			TranStream.data_ptr = 0;
			TranStream.checksum = 0;}
		    break;
		case SEND_DATABLK :
		    SBUF = TranStream.datablk[TranStream.data_ptr];
		    TranStream.checksum += TranStream.datablk[TranStream.data_ptr];
		    if (++TranStream.data_ptr == TranStream.length)
			out_proc++;
		    break;
		case SEND_CHKSUM :
		    SBUF = TranStream.checksum;
		    out_proc++;
		    break;
		case SEND_WAIT :
		    DE_RE = RXENABL;
		    out_proc++;
		    reply_wait = RECENABL;
		    break;
		case SEND_END :
		    DE_RE = RXENABL;
		    SerialMode = RXENABL;
		    out_proc = SEND_ADDRESS;
	    }
	}
	else
	    DE_RE = RXENABL;
    }
}
//-------------------------------------------------------------------------
void _in_comm (void)	using 3
{
    if (RI == 1){
	RI = 0;
	if (reply_wait == RECENABL){
	    if(SBUF == 0x66)
		TransOK=PASS;
	    else
		TransOK=FALSE;
	    reply_wait = OFF;
	    DE_RE = TXENABL;
	    SBUF = 0x3c;
	}
	if (SerialMode == RXENABL){
	    switch (in_proc){
		case RECE_STFLAG :
		    if (SBUF == 0x7e)
			in_proc++;
		    break;
		case RECE_ADDRESS :
		    if (SBUF == ReceStream.address)
			in_proc++;
		    else
			in_proc = RECE_STFLAG;
		    break;
		case RECE_COMMAND :
		    ReceStream.command = SBUF;
		    in_proc++;
		    break;
		case RECE_LENGTH :
		    ReceStream.length = SBUF;
		    if (!ReceStream.length){
			in_proc = RECE_END;
			DE_RE = TXENABL;
			SBUF = 0x66;}
		    else{
			in_proc++;
			ReceStream.data_ptr = 0;
			ReceStream.checksum = 0;}
		    break;
		case RECE_DATABLK :
		    ReceStream.datablk[ReceStream.data_ptr++] = SBUF;
		    ReceStream.checksum += SBUF;
		    if (ReceStream.data_ptr == ReceStream.length)
			in_proc++;
		    break;
		case RECE_CHKSUM :
		    DE_RE = TXENABL;
		    if (ReceStream.checksum == SBUF){
			SBUF = 0x66;
			ReceData = TRUE;}
		    else{
			SBUF = 0xff;
			ReceData = WRONG;}
		    in_proc++;
		    break;
		case RECE_END :
		    if (SBUF == 0x3c)
			ReceEnd = FINISH;
		    else
			ReceEnd = FAILURE;
		    DE_RE = RXENABL;
		    SerialMode = RXENABL;
		    in_proc = RECE_STFLAG;
	    }
	}
    }
}
//-------------------------------------------------------------------------
//	 serial:  serial receiver / transmitter interrupt
//-------------------------------------------------------------------------
serial () interrupt 4	using 3 	// use registerbank 3 for interrupt
{
    unsigned char i;
    unsigned char length;
    _in_comm();
    _out_comm();
    if (ReceEnd == FINISH){
	if (ReceData == TRUE){
	    rece_com = ReceStream.command;
	    ReceEnd = OFF;
	    if (ReceStream.length){
		length = ReceStream.length + 1;
		for (i=0; i<length; i++){
		    rece_data[i] = ReceStream.datablk[i];
		}
	    }
	}
    }
}
//-------------------------------------------------------------------------

⌨️ 快捷键说明

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