📄 scom.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 + -