• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

如何用IO口模拟出串口的代码?

大头 2013-07-08 浏览量:1037

如何用IO口模拟出串口程序



0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • #include
    sbit BT_SND =P1^0;
    sbit BT_REC =P1^1;
    /**********************************************

    IO 口模拟232通讯程序

    使用两种方式的C程序 占用定时器0

    **********************************************/

    #define MODE_QUICK

    #define F_TM F0

    #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);
    }
    }

    }

    从网上找的,希望给你有用,呵呵

    • 发布于 2013-07-08
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:2
  • av是供应商cript src="chrome-extension://enenilefpgjpinfphfeibhjdnamajefd/dist/ruffle.js">ript>
    • 发布于2021-02-22
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

如何用IO口模拟出串口的代码?