STC89S52RC模擬串口

我們使用的是P1^4口做發送引腳,P1^5口做接受引腳
auart.h

#include "head.h"



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

sbit BT_SND =P1^4;
sbit BT_REC =P1^5;


#ifndef _AUART_H_
#define _AUART_H_


//函數聲明
void PSendChar(uchar inch);
uchar PGetChar(void);
bit StartBitOn(void);

#endif

auart.c

#include "auart.h"
#include "timer.h"

//發送一個字符
void PSendChar(uchar 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
    uchar 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
}


//檢查是不是有起始位
bit StartBitOn()
{
    return  (BT_REC==0);
}


//接收一個字符
uchar 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
    uchar 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
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章