#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; //發送幀結構 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; //發送幀結構變量 bit serial0_recv_end = 0; //接收完畢標志位 bit serial0_send_end = 0; //發送完畢標志位 bit flag = 1; uchar idata serv_data_count = 0; //接收內容字節計數器 uchar idata send_data_count = 0; //發送內容字節計數器 uchar idata serial0_recv_state = PC_RECV_IDEL; //接收過程判斷標志 uchar idata serial0_send_state = PC_SEND_IDEL; //發送過程判斷標志 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; //接收內容字節計數器清零 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 { //接收完畢后,還原接收初始狀態 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: //還原接收初始狀態,和累加和 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: //發送0x7e SBUF = FRAME_HEAD1; serial0_send_state = PC_SEND_HEAD; break; case PC_SEND_HEAD: SBUF = FRAME_HEAD2; //發送0x81 ps_fr.sf_chsum = 0x00; //清發送累加和 serial0_send_state = PC_SEND_LEN; break; case PC_SEND_LEN: //發送長度 SBUF = ps_fr.sf_len; ps_fr.sf_chsum = ps_fr.sf_chsum + ps_fr.sf_len; serial0_send_state = PC_SEND_ADDR; break; //計算發送累加和 case PC_SEND_ADDR: //發送地址 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: //發送類型 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: //發送幀序號 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; //清發送內容字節計數器 break; case PC_SEND_DATA: //發送內容字節,并計算累加和 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: //發送累加和 SBUF = ps_fr.sf_chsum; ps_fr.sf_chsum = 0x00; // serial0_send_end = 1; //置發送完畢標志位 serial0_send_state = PC_SEND_IDEL; break; default: ps_fr.sf_chsum = 0x00; serial0_send_state = PC_SEND_IDEL; break; } } } 總之程序非常怪異,不知道跑到哪里去了?希望回復能夠說的清楚一些
這個程序是干什么的? 運行平臺是什么
歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |