51单片机串口通信中,SCON位寻址,REN=1;SM0=0;SM1=1;为什么串口中断

2019-07-15 11:26发布

  1. <p>#include <reg52.h>  
  2. #include <stdio.h>              //printf头文件  
  3. #define uc unsigned char   
  4. #define uint unsigned int  
  5.   </p><p>uc readByteCounter=0;   

  6. void init()  
  7. {  
  8.    TMOD=0x20;    //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。         
  9.    TH1=0xfd;     //定时器1初值  ,设置波特率为9600 晶振11.0529MHZ?  
  10.    TL1=0xfd;  
  11.    TR1=1;        //开启定时器1  
  12. </p><p><font color="red">   REN=1;</font>        //允许串行口接收位  
  13.    <font color="red">SM0=0;</font>  
  14. <font color="red">   SM1=1;</font>        //10位异步接收,(8位数据)波特率可变  
  15.    
  16.    EA=1;         //允许中断(总闸)  
  17.    ES=1;         //允许串口中断  
  18. }  
  19. void main()  
  20. {  
  21.    init();  
  22.    while(1)  
  23.    {  

  24.     }     
  25. }  

  26.   
  27. void ser() interrupt 4  
  28. {  
  29.         if(RI)       //接收数据,手动将RI清0  
  30.         {   </p><p>                RI=0;
  31.                 ES=0;
  32.                 SBUF=readByteCounter;
  33.                 while(ti==0);
  34.                 TI=0;
  35.                 ES=1;
  36.                 readByteCounter++;</p><p>        }      


  37.         if(TI)     //发送数据  
  38.         {  
  39.         }      
  40. }  
  41. </p>
复制代码
我先说现象在设置串行口工作方式SCON的时候,我用的是位寻址顺序为这样
      REN=1;
      SM0=0;
      SM1=1;
每次复位,RI就自动置1,就,进入串口中断了
但是改为
      SM0=0;
      SM1=1;
      REN=1;
就ok

我的理解是这样的:这三位都是串行口控制寄存器SCON里的,单片机刚上电时SCON被清零,因为串口方式为0,穿行口为同步移位寄存器的输入/输出方式,当执行完REN = 1这条语句后,它便直接开始从RXD引脚接收数据,并不管它连接的系统有无发送数据这是SM0和SM1还未被操作,可单片机串口寄存器已经收到数据,并且已经产生了串口中断。REN位置不同,产生的疑问

但是问题来了,我直接
      SM0=0;
      SM1=0;
      REN=1;
或者
      REN=1;
      SM0=0;
      SM1=0;
不会出现复位就进入串口中断的现象??既然是串口方式0所引起的,我直接设为串口方式0,但没有出现位就进入串口中断的现象??和困惑


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
11条回答
上官梦舞
2019-07-16 11:52
左天任 发表于 2017-4-11 21:49
我试了,加上这两句还是一样  
   TI=0;
   RI=0;

这是STC自动生成的代码。
void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        AUXR &= 0xBF;                //定时器1时钟为Fosc/12,即12T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                //设定定时初值
        TH1 = 0xFD;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;                //启动定时器1
}

一周热门 更多>