找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29406|回复: 1
收起左侧

[讨论]

[复制链接]
ID:25976 发表于 2010-9-14 12:27 | 显示全部楼层 |阅读模式
#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;
  }
  }
}


总之程序非常怪异,不知道跑到哪里去了?希望回复能够说的清楚一些 
回复

使用道具 举报

ID:1 发表于 2010-9-14 14:07 | 显示全部楼层

这个程序是干什么的?  运行平台是什么

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表