IO口模拟串口通讯C源程序
2012-06-02
标签: 模拟串口


#include <reg51.h>
sbit BT_SND = P1 ^ 0;
sbit BT_REC = P1 ^ 1;
/**********************************************
IO 口模拟232通讯程序
使用两种方式的C程序 占用定时器0
**********************************************/
#define MODE_QUICK
#define F_TM F0
#define TIMER0_ENABLETL0=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);
        }
    }
}


可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号