打印

如何编写模拟串口程序呢

[复制链接]
3816|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nanfang8|  楼主 | 2008-3-30 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
gyt| | 2008-3-31 12:21 | 只看该作者

不难啊

使用特权

评论回复
板凳
SupermanTm| | 2008-3-31 14:24 | 只看该作者

不难,用51和PIC我多做过

把你的问题MAIL过来,我给你份例程:supermantm@gmail.com

使用特权

评论回复
地板
nanfang8|  楼主 | 2008-3-31 20:27 | 只看该作者

mail

pingguo_166@163.com

使用特权

评论回复
5
nanfang8|  楼主 | 2008-3-31 20:28 | 只看该作者

dd

用模拟串口需要注意什么呢

使用特权

评论回复
6
xxdcq| | 2008-4-15 17:28 | 只看该作者

时间的精确性

使用特权

评论回复
7
xwj| | 2008-4-16 09:52 | 只看该作者

要学会用状态机,释放CPU

使用特权

评论回复
8
zenyin| | 2008-4-16 10:22 | 只看该作者

异步还是同步串口?

异步串口建议用定时器在定时中断内发送数据
先拉低发送口线再启动定时产生一个码元宽度的时间片,升起正发送数据标志,然后软件移位8次并输出到发送线上,呆第8次发送完毕,第9次开始时,拉高发送线,并清除发送标志,而在下一个(第9个结束第10个定时来到时)根据预先已经清除的发送志关闭定时器,进入等待下次发送状态.注意对51单片机而言,它是低位在前发送的(右移发送的).
同步移位,只要注意两点就够了,首先拉低模拟时钟线,然后往模拟数据线上移位输出数据并保持,然后升高模拟时钟线,即对51而言当时钟线低电平时送数高电平保持,同时也是右移的,如果外部速度慢可加NOP指令降低速度.

使用特权

评论回复
9
nanfang8|  楼主 | 2008-4-18 15:22 | 只看该作者

uu

状态机,释放CPU

使用特权

评论回复
10
NANFANG8| | 2008-5-21 13:26 | 只看该作者

D

要学会用状态机,释放CPU

使用特权

评论回复
11
wegoinrain| | 2008-5-21 13:48 | 只看该作者

波特率低可以,高了误码会有的!!

使用特权

评论回复
12
工控秀才| | 2008-5-21 22:16 | 只看该作者

看你用什么IC了

我模拟38000以上的波特率,双向也不难的.

使用特权

评论回复
13
雁舞白沙| | 2008-5-22 10:12 | 只看该作者

模拟接收

//-----本人制作(禁止转载)
//-----***-模拟接收-***-----//
void INT_INT0(void) interrupt 0
{    
    unsigned char i; 
    i=0;
    ChkFg=0;
    ChkBit=0;
    InData=0;
    InitDelay(5);
    while(i<10)
    {         
         if(i<9)
         {
              if(i>0)
              {
                   InData>>=1; 
                   if(HwRxd)
                      {
                           InData|=0x80;
                           ChkBit=~ChkBit;    
                      }
              }
         }   
         else
         {
              if(i==9)
              {
                   ChkFg=HwRxd;  
              }
         }          
         InitDelay(82);//--->11.0592M
         i++;
    }
    if(SendEndFg)//-------------------------------------------------------上次数据是否发送完毕?
    {
         if(ChkBit==ChkFg)
         {
              InDataFg=1;
               InDataTime=3;//---------------------------------------------如果两秒内没有接收结束自动中断接收并清除已经接收的数据
              if(InrBufDptr<=64)
              {
                   if(InrBufDptr==0)//------------------------------------数据缓冲区地址指针是否为零
                   {                                                               
                        if(InData==0x68)//--------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
                        {
                             InceptBuf[0]=0x68;
                               InrBufDptr=1;//------------------------------缓冲区地址累加
                        }
                        else
                        {
                             InrBufDptr=0;//------------------------------缓冲区地址归零
                        }
                    }
                    else
                    {                                 
                        if(InrBufDptr==7)//-------------------------------缓冲区指针是否等于7
                        {
                             if(InData==0x68)//---------------------------缓冲区已接收的第8位是否等于0x68
                             {
                                  InceptBuf[7]=0x68;//--------------------数据保存到缓冲区
                                  InrBufDptr=8;//-------------------------缓冲区地址累加
                             }
                             else
                             {
                                  InrBufDptr=0;//-------------------------缓冲区地址归零
                             }
                        }
                        else
                        {
                             InceptBuf[InrBufDptr]=InData;//--------------数据保存到缓冲区
                             InrBufDptr++;//------------------------------缓冲区地址累加
                        }
                   }
              }
              else
              {
                   InrBufDptr=0;//----------------------------------------缓冲区地址归零
              }
         }        
         if(InceptBuf[InceptBuf][9]+11]==0x16)//---------------------------是否完成一帧数据的接收?结束符是否等于0x16
         {
              SendStrFg=1;
               InrIndataFg=1;//--------------------------------------------非串口状态
                InrBufDptr=0;//---------------------------------------------缓冲区地址归零
                SendEndFg=0;//----------------------------------------------已发送完毕位归零
         }
         EX0=1;//---------------------------------------------------------使能接收            
    }
    else
    {
         EX0=0;//---------------------------------------------------------禁止接收
    } 
}

使用特权

评论回复
14
雁舞白沙| | 2008-5-22 10:13 | 只看该作者

模拟发送

//-----本人制作(禁止转载)
//-----***-模拟发送-***-----//
void InrSendByte(unsigned char Byte)
{
    unsigned char i;
    unsigned char ChkData;
    unsigned char SendData;
    EA=0;
    ChkBit=0;
    ChkData=Byte;
    SendData=Byte;
    for(i=0;i<8;i++)
    {
       if(ChkData & 0x80)
       {        
           ChkBit=~ChkBit;      
       }
       ChkData <<=1;    
    }
    HwTxd=0;
    Delay(82);
    for(i=0;i<8;i++)//----------------------------------------------------8个数据位
    {
        if(SendData & 0x01)
        {
             HwTxd=1;
        }
        else
        {
             HwTxd=0;
        }
        SendData >>=1;
        Delay(82);
    }
    HwTxd=ChkBit;
    Delay(82);
    HwTxd=1;
    Delay(72);
    AUXR1=0x00;   
    EA=1;
}

使用特权

评论回复
15
雁舞白沙| | 2008-5-23 09:26 | 只看该作者

一个问题,问了之后,大家踊跃的回答,可楼主那里去了?

使用特权

评论回复
16
starlite_jason| | 2008-5-23 10:42 | 只看该作者

在中断里等待接收发送不是很好,容错也不好

好处就是可以处理相对较高的波特率的收发

使用特权

评论回复
17
notpower| | 2008-5-23 11:06 | 只看该作者

不难。计算好时间,就行。

使用特权

评论回复
18
n_ever| | 2008-5-27 16:41 | 只看该作者

哥们,最难的就是计算时间了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

172

主题

406

帖子

0

粉丝