#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.51hei.com/bbs/) | Powered by Discuz! X3.1 |