• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

51单片机的T1作为波特率发生的话,可以允许ET1=1允许中断吗?

大伟 2020-05-09 浏览量:1092
如题,理论上T1作为波特率发生器的定时器不需要中断服务函数。 但是如果加了允许进入中断(ET1=1;),又写了中断服务函数内容的话,会造成串口发送乱码吗?

或者允许了中断,但是不写中断服务函数,会造成51单片机跑飞程序吗?

void SendByte(unsigned char c)
{
  SBUF = c;
  while(TI==0);
  TI = 0;
}

void main(void)
{
   TMOD = 0x21;       // 波特率2400
   SCON = 0x50;        
   TH1 = 0xF3;        
   TL1 = TH1;         
   TR1 = 1;                     
    EA = 1;       
      ET1 = 1;                         //就是加了这句!!!!允许T1中断

   while(1)
  {
    SendByte('A');
  }

}

void Timer1Isr(void) interrupt 3    //T1的中断服务函数,随便瞎写的内容,只是表示一下。
{
        unsigned char i = 0;
       i++;
}


其实也就是 定时器T1的中断服务函数会不会影响串口产生的波特率或者SBUF的发送???

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 先给你一个概念,任何中断函数,都要求快进快出。执行时间尽可能少,比较费时的计算,就拿到主函数里面。

    再来回答你的问题.

    允许定时器中断,但是不写定时器中断服务函数,不对导致单片机程序跑飞程序吗?

    我们极端假设下,当程序已经执行完成​SBUF = c;语句后,程序立即跳转到定时器中断,假设定时器中断执行非常长,

    那么串口上,这个C字节还是可以完整的发出去,但是后面的自己就发布出去了。


    所以,串口上不会有乱码,但是会出现本来一个数据帧,会被分成了几个数据帧的情况。​


    • 发布于 2020-05-09
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:1
  • 看你这个程序,中断处理函数里面没有清除中断标志,应该会导致卡死在中断里面

    如果使能了中断,没有中断处理函数,首先在某些平台上,会导致程序跳到一个不可执行的内存地址,导致程序卡死,此外,中断处理函数必须要执行清除中断标志位的动作,所以没有处理函数,程序会一直进中断

    • 发布于2020-05-15
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

51单片机的T1作为波特率发生的话,可以允许ET1=1允许中断吗?