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

📄 scom.c

📁 一个充电控制器的完整单片机程序
💻 C
字号:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Scom test
//MCU communication and PC
//2003/04/13
//
//synchronization or in-phase
//
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#include <AT89X52.H>
#include <INTRINS.h>
#include <STDIO.H>
#include <AbsAcc.h>
#include <string.h>
#include "CHARGER.H"

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void init_serial(void)
{
     SCON = 0X50;
/*Timer 2 is being used to generate baud rates.*/
     RCAP2L = 0XE8;
     RCAP2H = 0XFF;
     T2CON = 0X34;
     ES = 1;            /*IE.4      */
     RI = 0;              /*SCON.0*/
}
//communication control charactor
	static unsigned char data comcontrol=0;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void Wmodem(char *s)
{
if(comcontrol!=0)return;
	ES=0;
	for(;*s;)
	{
		unsigned int data i;
		SBUF=*s++;
		while(!_testbit_(TI))if(i++>10000)break;
		i=0;
	}
	ES=1;
}
static unsigned char xdata rfrm[16] _at_ 0xDB90;//frame[0xAA][com][0xXX][0xXX]
static unsigned char xdata sfrm[16] _at_ 0xDBA0;//frame[0xAA][com][0xXX][0xXX]
static unsigned char xdata buf[60] _at_ 0xDBB0;//frame[0xAA][com][0xXX][0xXX]static unsigned char data count;
static unsigned int xdata *tmp;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Ready Maxim Data in buf
code unsigned char all[2]={21,13};
#define ALL_HIS all[0]
#define ALL_SET all[1]
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#define COM_READ_HIS  0x066
#define COM_COM_OK    0x099
#define COM_READ_SET  0x044
#define COM_WRITE_SET 0x033
#define COM_WRITE_OK= 0xEEEE;//
void onCommunication(void) interrupt SIO_VECTOR
{
	static int data dcount=0;//Send frame counter
	static int data rcount=0;//Recive data frame counter
	static unsigned char data scount=0;//Send frame char counter
	static unsigned char data count=0;//Recive frame char counter
	static unsigned char data oCe=0;
	static unsigned char data allcount=0;
	char i;
	tmp=0xDBB0;//

if(RI)
{
 	unsigned char data ocode;
//Recive Frame
	ocode=SBUF; RI=0;	
	if(oCe==0)
	{
		rfrm[count++]=ocode;oCe=1;
		if(rfrm[0] == 0xAA||rfrm[0] == 0x55);//Search the head of Frame
	  else {oCe=0;count=0;}//synchronization
		return;
	}

	if(rfrm[count-1]==~ocode)//IScheck 
	{
		oCe=0;
		if(count!=3) return;
	}
	else{oCe=0;count=0;return;}
	RESET_DOG;
	oCe=0; count=0;//an Frame End 
//Command Execite
	if(rfrm[0]==0xAA)
	{//explan command
		//start send
		tmp=0xDBB0;
		comcontrol=22;
		switch(rfrm[1])//UINT MAP(HIGHBYTE,LOWBYTE)
		{
		case COM_READ_HIS://Requear historydata
			{link p;		p=&today; allcount=ALL_HIS;
			for(i=0;i<rfrm[2];i++)p=p->up;//Move to The Day is Requear
			for(i=0;i<21;i++)//fill send buffer
			{if(i<3)*tmp++=p->date[i];
				else *tmp++=p->work[i-3];
			}}
			scount=0;		rcount=0;		dcount=0;		TI=1;
			break;
		case COM_READ_SET:
			for(i=0;i<12;i++)if(i!=10)*tmp++=sys[i];//sys[10] is NULL
			*tmp++=password; allcount=ALL_SET;
			*tmp++=adtemp;//just temp.
			scount=0;		rcount=0;		dcount=0;		TI=1;
			break;
		case COM_WRITE_SET://requer reciver data
			if(rfrm[2]==0x22)comcontrol=0x22;
			if(rfrm[2]==0xEE)comcontrol=0x99;
			scount=0;		rcount=0;		dcount=-1;
			return;
			break;
		default:break;
		}
	}
//Recieve Data process
	if(rfrm[0]==0x55)//recive seter
	if(comcontrol!=11)//Recive data no using, ==11
	{
		buf[rcount*2]=rfrm[1];
		buf[rcount*2+1]=rfrm[2];
		if(rcount<19)rcount++;//total 19 value
		else//All Recieve
	  {comcontrol=11;
			rcount=0;
			scount=0;
			dcount=0;
			allcount=24;
			TI=1;
		}
	}
	memset(rfrm,0,sizeof(rfrm));
}
//Send Data 
if(TI)
{
	TI=0;
	if(scount==0)
	{
		if(dcount<0)return;
		if(dcount==allcount)
		  {dcount=-80;comcontrol=0;return;}//Send end
		sfrm[0]=0x55;
		sfrm[1]=0xAA;
		sfrm[2]=buf[2*dcount];
		sfrm[3]=~sfrm[2];
		sfrm[4]=buf[2*dcount+1];
		sfrm[5]=~sfrm[4];
		dcount++;
		RESET_DOG;
	}
	if(scount<6)	
	{
		SBUF=sfrm[scount++];
	}
	if(scount>=6)scount=0;
}

}

#define system_volatage sys[7]
#define float_revise    sys[10]
#define test_temp   		sys[11]
#define desinged_rate   sys[12]

void SetSys(void)
{
if(comcontrol!=0x99)return;
{
int data i;
comcontrol=0;
			tmp=0xDBB0;
			for(i=0;i<6;i++)buf[i]=buf[2*i+1];
			setup12887(buf);
			for(i=0;i<12;i++)//seting
			{
				if(i<10)sys[i]=*(tmp+6+i);
				else if(i==10){test_temp=*(tmp+6+i);continue;}//sys[11] is test temp.
						 else{password=*(tmp+6+i);continue;}
			}
			just=test_temp-adtemp;
			i=0;while(stab[0][i]!=system_volatage){if(i<4)i++;else {i=10;break;}}
			if(i!=10)
			{
				desinged_rate=stab[4][i];//volotage float_revise
				float_revise=stab[3][i];//float_revise float_revise
			}
			init_rate_workpoint(5);
			memset((void*)buf,0,sizeof(buf));
			RESET_DOG;
}
}

//
/*
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
static void sendchar(unsigned char c) 
{
	unsigned int data i;
	SBUF=c;
	while(!_testbit_(TI))if(i++>10000)break;
}
static unsigned char recc()
{
	unsigned int data i;
	while(!_testbit_(RI))if(i++>10000)return 0;
	return SBUF;
}

*/



⌨️ 快捷键说明

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