打印

模拟串口的问题

[复制链接]
4677|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nanfang8|  楼主 | 2007-6-21 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
njxmh| | 2007-6-21 15:49 | 只看该作者

一个例子

模拟串口用定时器完成,每一个串口要占用一个定时器,发送很好办,每次定时器中断(1BIT的时间)传送一个Bit,接收就要你好好处理了
这个我模拟的一个串口,用的W77E58,实际工作时只用到了半双工


//使用硬件:定时器0,定时器0中断,定时器1中断,外中断5
//波特率      9600 4800 2400 1200 600   300
//每BIT周期数  96  96*2 96*4 96*8 96*16 96*32
//以96为单位不同的波特率选用不同的倍率
//如果对方在每位的1/2处采样,则发送中断的响应时间最多是48个时钟周期
//也许可以置发送中断以较高的优先级来解决,实验表明发送可以工作于9600
//但若有其它中断,并且串口工作于全双工,则晶体频率最好是22.1184以上
//!!实测表明当用11.0592时钟,标准51,收发同时,最高只能到2400波特。
//但单发可以工作于9600
//-----------------------------------------------------------
#define    BAUD_RATE    300
//#define    BAUD_RATE    600
//#define    BAUD_RATE    1200
//#define    BAUD_RATE    2400
//#define    BAUD_RATE    4800
//#define    BAUD_RATE    9600

#define    clock 110592
//#define    clock 221184


#define    RELOAD(TIMER,SVALUE)    TIMER+=SVALUE+1

bit    tTI;
bit    rRI;

unsigned char rSBUF;
unsigned char tSBUF;

unsigned char rSBUF0;
unsigned char RxdCnt;
unsigned char rSmpCnt;

unsigned char TxdCnt;
unsigned char tSmpCnt;
unsigned char multiple;
//-----------------------------------------------------------

void    SimuUARTinit(void)
{
#if    BAUD_RATE==300
    if(clock==110592)
    multiple=32;
    else if(clock==221184)
    multiple=64;
#endif
#if    BAUD_RATE==600
    if(clock==110592)
    multiple=16;
    else if(clock==221184)
    multiple=32;
#endif
#if    BAUD_RATE==1200
    if(clock==110592)
    multiple=8;
    else if(clock==221184)
    multiple=16;
#endif
#if    BAUD_RATE==2400
    if(clock==110592)
    multiple=4;
    else if(clock==221184)
    multiple=8;
#endif
#if    BAUD_RATE==4800
    if(clock==110592)
    multiple=2;
    else if(clock==221184)
    multiple=4;
#endif
#if    BAUD_RATE==9600
    if(clock==110592)
    multiple=1;
    else if(clock==221184)
    multiple=2;
#endif
    tTI=1;
    tTXD=1;
    rRXD=1;

    TMOD&=0xf0;
    TMOD|=0x03;
    ET0=1;
    ET1=1;
    TR0=1;
    IT0=1;
    EX0=1;
    TR1=1;
    PT1=1;  //置串口发送为高优先级
    EA=1;
}
//-----------------------------------------------------------
//模拟串口发送中断,原定时器1中断
void    IntTH0(void)    interrupt 3
{
    RELOAD(TH0,-96);
    if(--tSmpCnt == 0)
    {       
        tSmpCnt=multiple;
        if(tTI) return;
        switch(TxdCnt++)
        {
        case    0:
            tTXD=0;
            break;
        case    9:
            tTXD=1;
            tTI=1;
            TxdCnt=0;
            break;
        default:
            tTXD=tSBUF&0x01;
            tSBUF>>=1;
            break;
        }
    }
}
//-----------------------------------------------------------
void    RxdInt0(void)   interrupt 0
{
    TL0=-96+4;     //The time of inter interrup
    ET0=1;
    TF0=0;
    rSmpCnt=multiple/2;
}
//----------------------------------------------------------
//模拟串口接收中断,原定时器0中断
void    IntTL0(void)    interrupt 1
{
    RELOAD(TL0,-96);

    if(--rSmpCnt == 0)
    {
        rSmpCnt=multiple;
        switch(RxdCnt++)
              {
        case    0:
            if(rRXD==1){RxdCnt=0;}//ET0=0 added,no start bit found then stop interrup
            break;
        case    9:
            RxdCnt=0;
            if(rRXD==0) return;
            rSBUF=rSBUF0;
            rRI=1;
            break;
        default:
            if(RxdCnt>9){ RxdCnt=0;return;}
            rSBUF0>>=1;
            rSBUF0|=rRXD?0x80:0;
            break;
        }
    }
}
//-----------------------------------------------------------

