#include <stc\STC10.h>
#include <intrins.h>
//#include "inc\serial.h"
#define MAX_LEN 80
#define FRAME_HEAD1 0x7e
#define FRAME_HEAD2 0x81
#define PC_RECV_IDEL 1
#define PC_RECV_HEAD 2
#define PC_RECV_LEN 3
#define PC_RECV_ADDR 4
#define PC_RECV_TYPE 5
#define PC_RECV_NUM 6
#define PC_RECV_DATA 7
#define PC_SEND_IDEL 1
#define PC_SEND_HEAD 2
#define PC_SEND_LEN 3
#define PC_SEND_ADDR 4
#define PC_SEND_TYPE 5
#define PC_SEND_NUM 6
#define PC_SEND_DATA 7
#define PC_SEND_CHSUM 8
sbit LC5520_CS = P2^7;
sbit LED_OUT = P1^7;
typedef unsigned char uchar;
typedef unsigned int uint;
//接收幀結構
typedef struct pc_recv_frame
{
uchar rf_len;
uint rf_addr;
uchar rf_type;
uchar rf_num;
uchar rf_dat[MAX_LEN];
uchar rf_chsum;
}pc_recv_fr;
//發(fā)送幀結構
typedef struct pc_send_frame
{
uchar sf_len;
uint sf_addr;
uchar sf_type;
uchar sf_num;
uchar sf_dat[MAX_LEN];
uchar sf_chsum;
}pc_send_fr;
pc_recv_fr pdata pr_fr; //接收幀結構變量
pc_send_fr pdata ps_fr; //發(fā)送幀結構變量
bit serial0_recv_end = 0; //接收完畢標志位
bit serial0_send_end = 0; //發(fā)送完畢標志位
bit flag = 1;
uchar idata serv_data_count = 0; //接收內容字節(jié)計數器
uchar idata send_data_count = 0; //發(fā)送內容字節(jié)計數器
uchar idata serial0_recv_state = PC_RECV_IDEL; //接收過程判斷標志
uchar idata serial0_send_state = PC_SEND_IDEL; //發(fā)送過程判斷標志
void init_system(void);
void reset (void);
void delay_ms(uint ms);
uchar read_data(uchar xdata *read_data_addr);
void main(void)
{
init_system();
LED_OUT = 0;
ps_fr.sf_len = 0x06;
ps_fr.sf_addr = 0x03;
ps_fr.sf_type = 0x01;
ps_fr.sf_num = 0x01;
ps_fr.sf_dat[0] = 0x02;
ps_fr.sf_dat[1] = 0x03;
while(1){
while(flag){
SBUF = 0x00;
flag = 0;
}
delay_ms(6000);
}
}
void init_system(void)
{
// SP = 0x60;
AUXR = AUXR | 0X42;
TMOD = 0x21;
TH1 = 0xE5;
TL1 = 0xE5;
TR1 = 1;
SCON = 0x50;
PCON = 0x80;
IE = 0x12;
IP = 0x10;
TH0 = 0xD8;
TL0 = 0xF0;
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
AUXR1 = 0x00;
LC5520_CS = 1;
ET0 = 0;
TR0 = 0;
ES = 1;
EA = 1;
}
uchar read_data(uchar xdata *read_data_addr)
{
uchar c;
LC5520_CS = 0;
c = *read_data_addr;
LC5520_CS = 1;
return c;
}
//軟件看門狗
//void reset (void)
//{
//((void (code *) (void)) 0x0000) ();
//}
/*delay 1 ms*/
void delay_ms(uint ms)
{
uint i;
uchar j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++) {
_nop_();
}
}
void serial_rec(void) interrupt 4 using 1
{
uchar tempSBUF;
if(RI)
{
RI = 0;
tempSBUF = SBUF;
switch(serial0_recv_state)
{
case PC_RECV_IDEL:
if(tempSBUF == FRAME_HEAD1) //幀頭為0x7e
serial0_recv_state = PC_RECV_HEAD;
break;
case PC_RECV_HEAD: //幀頭為0x81
if(tempSBUF == FRAME_HEAD2) {
serial0_recv_state = PC_RECV_LEN;
pr_fr.rf_chsum = 0x00; //清累加和
LED_OUT = !LED_OUT;
}
break;
case PC_RECV_LEN: //接收到長度
pr_fr.rf_len = tempSBUF; //從長度開始的計算累加和
serial0_recv_state = PC_RECV_ADDR;
pr_fr.rf_chsum = pr_fr.rf_chsum + tempSBUF;
break; //軟件仿真時,這個break開始就不是退出中斷程序了,不知程序轉哪里了
case PC_RECV_ADDR: //接收到地址
pr_fr.rf_addr = tempSBUF;
serial0_recv_state = PC_RECV_TYPE;
pr_fr.rf_chsum = pr_fr.rf_chsum + tempSBUF;
break;
case PC_RECV_TYPE: //接收到類型
pr_fr.rf_type = tempSBUF;
serial0_recv_state = PC_RECV_NUM;
pr_fr.rf_chsum = pr_fr.rf_chsum + tempSBUF;
break;
case PC_RECV_NUM: //接收到幀序號
pr_fr.rf_num = tempSBUF;
pr_fr.rf_chsum = pr_fr.rf_chsum + tempSBUF;
serial0_recv_state = PC_RECV_DATA;
serv_data_count = 0x00; //接收內容字節(jié)計數器清零
break;
case PC_RECV_DATA: //接收數據并算累加和
if(serv_data_count < (pr_fr.rf_len-4))
{
pr_fr.rf_dat[serv_data_count] = tempSBUF;
pr_fr.rf_chsum = pr_fr.rf_chsum + tempSBUF;
serv_data_count++;
}else
{ //接收完畢后,還原接收初始狀態(tài)
serial0_recv_state = PC_RECV_IDEL;
if(pr_fr.rf_chsum == tempSBUF)
{ //校驗累加和,相同,則置接收完畢標志位
serial0_recv_end = 1;
pr_fr.rf_chsum = 0x00;
}else
{ //校驗錯誤,清接累加和,以便下次接收
pr_fr.rf_chsum = 0x00;
}
}
break;
default: //還原接收初始狀態(tài),和累加和
serial0_recv_state = PC_RECV_IDEL;
pr_fr.rf_chsum = 0x00;
break;
}
} else if(TI)
{
TI = 0;
switch(serial0_send_state)
{
case PC_SEND_IDEL: //發(fā)送0x7e
SBUF = FRAME_HEAD1;
serial0_send_state = PC_SEND_HEAD;
break;
case PC_SEND_HEAD:
SBUF = FRAME_HEAD2; //發(fā)送0x81
ps_fr.sf_chsum = 0x00; //清發(fā)送累加和
serial0_send_state = PC_SEND_LEN;
break;
case PC_SEND_LEN: //發(fā)送長度
SBUF = ps_fr.sf_len;
ps_fr.sf_chsum = ps_fr.sf_chsum + ps_fr.sf_len;
serial0_send_state = PC_SEND_ADDR;
break; //計算發(fā)送累加和
case PC_SEND_ADDR: //發(fā)送地址
SBUF = ps_fr.sf_addr;
ps_fr.sf_chsum = ps_fr.sf_chsum + ps_fr.sf_addr;
serial0_send_state = PC_SEND_TYPE;
break;
case PC_SEND_TYPE: //發(fā)送類型
SBUF = ps_fr.sf_type;
ps_fr.sf_chsum = ps_fr.sf_chsum + ps_fr.sf_type;
serial0_send_state = PC_SEND_NUM;
break;
case PC_SEND_NUM: //發(fā)送幀序號
SBUF = ps_fr.sf_num;
ps_fr.sf_chsum = ps_fr.sf_chsum + ps_fr.sf_num;
serial0_send_state = PC_SEND_DATA;
send_data_count = 0x00; //清發(fā)送內容字節(jié)計數器
break;
case PC_SEND_DATA: //發(fā)送內容字節(jié),并計算累加和
if(send_data_count < (ps_fr.sf_len-4))
{
SBUF = ps_fr.sf_dat[send_data_count];
ps_fr.sf_chsum = ps_fr.sf_chsum + ps_fr.sf_dat[send_data_count];
send_data_count++;
}else
{serial0_send_state = PC_SEND_CHSUM;}
break;
case PC_SEND_CHSUM: //發(fā)送累加和
SBUF = ps_fr.sf_chsum;
ps_fr.sf_chsum = 0x00; //
serial0_send_end = 1; //置發(fā)送完畢標志位
serial0_send_state = PC_SEND_IDEL;
break;
default:
ps_fr.sf_chsum = 0x00;
serial0_send_state = PC_SEND_IDEL;
break;
}
}
}
總之程序非常怪異,不知道跑到哪里去了?希望回復能夠說的清楚一些
|