OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9989|回复: 5

求助:STC单片机串口接收中断显示问题

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2011-11-2
在线时间
0 小时
发表于 2011-11-2 12:16:54 | 显示全部楼层 |阅读模式

void timer1intrrupt() interrupt 1

 TR0=0;
 baozhanqi();
 TH0 = 0xA9;
    TL0 = 0x9A;
}

void senddata(uchar dat)             // send a data
{   ES = 0;
    SBUF = dat;
    while(!TI);
    TI = 0;
    ES =1;
}
/* serial interrupt */
void serial() interrupt 4    // serial interrupt

 RI = 0;
 ES=0;
 TR1 = 0;
    TH1 = 0xD8;
 TL1 = 0xF0;
 serialdata[z] = SBUF;           // Get
 z = z+1;
 ES=1;
 TR1 = 1; 
}

/* Timer1  interrupt */
void timer1() interrupt 3         // timer1 interrupt
{
    int i,n,s;
bit flag;
TR1 = 0;
   for(s=0;s<z;s++)
         {
            if(serialdata==0x16)
             {
               if(serialdata[s+1]==0x17)   break;
             }
         }
      if(s+2<z)
         {  
            s=s+2;
            for(n=s;n<z;n++)
    { i=n-s;
       tab1=serialdata[n];
                senddata(tab1);
    }
     TR0=1;
         }  
}          
void baozhanqi()
{
   uchar q,temp=3,temp1=200;
   baozhanqi_display();
   q=num5+num6*2+24;
   while(1)
      {
  if(num7<13)
   {
    if(num7%2!=0)
     {
         while(temp1--)  show_chinese(BZQ+(384-(11-num7)*8));
               temp1=200;
         move_left_scan(BZQ, q);
         while(temp1--)  show_chinese(BZQ+(384-(11-num7)*8));
        
     }
    else
     {
         while(temp1--)  show_chinese(BZQ+(384-(12-num7)*8));
               temp1=200;
         move_left_scan(BZQ, q);
         while(temp1--)  show_chinese(BZQ+(384-(12-num7)*8));    
     } 
   }
  else
   {  
    while(temp--)  move_left_scan(BZQ, q);          
   }
        IAP_CONTR=0x20;
   }
}

就是串口发送数据后,用单片机外部RAM存储起来,同时设置一个标志位,同时置TR0=1,进入定时器0中断后就立即置TR0=0,接着就调用显示函数,这样是没问题,问题是我通过上位机再次发送数据时,不能立即显示,必须要等到上次发送的内容显示完后才有效,这是什么原因啊?
 麻烦各位帮忙看一下,帮忙解决一下!谢谢!QQ:978520695

既然选择了就要一直走下去。。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-11-2 12:37:43 | 显示全部楼层
回复【楼主位】luling5897:
---------------------------------
应该要等到这次接收显示完才能显示下一次的啊.这样是正常的.
 你要考虑单片机的速度.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2011-11-2
在线时间
0 小时
 楼主| 发表于 2011-11-3 08:27:46 | 显示全部楼层
回复【回复【2楼】正点原子:
---------------------------------
我就是想串口接收到数据后,就立即显示接收到的数据,我的程序串口中断设置的是最高优先级,但根本就不起作用啊,请问一下还有别的方法能实现吗?
既然选择了就要一直走下去。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-11-3 08:54:05 | 显示全部楼层
你等接收完再显示.
不能接收一个字符,显示一个字符.这样可能会乱.因为你LCD显示一个字符的时间,有可能大于串口接收一个字符的时间,导致接收出错.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2011-11-2
在线时间
0 小时
 楼主| 发表于 2011-11-3 09:42:58 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我是先把一次接收到的所有数据用一个数组存起来(每次接收的数据长度是不定的),(只是数组定义uchar xdata BZQ[800];)然后再去调用显示,显示完后有一条系统软件复位语句 IAP_CONTR=0x20;  
既然选择了就要一直走下去。。。。。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-7-15
在线时间
1 小时
发表于 2020-7-15 15:32:25 | 显示全部楼层
提高单片机主频试试
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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