今天再测试串口一的超时中断功能,想实现串口输入数字,转换成整数
在使用串口超时功能发现,如果是以进入中断的方式,完全没问题,即
UR1TOCR = 0xff;
#include <STC8051U.H>
#include "intrins.h"
#include <stdio.h>
#include <math.h>
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
bit busy;
char wptr;
char rptr;
char buffer[16];
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x0f;
}
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
//void UartSendStr(char *p)
//{
// while (*p)
// {
// UartSend(*p++);
// }
//}
void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
UR1TOTH = 0xff;
UR1TOTL = 0xff;
UR1TOTE = 0x00;
UR1TOCR = 0xff;
}
void main()
{
char i = 0;
char j = 0;
char tmp = 0;
WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
EAXFR = 1; //扩展寄存器(XFR)访问使能
CKCON = 0; //提高访问XRAM速度
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
while (1)
{
if (UR1TOSR & 0x01)
{
UR1TOSR |= 0x80;
for(i=0;buffer[i]!='\0';i++)
{
j++;
}
for(i=0;i<j;i++)
{
tmp = tmp + (buffer[i]-0x30) * pow(10, j-i-1);
}
UartSend(tmp);
j = 0;
tmp = 0;
wptr = 0x00;
for(i=0;i<=16;i++)
{
buffer[i] = '\0';
}
}
}
}

如果把UR1TOCR = 0xaf;
那么还是在主循环里查询,就没有响应了

通过阅读数据手册,我的理解是,应该有两种途径,一个是通过中断的方式实时响应,一个是通过主循环查询的方式
