×
单片机 > 单片机程序设计 > 详情

51单片机模拟串口源程序

发布时间:2021-09-10 发布时间:
|


单片机模拟串口实验,在没有串口的单片机上想使用串口功能这就需要模拟一个串口了


单片机源程序如下:

#include "reg51.h"

typedef unsigned char BYTE;

typedef unsigned WORD;

typedef bit BOOL;

#define BAUD 0xFE80 /* 9600bps@11.0592MHz */

sfr AUXR = 0x8E;

sbit RXB = P3^0; /* 定义串口TX RX端口 */

sbit TXB = P3^1;


BYTE TBUF,RBUF;

BYTE TDAT,RDAT;

BYTE TCNT,RCNT;

BYTE TBIT,RBIT;

BOOL TING,RING;

BOOL TEND,REND;


BYTE t,r;

BYTE buf[16];

sbit led=P3^3;

void UART_INIT()

{

TING = 0;

RING = 0;

TEND = 1;

REND = 0;

TCNT = 0;

RCNT = 0;

}

void main()

{

TMOD = 0x00; /* 定时器0 16位自动装置模式 */

AUXR = 0x80; /* 定时器0工作在1T模式 */

TL0 = BAUD;

TH0 = BAUD >> 8; /* 初始化定时器0,并设置自动装置的值 */

TR0 = 1; /* 定时器0开始启动 */

ET0 = 1; /* 使能定时器0中断 */

PT0 = 1; /* 设置定时器0中断优先级 */

EA = 1; /* 开全局中断 */

UART_INIT(); /* 串口初始化 */

while(1)

{


if(buf[0]=='0')

{

led=0;

}

else

{

led=1;

}

if(REND)

{

REND = 0;

buf[r++ & 0x0f] = RBUF;

}

if(TEND)

{

if(t != r)

{

TEND = 0;

TBUF = buf[t++ & 0x0f];

TING = 1;

}

}


}

}


void tm0() interrupt 1 using 1

{

if(RING)

{

if(--RCNT == 0)

{

RCNT =3;

if(--RBIT == 0)

{

RBUF = RDAT;

RING = 0;

REND = 1;

}

else

{

RDAT >>=1;

if(RXB)RDAT |= 0x80;

}

}

}

else if(!RXB)

{

RING = 1;

RCNT = 4;

RBIT = 9;

}

if(--TCNT == 0)

{

TCNT = 3;

if(TING)

{

if(TBIT == 0)

{

TXB = 0;

TDAT = TBUF;

TBIT = 9;

}

else

{

TDAT >>= 1;

if(--TBIT ==0)

{

TXB = 1;

TING = 0;

TEND = 1;

}

else

{

TXB =CY;

}

}

}


}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向