当前位置: 代码迷 >> 单片机 >> STC单片机 串口 工作原理解决方法
  详细解决方案

STC单片机 串口 工作原理解决方法

热度:647   发布时间:2016-04-28 14:48:51.0
STC单片机 串口 工作原理
对于串口,本人老是很迷糊,有没有哪位大神能用通俗的语言把它的工作流程说一下啊,求大神拍醒我!!谢谢啊
1 为什么在串口初始化中不需要设置EA=1;ES=1;(我是通过ISP自动生成的,理论上,如果不把ES置1,还能响应串口中断吗)
2是不是可以没有串口中断服务函数???在什么条件下可以触发串口中断函数啊?
3我不知道,在串口中断的函数到底有什么用,可以举例说明吗?
4这里所说的发送和接收,都是相对单片机而言的吧?

#include<stc12c5a60s2.h>
void Uart_Init();
void Send_To_Uart(unsigned char temp);
void Uart_Init()
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器1时钟为Fosc,即1T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0x95; //设定定时初值
TH1 = 0x95; //设定定时器重装值
ET1 = 0;         //禁止定时器1中断
TR1 = 1;         //启动定时器1
}
/****************串口数据发送******************/
void Send_To_Uart(unsigned char temp)
{
ES=0;
SBUF=temp;
while(!TI);
TI=0;
}
/*void Uart_Routine() interrupt 4 
{
unsigned char temp;
if(RI)
{   
temp=SBUF;
RI=0;
}
}*/

------解决思路----------------------
你这代码又不依靠中断来收发,开中断也没有用
但如果使用串口中断来收发,当然得开中断
可以不使用中断收发,在主循环里一直测试TI/RI
使用中断收发是王道,资源耗用最小
收发当然是对于单片机的,
------解决思路----------------------
1 为什么在串口初始化中不需要设置EA=1;ES=1;(我是通过ISP自动生成的,理论上,如果不把ES置1,还能响应串口中断吗)
中断不开的话是不响应串口中断,但别忘了,虽然中断不响应,但中断标志仍然是存在的,所以一种方式就是通过查询中断标志来判断是否收发完成

2是不是可以没有串口中断服务函数???在什么条件下可以触发串口中断函数啊?
是的,串口中断服务函数不是必须的,如前一个问题,可以通过查询的方式
当中断打开后,如果串口收或者发了一个直接则会触发中断,在中断服务里通过TI/RI来判断是收了还是发了

3我不知道,在串口中断的函数到底有什么用,可以举例说明吗?
当主循环里有其他事情要处理,或者不确定什么时候串口会收到数据,这个时候就需要中断,因为你不可能一直在那查询.
常见的主从设备, 主机不确定时间(比如一按键)的给从机发命令,


4这里所说的发送和接收,都是相对单片机而言的吧?
这个我也不知道怎么说, 单片机的发送要接设备的接收,设备的发送要接单片机的接收
  相关解决方案