打印

新设计的一款VC5416系统

[复制链接]
楼主: pbxywyq
手机看帖
扫描二维码
随时随地手机跟帖
41
jin_jinchi| | 2007-9-27 10:43 | 只看该作者 回帖奖励 |倒序浏览

强帖留名

真是仰慕啊,什么时候才能有此等水平
我也希望看到楼主的原理图,jinchi@eyou.com
先谢谢了
继续关注中~~~

使用特权

评论回复
42
suwei123| | 2007-9-28 00:45 | 只看该作者

可否提供原理图~~~

suweibus@163.com
谢谢!

使用特权

评论回复
43
suwei123| | 2007-9-30 10:14 | 只看该作者

谢谢

收到原理图了~,呵呵,谢谢~

使用特权

评论回复
44
jxc827| | 2007-10-1 08:57 | 只看该作者

楼主,能否给我也发一份原理图!

谢谢,以前看都贴出来,现在没有了。
jxc827@126.com

使用特权

评论回复
45
maxing| | 2007-10-7 18:28 | 只看该作者

实在是精彩!!!

要多多学习才行~~!

使用特权

评论回复
46
xiaoing| | 2007-10-12 08:18 | 只看该作者

使用特权

评论回复
47
ocon| | 2007-10-15 01:07 | 只看该作者

hehe,没玩过DSP,不过楼主的板子很漂亮,看着舒服。

使用特权

评论回复
48
hotpower| | 2007-10-15 01:30 | 只看该作者

哈哈~~~不错~~~俺玩不起6系列

谢谢~~~

使用特权

评论回复
49
pbxywyq|  楼主 | 2007-10-15 19:39 | 只看该作者

让大家久等了!

    在医院“躺”了一个多月才真切地感受到健康的体魄是人生最宝贵的财富!万望各位同仁在繁重、枯燥的工作中勤于锻炼,珍视身体健康。
    刚上班这几天,前面积压的工作太多这个工程只好暂时停顿一段时间了。
    上周末写了一个单片机IO口模拟多串口的通信程序(目前已实现两个UART@9600bps稳定的实时数据通信),如果大家感兴趣,明天我贴出来,希望对起到抛砖引砖的作用。

使用特权

评论回复
50
zhengrf| | 2007-10-16 17:14 | 只看该作者

好帖

斑竹真是有心人啊。
我也很想看看这个设计的原理图,不知是否可以发到这个邮箱zheng_rf@163.com
不胜感激!

使用特权

评论回复
51
pbxywyq|  楼主 | 2007-10-17 16:43 | 只看该作者

虚拟串口程序源码

#include <REG2051.H>
#include "SimUART.h"

sbit SimPortA_TX =P1^1;
sbit SimPortA_RX =P1^2;
sbit SimPortB_TX =P3^3;
sbit SimPortB_RX =P3^4;

static unsigned char guSimPortA_Count =1;
static unsigned char guSimPortB_Count =1;

static unsigned char bdata gSimUART_Status =0xcc;
sbit gbSimPortA_Sending =gSimUART_Status^0;
sbit gbSimPortA_Receiving =gSimUART_Status^1;
sbit gbSimPortA_Txd =gSimUART_Status^2;
sbit gbSimPortA_Rxd =gSimUART_Status^3;
sbit gbSimPortB_Sending =gSimUART_Status^4;
sbit gbSimPortB_Receiving =gSimUART_Status^5;
sbit gbSimPortB_Txd =gSimUART_Status^6;
sbit gbSimPortB_Rxd =gSimUART_Status^7;

static bit fTimeOverflow_A =FALSE;
static bit fTimeOverflow_B =FALSE;

