51单片机 开启串口TI后时钟变慢
功能一切正常但是开启串口发送TI=1后,感觉时钟变为了原来的十分之一。好奇怪,这是什么情况?...
功能一切正常 但是开启串口发送TI=1后,感觉时钟变为了原来的十分之一。好奇怪,这是什么情况?
展开
3个回答
展开全部
第一:这种情况只有在开串口中断才会出现,你的程序中有IE=0x90;的语句吗?
第二:开启串口发送,是向SBUF中送数,如SBUF=0x8AH;但不能人为地TI=1,这样做是错误的,当串口发送一个字节后会自动置TI=1的,表示已发送完一个字节,这样,要由软件清TI=0,再发送下一个字节。
第三,人为地置TI=1,就会出现在没有发送数据的情况下也会产生中断,如果还没有串口中断子函数,也没有清TI=0的语句,就会不停地中断,当然就会影响执行延时子函数,那延时的时间肯定要长了。
第二:开启串口发送,是向SBUF中送数,如SBUF=0x8AH;但不能人为地TI=1,这样做是错误的,当串口发送一个字节后会自动置TI=1的,表示已发送完一个字节,这样,要由软件清TI=0,再发送下一个字节。
第三,人为地置TI=1,就会出现在没有发送数据的情况下也会产生中断,如果还没有串口中断子函数,也没有清TI=0的语句,就会不停地中断,当然就会影响执行延时子函数,那延时的时间肯定要长了。
更多追问追答
追问
第一:的确是IE=0x90;
第二:我是在初始化系统时加入的TI=1;不加入反而会能printf函数发出数据
请问我初始化时该怎样?
追答
想用串口发送数据,建议不要用printf函数,自己写一个串口发送子函数。那个printf函数用起来很麻烦,而且编译完的代码很长的,没有必要的。对串口初始化:IE=0x90;SCON=0x50;TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;这是定义波特率=9600,再写一个串口子函数:UART_1(void) interrupt 4,具体程序根据需要写就行了。
展开全部
TI不是开启串口的,TI是串口发送结束标志位,当发送完数据后该位为1,开启了串口中断的话将进入中断,需手动清零。否则将不断地进入串口中断程序而影响主程序的运行,结果就是感觉单片机变慢了
追问
如果我要发送一个长度为10的字符串,且必须一次发送,用printf之外还有什么能实现?
追答
如果是字符串,可以这样写(在发送字符串前请加一条ES=0,发送完后再使ES=1,或者在串口中断中加入判断是接收还是发送判断)
void UAST_SendDat(unsigned char dat)//通过串口发送一个数据
{
SBUF=dat;
while(!TI);
TI=0;
}
void UART_SendStr(unsigned char str[])//通过串口发送字符串
{
unsigned char i=0;
while(str[i]!='\0')//判断字符串是否结束
{
UAST_SendDat(str[i]);
i++;
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如何体现出始终变慢的
追问
void delay1(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
比如这个函数,原来void delay1(1000)是1秒 现在是10秒 我感觉好奇怪 。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询