串口通信IO口模拟

2 篇文章 0 订阅

#include "config.h"
#define DATA_OUT RB0
#define DATA_IN  RB1
//发码位数
uchar SendBitNum = 0;
//每位码时间
uchar SendBitDly = 0;
//发码标志位寄存器
uchar SendFlag = 0;
//发码数据寄存器
uint SendData = 0;
bit SendEn =0;
bit D0=0;
uchar SendWord(void)
{
  //是否允许发送
if(SendEn==0)
 {
   DATA_OUT =1;
   if(--SendBitDly>0) return 0 ;
   //重新发送数据
   D0=0;
   SendBitDly =1;
   //8*2+2
   SendBitNum =18;
   SendEn =1;
   //更新发送数据
   return 0;
 }
//发送1位数据 
if(--SendBitDly>0)
  {
   //发送数据位D0=1
   if(D0)
    {
      if(SendBitDly<9)
      {
        DATA_OUT= 0 ;
        return 0;
      } 
      DATA_OUT=1;
      return 0;
    } 
    //发送数据位D0=1
    if(SendBitDly<4)
     {
       DATA_OUT= 0 ;
       return 0;
     } 
    DATA_OUT=1;
    return 0;
   } 
//发送完1位数据
 SendBitDly=11;
//发送下1位 SendData 是一个16位的数据
  if(SendData&0x8000)  D0=1;
  else                 D0=0;
  //移位
  SendData<<=1;     
  //位数减少
  SendBitNum --;    
  //位数没有发完,继续发送 
  if(SendBitNum) return 0;
  //发完固定位数后
  SendBitDly =29;//延时28*125uS=3500us=3.5ms
  SendEn= 0;
  return 0;
}
//读取数据
uchar RHighDly=0;
uchar RLowDly=0;
bit Rold=0;//保存上一次收码口的状态
uchar RCnt=0;
uint WORD0=0;
uint WORD1=0;
uchar ReadWord(void)
{
  //接收到高电平
  if(DATA_IN)
  {
    RHighDly++;
    Rold = 1;
    if(RHighDly<17) return 0;
    //超过3ms重新接收
    RLowDly = 0;
    RCnt=32;
    return 0;
  }
//接收到低电平
REC_L:
  //计数低电平
  RLowDly++;
  if(Rold==0) 
  {
      RHighDly = 0;
      return 0;
  }    
 //REC_H_L : Rold=1;
 //保存本次电平 ROLD=0
 Rold=0;
 //跳转到第一次下降沿处理
 if(RLowDly==1) //goto REC_FST;
    {
       RCnt=32;
       WORD0=0;
       WORD1=0;
       return 0;
    }
  //低电平大于高电平时间为数据1,否则为0;
  //word0低16位 word1高16位
  WORD1<<=1; 
  if(WORD0&0x8000)
    {
      WORD1 |=1;
    }
  WORD0<<=1; 
  if(RLowDly>RHighDly)WORD0 |=1;
  //结束本次比较
  RHighDly=0;
  RLowDly=0;
  //重新计数
  RLowDly++;
  //接收下一位数据
 if(--RCnt!=0)    return 0;
//清零位计数器
 RCnt=0;
 //读取并保存数据
 return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值