CESHI:
DO;
$NOLIST
$INCLUDE(REG51.DCL)
$LIST
DECLARE DC LITERALLY 'DECLARE';
DC RAM(6) BYTE AT(30H) ;
DC RECEIVE_NUM BYTE;/****已经接收数据的个数***************/
DC FFH_NUM BYTE;/****收到ffh的个数*****/
DC RECEIVE_ING BYTE;/****=0FFH表示没有接收,=00h表示正在接收*******/
DC ACK_NACK BYTE;
DC SEND_NUM BYTE;
DC MILI_SECOND BYTE;/*****每5毫秒计一次*****/
DC COM8279 BYTE AT(4000H) AUXILIARY;
DC DAT8279 BYTE AT(0000H) AUXILIARY;
DC I BYTE;
/***************************************************/
/******************显示的数据转换*******/
LED: PROCEDURE (X) BYTE PUBLIC;
DC X BYTE;
DC Y BYTE;
DO CASE X;
Y=3FH;
Y=06H;
Y=5BH;
Y=4FH;
Y=66H;
Y=6DH;
Y=7DH;
Y=07H;
Y=7FH;
Y=6FH;
END;
RETURN (Y);
END LED;
/***********************DISPLAY**********/
DISPLAY: PROCEDURE;
COM8279=90H;
DO I=0 TO 5;
DAT8279=LED(RAM(I));
END;
RETURN;
END DISPLAY;
/***********************************************************************/
TIME_OPERATION: PROCEDURE;
IF MILI_SECOND>=2 THEN
DO;
MILI_SECOND=0;
CALL DISPLAY;
IF RAM(5)=0 THEN /*********一个数代表10毫秒位************/
DO;
IF RAM(0)=0 AND RAM(1)=0 AND RAM(2)=0 AND RAM(3)=0 AND RAM(4)=0 THEN
DO;
IE=10H;/***关闭定时器中断**调试时没有关掉**/
/*IP=10H; */
ENABLE;
TI=0;
ACK_NACK=0FH;/**计时开始******/
SEND_NUM=1;
SBUF=ACK_NACK;
GOTO RETURNNN;
END;
RAM(5)=9;
IF RAM(4)=0 THEN /******一个数代表100毫秒位*******/
DO;
RAM(4)=9;
IF RAM(3)=0 THEN /***秒的个位*/
DO;
RAM(3)=9;
IF RAM(2)=0 THEN /*秒的十位*****/
DO;
RAM(2)=5;
IF RAM(1)=0 THEN
DO;
RAM(1)=9;
RAM(0)=RAM(0)-1;
END;
ELSE
DO;
RAM(1)=RAM(1)-1;
END;
END;
ELSE
DO;
RAM(2)=RAM(2)-1;
END;
END;
ELSE
DO;
RAM(3)=RAM(3)-1;
END;
END;
ELSE
DO;
RAM(4)=RAM(4)-1;
END;
END;
ELSE
DO;
RAM(5)=RAM(5)-1;
END;
END;
RETURNNN: RETURN;
END TIME_OPERATION;
/*********end time_operation************/
INTER_T0: PROCEDURE INTERRUPT 1;
TH0=0EEH;
TL0=00H;
MILI_SECOND=MILI_SECOND+1;
CALL TIME_OPERATION;/********调处理程序********/
RETURN;
END INTER_T0;
/***********************************************************************/
INTER0:PROCEDURE INTERRUPT 0; /******外部中断**********/
IE=12H; /*****关外部中断,开定时器T0中断*************/
TCON=51H; /***打开定时器T0******/
TMOD=21H; /***定时器T0设为方式1,16位计数方式**********/
TH0=0EEH;
TL0=00H; /********/
IP=12H;
/*IE=92H; */ /*****关外部中断,开定时器T0中断*************/
/*TCON=50H;*/ /***打开定时器T0******/
/*TMOD=21H;*/ /***定时器T0设为方式1,16位计数方式**********/
/*IP=12H;
SCON=50H;*/
/*IE=0FFH;*/
TI=0;
ACK_NACK=0FAH;/**计时完毕******/
SEND_NUM=1;
SBUF=ACK_NACK;
ENABLE;
RETURN;
END INTER0;
/**************************************************/
INTER: PROCEDURE INTERRUPT 4;
DC X BYTE;
DC CS BYTE;
IF RI=1 THEN
DO;
RI=0;
X=SBUF;
IF RECEIVE_ING=0FFH THEN
DO;
IF X=0FFH THEN FFH_NUM=FFH_NUM+1;
ELSE IF X<> 78H THEN
DO;
FFH_NUM=0;
END;
ELSE IF X=78H AND FFH_NUM>=2 THEN
DO;
RECEIVE_NUM=0;/******开始接收清零**********/
RECEIVE_ING=0;/******正在接收中***************/
FFH_NUM=0;
END;
END;
ELSE /***********************/
DO;
RAM(RECEIVE_NUM)=X;
RECEIVE_NUM=RECEIVE_NUM+1;
IF RECEIVE_NUM>=7 THEN
DO;
CS=RAM(0) xor RAM(1) xor RAM(2) xor RAM(3) xor RAM(4) xor RAM(5);
RECEIVE_ING=0FFH; /***结束接收*************/
IF CS=RAM(6) THEN
DO;
TI=0;
SBUF=0FFH;/*****接收正确返回0ffh***********/
ACK_NACK=0FFH;
SEND_NUM=1;
/*********************实际要用这些************************/
IE=91H; /********外部中断打开******/
TCON=41H; /******设为负边沿触发方式**/
IP=11H;
/*************调试用程序*************************/
TH0=0EEH;
TL0=00H; /****X=65536-(110592OO/12)*5/1000 每5毫秒中断一次****/
MILI_SECOND=0;
/* ENABLE; */
/**************调试用程序*******************/
END;
ELSE
DO;
TI=0;
SBUF=0F0H; /****接收不正确返回0f0h**********/
ACK_NACK=0F0H;
SEND_NUM=1;
END;
END;
END;
END;/******end RI**********************/
IF TI=1 AND SEND_NUM <> 0 THEN
DO;
IF SEND_NUM<=2 THEN
DO;
CALL DISPLAY;
TI=0;
SBUF=ACK_NACK;
SEND_NUM=SEND_NUM+1;
IF SEND_NUM>=3 THEN SEND_NUM=0 ;
END;
END;
RETURN;
END INTER;
/****************************MAIN PROGRAM********************************/
START: SP=60H;
COM8279=2AH;/****FEN PIN****/
COM8279=00H; /****8BIT DISPLAY**/
DO I=0 TO 10;
COM8279=0D1H;/****QING 0*****/
CALL TIME(255);
CALL TIME(255);
END;
COM8279=90H;
DAT8279=0FFH;
DAT8279=0FFH;
DAT8279=0FFH;
DAT8279=0FFH;
DAT8279=0FFH;
DAT8279=0FFH;
DISABLE;
TMOD=20H; /*定时器T1 设定为方式2**/
TCON=40H; /*允许T1计数***/
PCON=80H; /* SMOD=1**/
TH1=0FFH; /*****/
TL1=0FFH;
IP=10H;
SCON=50H;
IE=10H; /****OPEN ES**/
RECEIVE_NUM=0;/****接收数据的个数***/
RECEIVE_ING=0FFH;/*=0FFH,表示没有接收*****************/
FFH_NUM=0;
SEND_NUM=0;
ACK_NACK=0;
/**************/
RAM(0)=0;
RAM(1)=0;
RAM(2)=0;
RAM(3)=0;
RAM(4)=0;
RAM(5)=0;
ENABLE;
/*SBUF=0F0H;*/
LOOP:
CALL DISPLAY;
CALL DISPLAY;
GOTO LOOP;
END CESHI;