找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2640|回复: 0
打印 上一主题 下一主题
收起左侧

电力载波实现代码,值得纪念的日子

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小ARM菜菜
日照高科园


  今天下午半下午时间用来调试程序,上午时间把电路环景搭建起来,到现在完成电力载波的初步半双工通信!主要注意的是第一次收到的数据要丢弃,等待寄存器更新,并且要利用软件控制字节流,而不可以用硬件,因为你根本不知道他有多少字节,也就谈不上控制了,也就是说他仅仅模拟了一个收发器,你要在软件层面构建FIFO,另一点注意的是寄存器的配置和写保护!我就是吃了这个亏啊!

主要程序片段!》》》》》》》》》》》》》》》》》》

extern void SendOneByte(unsigned char c);                                            
   uchar data i;
   uchar  data state;                 // 载波通讯状态
  uchar data SSC_adr_bak;
  
  SSC_adr_bak=SSC_ADR;         //PRTECT
   SSC_ADR=0x00;                      //选择载波状态寄存器
   
   state= SSC_DAT;
   if ( ( state&0x01 ) == 1 )              //载波发送状态
   { // 载波发送

   if ( PLC_send_pointer !=PLC_total_len )
        
    {
       SSC_BUF=PLC_T_buf_bak[PLC_send_pointer];                  //发送下一个字节
       PLC_send_pointer++;
    }
    else
    {  //发送完成
      PLC_sending=0;                 // 清正在发送标志
      PLC_data=0;
      PLC_TLED=1;                    // 发送指示灯灭
    }
  }
  else
/******接收区**************************/
  {
      // printf_usart("接收");
  // SSC_ADR=0x00;                      //选择载波状态寄存器
   
     
     //SendOneByte(SSC_DAT) ;
  // 载波接收  

   PLC_Rxd_timer=20;         // 最大字节接收延时时间为1S
    if ( ( state&0x04 ) == 0x04 )     //如果接收的是祯头标志
    {
    //帧头
  

      if ( PLC_Rxd_state == 0 )       //如果处于等待接收状态
      {
             //接收第一个字节,并准备接收后面的字节
         PLC_recv_buf[0]=SSC_BUF;
         PLC_Rxd_pointer=0;      //lxw2006-3-2 17:07
         PLC_Rxd_state=1;
         PLC_RLED=0;         //接收指示灯亮
   
    PLC_Rxd_tlen=3;
  

      }
      else               // translate to rec
      {      
       PLC_Rxd_state=0;
       SSC_ADR=0X0;   
        SSC_DAT=0X0;
      }
    }

   //数据流
    else
    {
      if ( PLC_Rxd_state == 1 )       // 如果已经接收了祯头,继续接收后续字节
      {
      
        PLC_recv_buf[PLC_Rxd_pointer]=SSC_BUF;
        PLC_Rxd_pointer++;

        if ( PLC_Rxd_pointer==PLC_Rxd_tlen )
        {
           PLC_Rxd_OK=1;
           PLC_RLED=1;       //接收完毕灯灭
           PLC_Rxd_state=0;
           SSC_ADR=0;      
           SSC_DAT=0;
        }
      }
      else            
      {
       PLC_Rxd_state=0;
       SSC_ADR=0X0;   
        SSC_DAT=0X0;
      }
    }

  }

  SSC_ADR=SSC_adr_bak;

SSC_ADR=0XFF;        //
  SSC_DAT=0XFF;        // 禁止写保护
  
  SSC_ADR=0x01;        // 选择3105载波通讯控制寄存器1
  SSC_DAT=64;        // ZZZ 2007-10-15 前导1bit为64个

  SSC_ADR=0x03;        // 选择3201载波通讯控制寄存器3
  SSC_DAT=0xe0;        // 开启载波通讯功能,打开中断,选择接收状态置为3105模式
   
  SSC_ADR=0x04;      // 设置捕获门限
  SSC_DAT=LIMIT_3105;
  
  SSC_ADR=0XFF;
  SSC_DAT=0XAA;        // 使能写保护  

// 控制看门狗喂狗时间长度                  
  CKCON=0X3F;
  // 8位/16位运算模式选择位设置
  ALU_MOD=0;      // 设置成8位运算模式
  //载波通讯配置
//************   3201的载波寄存器设置  **********//
  set_PLC_3105 (  );   //上电为3105模式
  
  SSC_ADR=0xFF;
  SSC_DAT=0xFF;
  SSC_ADR=0x02;
  SSC_DAT=0x1F;
  SSC_ADR=0xFF;
  SSC_DAT=0x00;
  
//************   3201的载波寄存器设置  **********//
  EIE=0X01;                  //  ( A9H 使能INT2中断(EX2=1)
  IT2=1;                     //  ( C8H ) 为边沿触发方式(IT2=1)
  
  //串口通讯配置
  TMOD1 = 0x10 ;                       // 设 T/C1 为1分频模式,ZZZ
  TMOD = 0x21 ;                       // 设 T/C1 为定时方式2 设置为8位自装载计数器  T/C0 为定时方式 14
  SCON=0x50;                           // 工作方式1
  
  PCON=0X80;                           // 波特率加倍
  TH1=BPS2400;
  TL1=BPS2400;                        // 加倍设定波特率 9.6MHz ( 按1分频2400计算)
  TR1=1;                               // 启动定时器1
   
  // 定时器0中断配置
  TH0=0x63;
  TL0=0xcc;                // 定时 50 ms 一个定时中断
  TR0 = 1;                       // 启动 T0 定时器
  // 中断级别设置
  IP=0x02;                      // 定时器 T0 中断为高级中断
  EIP=1;                         // 外部中断2 为高级中断
  // 中断允许设置
  IE=0x82;                      // 允许ET0=1定时器 T0 中断;  开放中断



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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