51单片机 IO口串口通信

180it 2022-04-07 PM 571℃ 0条

实例1

#include <reg52.h>
void ConfigUART(unsigned int baud);
unsigned char a,b;
sbit feng=P2^3;
sbit led1=P1^0;
sbit led2=P1^1;
void main(){
    ConfigUART(9600);
    while(1){
        while(!RI);
        RI=0;
        
        //P1=SBUF;//接收缓冲器中的值赋值给P1口
        b=SBUF;
        a=b;
        SBUF=a;
        
        //注解
        //串口助手发送过去的数字为16进制,比如30实际上就是十进制的48,在做switch判断的时候应该判断
        //十进制数字48
        /*if(b>31){
            P1=b;
            feng=0;
        }else{
            P1=0xf0;
            feng=1;
        }*/
        switch(b){
            //发送'1',十六进制为31,十进制为49
            case 49:
              led1=0;
              led2=0;
                break;
            case 50:
                led1=0;
              led2=1;
                break;
            case 51:
                led1=1;
              led2=0;
                break;
            case 52:
                led1=1;
              led2=1;
                break;
            case 53:
                feng=0;
              break;
            default:
              P1=0xff;
              break;
        }
        while(!TI);
        TI=0;
    }
}
void ConfigUART(unsigned int baud){
    SCON=0x50;
    TMOD&=0x0f;
    TMOD|=0x20;
    TH1=256-(11059200/12/32)/baud;
    TL1=TH1;
    ET1=0;//可以省略
    TR1=1;//启动定时器
}


实例2

#include <reg52.h>
sbit PIN_RXD=P3^0;
sbit PIN_TXD=P3^1;

bit RxdEnd=0;
bit RxdOrTxd=0;
unsigned char RxdBuf=0;
unsigned char TxdBuf=0;
bit TxdEnd=0;
void ConfigUART(unsigned int baud);
void StartRXD();
void StartTXD(unsigned char dat);

void main(){
    EA=1;
    ConfigUART(9600);
    while(1){
        while(PIN_RXD);
        StartRXD();
        while(!RxdEnd);
        StartTXD(RxdBuf+1);
        while(!TxdEnd);
    }
}

void ConfigUART(unsigned int baud){
    TMOD &=0xf0;
    TMOD |=0x02;
    TH0=256-(11059200/12)/baud;
    
}
void StartRXD(){
    TL0=256-((256-TH0)>>1);
    ET0=1;
    TR0=1;
    RxdEnd=0;
    RxdOrTxd=0;
}
void StartTXD(unsigned char dat){
    TxdBuf=dat;
    TL0=TH0;
    ET0=1;
    TR0=1;
    PIN_TXD=0;
    TxdEnd=0;
    RxdOrTxd=1;
    switch(dat){
        case 12:
            P1=0x00;
          break;
        case 13:
            P1=0xf0;
          break;
        default:
            break;
    }
}
void interruptTimer0() interrupt 1{
    static unsigned char cnt=0;
    if(RxdOrTxd){
        cnt++;
        if(cnt<=8){
            PIN_TXD=TxdBuf & 0x01;
            TxdBuf>>=1;
        }else if(cnt==9){
      PIN_TXD=1;            
        }else{
            cnt=0;
            TR0=0;
            TxdEnd=1;
        }
    }else{
        if(cnt==0){
          if(!PIN_RXD){
               RxdBuf=0;
                 cnt++;
            }else{
               TR0=0;
            }
        }else if(cnt<=8){
          RxdBuf>>=1;
            if(PIN_RXD){
               RxdBuf |=0x80;
            }
            cnt++;
        }else{
          cnt=0;
            TR0=0;
            if(PIN_RXD){
               RxdEnd=1;
            }
        }
    }
}

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

51单片机 IO口串口通信