51单片机IO口模拟串口通讯1-延时法

软件开发大郭
0 评论
/
18 阅读
/
2657 字
10 2023-02

最近因工作需要,研究了一下单片机IO口模拟串口通讯的相关知识。

相关内容主要参考了网上《51单片机模拟串口的三种方法》和《单片机IO口模拟串口程序(发送+接收)》两篇文档,并动手做了一下实验。

感受颇多。

硬件环境:STC89C52

软件环境:IDE Keil uVision V4.10

编译器 C51 V9.0

代码如下:

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

方法1:延时法

硬件:11.0592MHz晶振,STC89C52,RXD P1.0 TXD P1.1

波特率:9600

描述:所谓延时法是指根据模拟出的波特率,每1位持续的时间的长短是通过循环空指令来延时的。

测试1:上电发送1个0x01的字符

测试2:上电后等待接收,接收到PC发送的0x01字符后,将此字符+1后再发送

结果:

测试1:正确!接收到1个0x01的字符

测试2-1:正确!分别一个一个发送0x01,0x02,0x03,0x04,0x05,均正常接收

测试2-2: 错误!一起发送0x01,0x02,0x03,0x04,0x05,丢包,只能接收0x02,0x04,0x06

时间:2012.07.25 于单位

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

#include "reg52.h"

#define uchar unsigned char

sbit P1_0 = 0x90;

sbit P1_1 = 0x91;

sbit P1_2 = 0x92;

#define RXD P1_0

#define TXD P1_1

#define WRDYN 44 //写延时

#define RDDYN 43 //读延时

void Delay2cp(unsigned char i);

//往串口写一个字节

void WByte(uchar input) {

    uchar i = 8;

    TXD = (bit) 0; //发送启始位

    Delay2cp(39);

//发送8位数据位

    while (i--) {

        TXD = (bit)(input & 0x01); //先传低位

        Delay2cp(36);

        input = input >> 1;

    }

//发送校验位(无)

    TXD = (bit) 1; //发送结束位

    Delay2cp(46);

}

//从串口读一个字节

uchar RByte(void) {

    uchar Output = 0;

    uchar i = 8;

    uchar temp = RDDYN;

//发送8位数据位

    Delay2cp(RDDYN * 1.5); //此处注意,等过起始位

    while (i--) {

        Output >>= 1;

        if (RXD) Output |= 0x80; //先收低位

        Delay2cp(35); //(96-26)/2,循环共占用26个指令周

    }

    while (--temp) //在指定的时间内搜寻结束位。

    {

        Delay2cp(1);

        if (RXD)break; //收到结束位便退

    }

    return Output;

}

//延时程序*

void Delay2cp(unsigned char i) {

    while (--i); //刚好两个指令周期。

}

void main() {
    uchar ccc;

//测试1

//WByte(0x01);

//while(1){;}

//测试2

    while (1) {

        if (RXD == 0) {

            ccc = RByte();

            WByte(ccc + 1);

        }

    }

}

附几张抓到的波形:

测试1:十六进制字符0x01的波形

测试1:发送出来的字符

测试2:依次发送0x01,0x02,0x03,0x04,0x05接收到的字符

测试2:一起发送0x01,0x02,0x03,0x04,0x05字符

结论:发送和接收字符均正常,没加缓冲,大数据量未测试。

    暂无数据