unsigned char code BitCtrl[] ={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

unsigned char SimUART_BaudSet(unsigned char PortID,unsigned char BaudRate)
{
    unsigned char divrate,state;

    state =!0;
    switch(BaudRate)
    {
        case BAUD9600:
            divrate =1;
            break;
        case BAUD4800:
            divrate =2;
            break;
        case BAUD2400:
            divrate =4;
            break;
        case BAUD1200:
            divrate =8;
            break;
        default:
            state =0;    //0 for fail
            break;
    }

    if(state)
    {
        switch(PortID)
        {
            case SIMPORTA:
                guSimPortA_Count =(divrate *COUNT_MULTIPLE);
                state =0x01;
                break;
            case SIMPORTB:
                guSimPortB_Count =(divrate *COUNT_MULTIPLE);
                state =0x10;
                break;
            case SIMPORTAB:
                guSimPortA_Count =(divrate *COUNT_MULTIPLE);
                guSimPortB_Count =(divrate *COUNT_MULTIPLE);
                state =0x11;
                break;
            default:
                state =0;
        }
    }

    return(state);
}

void SimUARTs_Send(unsigned char CtrlWord)
{
    unsigned char count;

    if((gSimUART_Status &0x33) ==0)
    {
        fTimeOverflow_A =FALSE;
        fTimeOverflow_B =FALSE;
        gbSimPortA_Txd =0;
        gbSimPortB_Txd =0;
        gbSimPortA_Sending =TRUE;
        gbSimPortB_Sending =TRUE;

        while(!fTimeOverflow_A)        //waiting for sending start-bit
            ;
        fTimeOverflow_A =FALSE;
        fTimeOverflow_B =FALSE;

        for(count =0;count <8;count++)
        {
            gbSimPortA_Txd =gbSimPortB_Txd =(bit)(CtrlWord &BitCtrl[count]);
            while(!fTimeOverflow_A)        //waiting for sending a data-bit
                ;
            fTimeOverflow_A =FALSE;
            fTimeOverflow_B =FALSE;
        }

        gbSimPortA_Txd =1;
        gbSimPortB_Txd =1;
        while(!fTimeOverflow_A)        //waiting for sending stop-bit
            ;
        fTimeOverflow_A =FALSE;
        fTimeOverflow_B =FALSE;

        gbSimPortA_Sending =FALSE;
        gbSimPortB_Sending =FALSE;
    }
}

bit SimUARTA_Receive(unsigned char *ptr)
{
    static unsigned char BitCount =0;
    static unsigned char ReceivedByte =0;

    if(gbSimPortA_Receiving)
    {
        if(fTimeOverflow_A)
        {
            fTimeOverflow_A =FALSE;
            if(BitCount >=8)
            {
                BitCount =0;
                gbSimPortA_Receiving =FALSE;
                if(gbSimPortA_Rxd)        //Check for stop-bit
                {
                    *ptr =ReceivedByte;
                    return(TRUE);
                }
            }
            else
            {
                if(gbSimPortA_Rxd)
                    ReceivedByte |=BitCtrl[BitCount];
                else
                    ReceivedByte &=(~(BitCtrl[BitCount]));
                BitCount++;
            }
        }
    }
    else
        BitCount =0;
    return(FALSE);
}

bit SimUARTB_Receive(unsigned char *ptr)
{
    static unsigned char BitCount =0;
    static unsigned char ReceivedByte =0;

    if(gbSimPortB_Receiving)
    {
        if(fTimeOverflow_B)
        {
            fTimeOverflow_B =FALSE;
            if(BitCount >=8)
            {
                BitCount =0;
                gbSimPortB_Receiving =FALSE;
                if(gbSimPortB_Rxd)        //Check for stop-bit
                {
                    *ptr =ReceivedByte;
                    return(TRUE);
                }
            }
            else
            {
                if(gbSimPortB_Rxd)
                    ReceivedByte |=BitCtrl[BitCount];
                else
                    ReceivedByte &=(~(BitCtrl[BitCount]));
                BitCount++;
            }
        }
    }
    else
        BitCount =0;
    return(FALSE);
}

//Timer0 interrupt routine
void Timer0(void) interrupt TF0_VECTOR using 1
{
    static unsigned char data SimPortA_SampleCount =0;
    static unsigned char data SimPortB_SampleCount =0;
    bit RxdPin_A,RxdPin_B;

    RxdPin_A =SimPortA_RX;
    RxdPin_B =SimPortB_RX;
//    SimPortA_TX =gbSimPortA_Txd;
//    SimPortB_TX =gbSimPortB_Txd;
    
    //Port A
    if((gSimUART_Status &0x03) ==0)
    {
        if(RxdPin_A ==0)        //find out receive start-bit
        {
            SimPortA_SampleCount++;
            if(SimPortA_SampleCount >=2)
            {
                if(!gbSimPortA_Sending)                //working as simplex-system
                    gbSimPortA_Receiving =TRUE;        //start receive
                SimPortA_SampleCount =0;
            }
        }
        else
            SimPortA_SampleCount =0;
    }
    else
    {
        SimPortA_SampleCount++;
        if(SimPortA_SampleCount >=guSimPortA_Count)
        {
            fTimeOverflow_A =TRUE;
            if(gSimUART_Status &0x01)        //Sending
                SimPortA_TX =gbSimPortA_Txd;
            if(gSimUART_Status &0x02)        //Receiving
                gbSimPortA_Rxd =RxdPin_A;
            SimPortA_SampleCount =0;
        }
    }

    //Port B
    if((gSimUART_Status &0x30) ==0)
    {
        if(RxdPin_B ==0)        //find out receive start-bit
        {
            SimPortB_SampleCount++;
            if(SimPortB_SampleCount >=2)
            {
                if(!gbSimPortB_Sending)                //working as simplex-system
                    gbSimPortB_Receiving =TRUE;        //start receive
                SimPortB_SampleCount =0;
            }
        }
        else
            SimPortB_SampleCount =0;
    }
    else
    {
        SimPortB_SampleCount++;
        if(SimPortB_SampleCount >=guSimPortB_Count)
        {
            fTimeOverflow_B =TRUE;
            if(gSimUART_Status &0x10)        //Sending
                SimPortB_TX =gbSimPortB_Txd;
            if(gSimUART_Status &0x20)        //Receiving
                gbSimPortB_Rxd =RxdPin_B;
            SimPortB_SampleCount =0;
        }
    }
}

使用特权

评论回复
52
pbxywyq|  楼主 | 2007-10-17 17:07 | 只看该作者

程序的设计思路

    这个工程完成的比较仓促,之前也曾参考过网络上其他前辈的源码,但都不是太适合工程需求。我这段代码的设计思路是这样的:首先,利用Timer0产生时基信号(启用多个中断时,务必将Timer0的中断优先级设置为最高,如此方可保证定时的准确性),再以这一时基信号作为最低时间分辨率对UART的输入端口进行采样,当达2个连续的低电平采样时则任务启动了一次串行接收操作,然后按波特率设置作等间隔的端口采样,并将获取端口状态存储到一全局bit类型变量中,而UART发送操作在Timer0中断服务程序中只提供定时服务;其次,主程序不断检查UART的工作状态,当检测到UART处于接收或发送状态时,便开始监测Timer0是否有超时事件发生,有超时事件则说明有1位数据成果地接收或发送,然后作相应的处理直到完成整个Byte的接收或发送操作。
    由于接收函数采用非阻塞运行方式,因此该程序可实现对多个UART的同步操作。
    事实上,如果采用可产生软件中断的单片机,那么虚拟UART的操作会变得更简便。
    

使用特权

评论回复
53
chxuan2004| | 2007-10-21 17:09 | 只看该作者

楼主,能发一份原理图吗~~

小弟先谢谢啦,多多学习哈:0

我的邮箱是:chengxuan2002@163.com

使用特权

评论回复
54
2_1_I_C| | 2007-10-22 11:05 | 只看该作者

希望得到一份详细资料

LZ辛苦
希望得到一份详细资料
qjchappy  # 126_com

使用特权

评论回复
55
hughpro| | 2007-10-25 07:48 | 只看该作者

赞啊

使用特权

评论回复
56
xiaoing| | 2007-10-25 13:28 | 只看该作者

学习中

好贴,不顶对不起楼主,

使用特权

评论回复
57
tjsheep| | 2007-10-25 23:28 | 只看该作者

楼主多保重身体啊:)

使用特权

评论回复
58
邓裕文| | 2007-10-30 09:51 | 只看该作者

1111

注意身体啊!!

使用特权

评论回复
59
bios51| | 2007-10-30 20:15 | 只看该作者

羡慕

使用特权

评论回复
60
artillery1| | 2007-11-4 20:52 | 只看该作者

板子设计的很好啊。

板子设计的很好,布线很漂亮。不知道板主要实现什么功能?

使用特权

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

本版积分规则