向各位请教一个51串口通信的问题

2020-01-23 14:33发布

本帖最后由 Rayne_Hwang 于 2014-7-3 15:26 编辑

【型号】:STC89C51RC
【编译环境】:Keil uv4
【问题】:主程序就一个任务,不停地向串口发送字符a。主要是为了测试串口中断有没有问题。结果现在如果在主程序开中断,每次复位之后输出2个a就死机了。关闭ES之后一切正常.
                麻烦各位帮我看看串口中断有没有问题。
  1. void    UART_Init()
  2. {   
  3.     TMOD = 0x20;         //定时器T1为8位自动重载模式, 用于产生波特率
  4.     SCON = 0x50;         //串口工作方式1,允许接收。相当于这三句:SM0=0; SM1=1; REN=1;
  5.     TH1 = 0xfd;
  6.     TL1 =  0xfd;         //设定T1初值
  7.     PCON = 0x00;         //波特率不倍增
  8.     EA = 1;         //使能总中断
  9.     ES = 1;         //使能串口中断
  10.     TR1 = 1;         //启动定时器T1
  11. }

  12. void UART_PutByte(UINT8 c)
  13. {
  14.     SBUF = c;
  15.     while(!TI);         // 等待数据发送结束(TI==1代表发送结束)
  16.     TI = 0;         // 清除发送结束标志
  17. }
  18. void UART_ISR(void) interrupt 4
  19. {
  20.      if(RI)         //对于接收中断
  21.      {   
  22.          RI = 0;         //清中断
  23.          RxData = SBUF;         //将本次数据存入RxData
  24.          if(RxPtr<RX_BUF_LEN) RxBuf[RxPtr++] = SBUF;        //将本次数据追加存入RxBuf[]
  25.       }
  26. else         //对于发送中断,不作处理
  27.      {
  28.          TI = 0;
  29.      }
  30. }

  31. //变量定义:
  32.   
  33. static xdata volatile unsigned char RxData = 0;
  34. static xdata volatile unsigned char RxBuf[RX_BUFF_LEN] = {0};
  35. Static xdata volatile unsigned char RxPtr = 0;
  36. //主程序
  37. void main()
  38. {
  39.      UART_Init();
  40.      while(1)
  41.      {   
  42.           UART_PutByte('a');
  43.      }   
  44. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
takashiki
1楼-- · 2020-01-23 17:25
从没见过这样写法,很新奇。你到底是查询发送啊还是中断发送啊,怎么都清TI了,不冲突吗
qlb1234
2楼-- · 2020-01-23 21:17
 精彩回答 2  元偷偷看……
Rayne_Hwang
3楼-- · 2020-01-24 01:10
takashiki 发表于 2014-7-3 15:31
从没见过这样写法,很新奇。你到底是查询发送啊还是中断发送啊,怎么都清TI了,不冲突吗 ...

是想查询发送来着
Rayne_Hwang
4楼-- · 2020-01-24 01:27
qlb1234 发表于 2014-7-3 15:41
那是不是說明中斷有某箇地方在搗亂?

好的,我改改试试。刚刚学完微机原理,虽说卷面成绩不错,一到做东西脑子还是有点昏啊
lgg88
5楼-- · 2020-01-24 06:30
采用中断的话  ,一般只要把值传送给SBUF就好了 ,其他的去掉

一周热门 更多>