[51单片机] 51串口接收数据上电一直进接收中断,请各位前辈帮忙指点...

[复制链接]
200|5
 楼主 | 2018-7-1 11:39 | 显示全部楼层 |阅读模式
使用的型号是STC89C52,定时器2做波特率发生器,9600,晶振11.0592M,能发送数据字符给上位机,但是上位机发数据给单片机就出问题了,不开ES的话接收不了,这个应是正常现象,但打开接收允许开关ES后一直进接收中断,这个是我初始化不对还是串口接收中断写错了?请各位前辈指点下
(以下是我的串口初始化和接收中断和主函数)
/*********************************************
FunctionName: uartInit
FunctionInfo: 定时器2(波特率发生器)初始化
Input:        no
Output:       no
注:使用RCAP2H去重装TH2,用RCAP2L去重装TL2,与其他不同
bps=f0cs/[n*(65536-x)] :x位高低位 n=32(12时钟模式)
9600=11059200/[32*(65536-x)]:x=65500=0xffdc
**********************************************/
void uartInit(void)
{
  SCON =0x50;//串行口中断方式1 允许接受 (8位异步通讯)  10位UART
  PCON =0x00;
  ES = 1; //串口中断允许位,仅是串口的中断开关 //仅是发送的话可以不要
  EA = 1;

  RCAP2H =0xff;
  RCAP2L =0xdc;  
  TH2=RCAP2H;
  TL2=RCAP2L;

  RCLK = 1;//RCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的接收时钟
  TCLK = 1;//TCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的发送时钟
  TR2  = 1;//定时器2启动/停止控制位.置1时启动定时器
  C_T2 = 0;//定时器/ 计数器选择.0=内部定时器(OSC/12或OSC/6)

  TI = 1;//发送中断标记位,必须设置        //在不使用printf使用自己构造的函数可以不要
}


void UART() interrupt 4        using 3
{  
  //ES = 0;  //暂时关闭串口中断允许位
  if(RI)
    {
         RI = 0;  //接收中断标志位 由软件清零
         tempRx = SBUF;
     //rxBuff[rxCnt] = tempRx;
         *( (uchar *)&gRxBuff.add + rxCnt ) = tempRx;   //指针转换不对的话左值不正确
         rxCnt++;
     gRxFlag =1;        //接收标志
     //gTime.rxDly = T_50MS;         //超出50ms算一帧数据接收完
        }   
  printf("inRx"); //为什么一直响应这个接收中断
  //ES = 1;
}


void main(void)
{
    //WDT_Init();
        lcdBack = ZERO;                        //上电默认LCD背光不亮
    EMI_Down51();                        //降低MCU对系统的电磁干扰EMI
        LCD12864_Init();                //液晶屏初始化       
    gVariableTimeInit();        //定时器变量初始化
        poetryInit();                        //诗词结构体数组初始化
        keyFlagInit();                        //按键标志初始化
        timerInit2();                        //定时器初始化       
        uartInit();
        //text_TX("HelloWord\n");
        printf("HelloWord\n");       
        while(1)
          {//以下省略......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评论

一叶倾城wwq 2018-7-2 11:01 回复TA
多谢各位前辈的提醒,目前已经调试OK,使用MODBUS的数据格式都能接收到正确的数据了,谢谢啦! 
| 2018-7-1 15:38 | 显示全部楼层
一直进接收中断,只有一个可能,RX端口确实有数据进来,你示波器测量下这个端口,是不是这个样子的。
 楼主 | 2018-7-1 23:00 | 显示全部楼层
xyz549040622 发表于 2018-7-1 15:38
一直进接收中断,只有一个可能,RX端口确实有数据进来,你示波器测量下这个端口,是不是这个样子的。 ...

前辈推测的不错,接上串口线确实有很多乱七八糟的数据进去了,但我将串口线取下(我用的TTL转USB),我的TX和RX确认没有连接到任何其他的东西上,已经悬空,但还是一直进这个接收中断,我的12864什么都不会显示,和之前接上串口线一样的现象,应该排除硬件电路的问题(TXRX下载程序都没有问题),应该就是我的程序写出问题来了,串口初始化?接收中断?另外我的单片机ROM(data=45.2 xdata=380 code=5058),会不会是片内ROM不够而使用了扩展ROM而导致地址什么的出现问题?实在是想不通
| 2018-7-2 09:07 | 显示全部楼层
printf默认也是通过串口打印的,所以当然有冲突了
 楼主 | 2018-7-2 10:59 | 显示全部楼层
ayb_ice 发表于 2018-7-2 09:07
printf默认也是通过串口打印的,所以当然有冲突了

多谢前辈的提醒,51系列发送接收是一个寄存器,估计是我初始化发送了东西,然后寄存器有没有清零导致一直进接收中断,我把有打印或者用自己写的字符发送的调用都关掉就OK了
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

关闭

热门推荐上一条 /6 下一条

分享 快速回复 返回顶部 返回列表