单片机模拟串口实验,在没有串口的单片机上想使用串口功能这就需要模拟一个串口了
单片机源程序如下:
#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;
}
}
}
}
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』