51单片机IO口模拟串口通讯C源程(详细分析)

51单片机IO口模拟串口通讯C源程(详细分析)
2007-09-29 23:00
    #include     <reg51.h>   
    sbit     BT_SND     =P1^0;   
    sbit     BT_REC     =P1^1;   
    /**********************************************   
    
    IO     口模拟232通讯程序   
    
    使用两种方式的C程序     占用定时器0     
    
    **********************************************/   
    
    #define     MODE_QUICK   
    
    #define     F_TM     F0    //PSW.F0   用户自定义位0
    
    #define     TIMER0_ENABLE       TL0=TH0;     TR0=1;   
    #define     TIMER0_DISABLE     TR0=0;   
    
    sbit     ACC0=         ACC^0;   
    sbit     ACC1=         ACC^1;   
    sbit     ACC2=         ACC^2;   
    sbit     ACC3=         ACC^3;   
    sbit     ACC4=         ACC^4;   
    sbit     ACC5=         ACC^5;   
    sbit     ACC6=         ACC^6;   
    sbit     ACC7=         ACC^7;   
    
    void     IntTimer0()     interrupt     1   
    {   
    F_TM=1;   
    }   
    //发送一个字符   
    void     PSendChar(unsigned     char     inch)   
    {   
    #ifdef     MODE_QUICK     
    ACC=inch;   
    
    F_TM=0;   
    BT_SND=0;     //start     bit     
    TIMER0_ENABLE;     //启动   
    while(!F_TM);   
    
    BT_SND=ACC0;     //先送出低位   
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC1;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC2;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC3;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC4;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC5;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC6;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=ACC7;     
    F_TM=0;   
    while(!F_TM);   
    
    BT_SND=1;     
    F_TM=0;   
    while(!F_TM);   
    
    
    TIMER0_DISABLE;     //停止timer   
    #else   
    unsigned     char     ii;   
    
    ii=0;   
    
    F_TM=0;   
    BT_SND=0;     //start     bit     
    TIMER0_ENABLE;     //启动   
    while(!F_TM);   
    
    while(ii<8)   
    {   
    if(inch&1)   
    {   
    BT_SND=1;   
    }   
    else   
    {   
    BT_SND=0;   
    }   
    F_TM=0;   
    while(!F_TM);   
    ii++;   
    inch>>=1;   
    }   
    BT_SND=1;     
    F_TM=0;   
    while(!F_TM);   
    
    #endif     
    TIMER0_DISABLE;     //停止timer   
    }   
    //接收一个字符   
    unsigned     char     PGetChar()   
    {   
    #ifdef     MODE_QUICK     
    
    TIMER0_ENABLE;     
    F_TM=0;   
    while(!F_TM);     //等过起始位   
    ACC0=BT_REC;   
    
    TL0=TH0;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC1=BT_REC;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC2=BT_REC;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC3=BT_REC;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC4=BT_REC;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC5=BT_REC;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC6=BT_REC;   
    
    F_TM=0;   
    while(!F_TM);   
    ACC7=BT_REC;   
    
    F_TM=0;   
    
    while(!F_TM)   
    {   
    if(BT_REC)   
    {   
    break;   
    }     
    }   
    TIMER0_DISABLE;     //停止timer   
    return     ACC;   
    #else   
    unsigned     char     rch,ii;   
    TIMER0_ENABLE;     
    F_TM=0;   
    ii=0;   
    rch=0;   
    while(!F_TM);     //等过起始位   
    
    while(ii<8)   
    {   
    rch>>=1;   
    if(BT_REC)   
    {   
    rch|=0x80;   
    }   
    ii++;   
    F_TM=0;   
    while(!F_TM);   
    
    }   
    F_TM=0;   
    while(!F_TM)   
    {   
    if(BT_REC)   
    {   
    break;   
    }   
    
    }   
    TIMER0_DISABLE;     //停止timer   
    return     rch;   
    
    #endif     
    
    }   
    //检查是不是有起始位   
    bit     StartBitOn()   
    {   
    return       (BT_REC==0);   
    
    }   
    void     main()   
    {   
    unsigned     char     gch;   
    
    TMOD=0x22;     /*定时器1为工作模式2(8位自动重装),0为模式2(8位   
    自动重装)     */   
    PCON=00;   
    
    TR0=0;     //在发送或接收才开始使用   
    TF0=0;     
    TH0=(256-96);     //9600bps     就是     1000000/9600=104.167微秒     执行的   
    timer是   
    //                             
    104.167*11.0592/12=     96     
    TL0=TH0;   
    ET0=1;   
    EA=1;   
    
    PSendChar(0x55);   
    PSendChar(0xaa);   
    PSendChar(0x00);   
    PSendChar(0xff);   
    
    while(1)   
    {   
    if(StartBitOn())   
    {   
    gch=PGetChar();   
    PSendChar(gch);   
    }   
    }   
    
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值