#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++); //发送当前字符
}
}
STC15F104W使用定时器0模拟串口
最新推荐文章于 2024-07-03 20:36:38 发布