使用特权

评论回复
板凳
nanfang8|  楼主 | 2007-6-21 16:37 | 只看该作者

yy

模拟串口用什么I/O端口都可以吗,它是如何发送和接收的呢

使用特权

评论回复
地板
工控秀才| | 2007-6-21 20:29 | 只看该作者

踩我地盘

可以挑战一般MCU的串口模拟.
多路双工都没有问题的.

使用特权

评论回复
5
nanfang8|  楼主 | 2007-6-22 16:12 | 只看该作者

fff

模拟串口一般一个配一个定时器,为什么二楼用了这么多的硬件电路

使用特权

评论回复
6
nanfang8|  楼主 | 2007-6-22 16:14 | 只看该作者

方法

哪位有这方面的电路让我借鉴一下,我刚刚接触这种串口通讯

使用特权

评论回复
7
sjl2006| | 2007-6-23 10:21 | 只看该作者

模拟串口一般不需要额外的硬件电路

从IO口送出即可

使用特权

评论回复
8
nanfang8|  楼主 | 2007-6-23 13:07 | 只看该作者

模拟串口一般不需要额外的硬件电路

难道模拟串口不需要232电平转换吗

使用特权

评论回复
9
nanfang8|  楼主 | 2007-6-23 13:08 | 只看该作者

模拟串口

模拟串口通讯的话它的有效距离是多少呢

使用特权

评论回复
10
sjl2006| | 2007-6-23 16:05 | 只看该作者

模拟串口是指用软件实现硬件串口的功能

如果用232接口,就要电平转换,如果直接用TTL接口,则不需要。
通讯距离看你的接口电平和传输速率,一般TTL在3米以内,232可到十米。

使用特权

评论回复
11
nanfang8|  楼主 | 2007-6-25 08:48 | 只看该作者

ff

是这样谢谢

使用特权

评论回复
12
gyt| | 2007-6-25 09:59 | 只看该作者

一样

在单片机对外的时候,模拟串口和原来的串口其实差不多,原来不用外接硬件则仍然不用,原来要用外接硬件则还是要用。

使用特权

评论回复
13
nanfang8|  楼主 | 2007-6-26 13:08 | 只看该作者

ff

原来不用外接硬件则仍然不用,原来要用外接硬件则还是要用
这是什么意思我不太明白

使用特权

评论回复
14
车载音响| | 2007-6-26 13:14 | 只看该作者

楼上:用io口模拟uart,跟硬件外围没有什么关系

使用特权

评论回复
15
gyt| | 2007-6-26 20:07 | 只看该作者

就是按照原来的串口一样使用的意思:)

使用特权

评论回复
16
后学| | 2007-6-27 08:18 | 只看该作者

占用资源挺多的,

使用特权

评论回复
17
nanfang8|  楼主 | 2007-6-29 08:01 | 只看该作者

ggg

16楼为什么说占用资源很多呢

使用特权

评论回复
18
sjl2006| | 2007-6-29 10:29 | 只看该作者

软件模拟串口

要用掉至少两个I/O口,如果不用定时器的话就要用软件延时,比较耗CPU。

使用特权

评论回复
19
gyt| | 2007-6-29 10:42 | 只看该作者

这位大虾的意思是占用了很多软件资源。如果你不介意,那就无所谓啦。

使用特权

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

本版积分规则

172

主题

406

帖子

0

粉丝