STC15F104W使用定时器0模拟串口

#include <reg51.h>
#include <intrins.h>

//定义波特率常量
//BAUD = 65536 - FOSC/3/BAUDRATE/M (1T:M=1; 12T:M=12)
//NOTE: (FOSC / 3 / BAUDRATE)必须大于98,(建议增加110)

//#define BAUD  0xF400                  // 1200bps @ 11.0592MHz
#define BAUD  0xFA00                  // 2400bps @ 11.0592MHz
//#define BAUD  0xFD00                  // 4800bps @ 11.0592MHz
//#define BAUD  0xFE80                  // 9600bps @ 11.0592MHz
//#define BAUD  0xFF40                  //19200bps @ 11.0592MHz
//#define BAUD  0xFFA0                    //38400bps @ 11.0592MHz

//#define BAUD  0xEC00                  // 1200bps @ 18.432MHz
//#define BAUD  0xF600                  // 2400bps @ 18.432MHz
//#define BAUD  0xFB00                  // 4800bps @ 18.432MHz
//#define BAUD  0xFD80                  // 9600bps @ 18.432MHz
//#define BAUD  0xFEC0                  //19200bps @ 18.432MHz
//#define BAUD    0xFF60                //38400bps @ 18.432MHz

//#define BAUD  0xE800                  // 1200bps @ 22.1184MHz
//#define BAUD  0xF400                  // 2400bps @ 22.1184MHz
//#define BAUD  0xFA00                  // 4800bps @ 22.1184MHz
//#define BAUD  0xFD00                  // 9600bps @ 22.1184MHz
//#define BAUD  0xFE80                  //19200bps @ 22.1184MHz
//#define BAUD  0xFF40                  //38400bps @ 22.1184MHz
//#define BAUD  0xFF80                  //57600bps @ 22.1184MHz

sfr AUXR = 0x8E;
sbit RXB = P3 ^ 0;                      //define UART TX/RX port
sbit TXB = P3 ^ 1;

typedef bit BOOL;

#ifndef uchar
	#define uchar unsigned char
#endif
#ifndef uint
	#define uint unsigned int
#endif

uchar TBUF, RBUF;
uchar TDAT, RDAT;
uchar TCNT, RCNT;
uchar TBIT, RBIT;
BOOL TING, RING;
BOOL TEND, REND;

uchar t, r;
uchar buf[16];


//UART的定时器中断
void tm0() interrupt 1
{
	if(RING) {
		if(--RCNT == 0) {
			RCNT = 3;                   //重置发送波特率计数器

			if(--RBIT == 0) {
				RBUF = RDAT;            //将数据保存到RBUF
				RING = 0;               //停止接收
				REND = 1;               //设置接收完成标志
			} else {
				RDAT >>= 1;

				if(RXB) 
					RDAT |= 0x80;   //将RX数据移至RX缓冲区
			}
		}
	} else if(!RXB) {
		RING = 1;                       //设置开始接收标志
		RCNT = 4;                       //初始化接收波特率计数器
		RBIT = 9;                       //初始化接收位号(8个数据位+1个停止位)
	}

	if(--TCNT == 0) {
		TCNT = 3;                       //重置发送波特率计数器

		if(TING) {                      //判断是否发送
			if(TBIT == 0) {
				TXB = 0;                //发送起始位
				TDAT = TBUF;            //将数据从TBUF加载到TDAT
				TBIT = 9;               //初始发送位数(8个数据位+1个停止位)
			} else {
				TDAT >>= 1;             //将数据转移到CY

				if(--TBIT == 0) {
					TXB = 1;
					TING = 0;           //停止发送
					TEND = 1;           //设置发送完成标志
				} else {
					TXB = CY;           //将CY写入TX端口
				}
			}
		}
	}
}


//初始UART模块变量
void UartInit()
{
	TMOD = 0x00;                        //timer0 16位自动重载模式
	AUXR = 0x80;                        //timer0 1T模式
	TL0 = BAUD;
	TH0 = BAUD >> 8;                      //初始Timer0并设置重载值
	TR0 = 1;                            //tiemr0开始运行
	ET0 = 1;                            //使能定时器0中断
	PT0 = 1;                            //提高定时器0的中断优先级
	//打开全局中断开关

	TING = 0;
	RING = 0;
	TEND = 1;
	REND = 0;
	TCNT = 0;
	RCNT = 0;
}


//发送串口数据
void SendChar(uchar dat)
{
	while(!TEND);

	TEND = 0;
	TBUF = dat;
	TING = 1;
}

//发送字符串
void SendString(uchar *s)
{
	while(*s) {                //检测字符串结束标志
		SendChar(*s++);         //发送当前字符
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝蚊鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值