打印

求大神解答

[复制链接]
1268|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
二月止境|  楼主 | 2013-9-27 19:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上位机输入一个数然后在单片机上显示,可是无论怎样改数码管始终乱码,而且从串口调试助手上看,我发送一个数据,,他却在不停的接收,求大神解答



#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit we=P2^6;
sbit du=P2^7;

uchar shu1,shu2,ge,shi,bai,flag,b,i;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void init()
{
  TMOD=0x20;
  REN=1;
  SM0=0;
  SM1=1;
  EA=1;
  ES=1;
  TH1=0xf4;
  TL1=0xf4;
  TR1=1;

}

void delay(uint z)
{
    uint x,y;
    for(x=z;x>0;x--)
       for(y=110;y>0;y--);
}


void display(uchar bai,uchar shi,uchar ge)
{
      
             
      we=1;
          P0=0xfe;
          we=0;
          du=1;
          P0=table[bai];
          du=0;
          P0=0xff;
          delay(5);

            
      we=1;
          P0=0xfd;
          we=0;
          du=1;
          P0=table[shi];
          du=0;
          P0=0xff;
          delay(5);


          we=1;
          P0=0xfb;
          we=0;
          du=1;
          P0=table[ge];
          du=0;
          P0=0xff;
          delay(5);          
                           
                           

}


void main()
{
    init();
        while(1)
        {
                if(flag==1)
                {
          if(b>=300)
            b=0;
                  flag=0;
                  ES=0;
                  TI=1;
                  SBUF=b;
                  while(!TI);
                  TI=0;
                  ES=1;
                }
                ge=b%10;
                shi=b%100/10;
                bai=b/100;
            display(bai,shi,ge);
        }
}


void timer() interrupt 4
{
   
   RI=0;
   i++;
   if(i==1)                   //SBUF一次只能读一个值,,我就用了两个shu1和shu2来存了;
   {
      shu1=SBUF;
   }
   else if(i==2)
   {
     i=0;
     shu2=SBUF;
         b=shu1*256+shu2;
         flag=1;
   }
   else;

}

相关帖子

沙发
NE5532| | 2013-9-28 09:45 | 只看该作者
楼主前后描述不一,前面说的是从上位机往单片机传输,后面说的是串口助手显示一直在接收,你到底是从哪边传到哪边?串口助手那个测试是怎么做的?另外你Timer的中断和串口的接收之间是如何同步起来的?

使用特权

评论回复
板凳
二月止境|  楼主 | 2013-9-28 19:33 | 只看该作者
NE5532 发表于 2013-9-28 09:45
楼主前后描述不一,前面说的是从上位机往单片机传输,后面说的是串口助手显示一直在接收,你到底是从哪边传 ...

不好意思哈 ,,可能没表述清楚,是这样的。是用调试助手发送数据,,然后那个助手不是也可以看见返回值吗?语句b=SBUF就是把b显示在助手上。然后定时器用的是串口方式,数据接收完毕一次就转到执行flag=1时的语句。问题是为什么那个数据一直在不停的接收

使用特权

评论回复
地板
NE5532| | 2013-9-28 21:32 | 只看该作者
给楼主纠正一下,不是“串口助手可以看见返回值”,是串口助手收到了你发给上位机的数据(看见返回值就成了串口助手看到了自己发送的数据了)。不停的收,是因为你在不停的发,你的Timer中断里根本就没判断串口有没有收到数据,一直在读SBUF寄存器!

使用特权

评论回复
5
二月止境|  楼主 | 2013-9-28 21:53 | 只看该作者
NE5532 发表于 2013-9-28 21:32
给楼主纠正一下,不是“串口助手可以看见返回值”,是串口助手收到了你发给上位机的数据(看见返回值就成了 ...

哦 谢谢指正,,我刚学没十天呢。给我说一下咋个判断嘛,,我记得视频教程里不是说中断就代表接收一个数据完成的嘛,,而且马上将RI置0

使用特权

评论回复
6
NE5532| | 2013-9-28 21:55 | 只看该作者
二月止境 发表于 2013-9-28 21:53
哦 谢谢指正,,我刚学没十天呢。给我说一下咋个判断嘛,,我记得视频教程里不是说中断就代表接收一个数 ...

对啊,但是你什么地方检察了RI有没有置位呢?我只看到你在Timer中断里不停的读串口数据寄存器。

使用特权

评论回复
7
二月止境|  楼主 | 2013-9-28 22:36 | 只看该作者
NE5532 发表于 2013-9-28 21:55
对啊,但是你什么地方检察了RI有没有置位呢?我只看到你在Timer中断里不停的读串口数据寄存器。 ...

我试了试 还是不知道咋个判断  给我说哈嘛,,:(

使用特权

评论回复
8
NE5532| | 2013-9-29 08:42 | 只看该作者
while (RI != 1);
i = SBUF;

这就是查询接收,但是主程序大了以后,没有足够的时间来查询,所以你的串口接收应该用RI的中断,而不是Timer中断

使用特权

评论回复
9
二月止境|  楼主 | 2013-9-29 13:12 | 只看该作者
NE5532 发表于 2013-9-29 08:42
while (RI != 1);
i = SBUF;

SBUF值怎么要赋给i?我在timer中已经将RI置0;加上while(RI!=1)的话程序不就一直在那循环了啊。。还有,RI中断我不知道是啥子,,求大神解释

使用特权

评论回复
10
NE5532| | 2013-9-29 13:41 | 只看该作者
二月止境 发表于 2013-9-29 13:12
SBUF值怎么要赋给i?我在timer中已经将RI置0;加上while(RI!=1)的话程序不就一直在那循环了啊。。还有 ...

RI是串口收到数据中断,是收到上位机以后提醒你,数据来了,因为你不知道什么时候上位机会发数过来,是只有一直在哪里等嘛。SBUF读的时候读的是收到的数,写的时候写进去的是要发送的数,楼主需要把教材上51串口章节再复习一遍啊。

使用特权

评论回复
11
二月止境|  楼主 | 2013-9-29 13:57 | 只看该作者
NE5532 发表于 2013-9-29 13:41
RI是串口收到数据中断,是收到上位机以后提醒你,数据来了,因为你不知道什么时候上位机会发数过来,是只 ...

哦。。是的再看看书咯,,谢谢指教了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