单片机串口通信问题

2019-07-15 09:42发布

本想通过计算机向单片机传送数据,然后在数码管上显示,同时单片机把接受到的数据传回给计算机,在串口助手上显示,但得到的现象跟预期不大一样,求大神指出编程问题所在。

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint temp=0,mm,nn,aa,flag;
void display(uchar bai);
void init();
void main()
{
    init();
    while(1)
    {
           if(flag==1)
           {  
              ES=0;
                  SBUF=temp;
                  while(!T1);
                  ti=0;
                  ES=1;
                  flag=0;
       }

           display(temp);
        }

}       

void init()
{  SCON=0X50;
   TMOD=0X20;
   PCON=0X80;
   TH1=0XF3;
   TL1=0xF3;
           EA=1;
        TR1=1;
        ES=1;



}
void display(uchar bai)
{

        LSA=0,LSB=0,LSC=0;
        P1=table[bai];
       
}

void chuangkou() interrupt 4
{
         RI=0;
         temp=SBUF;
         flag=1;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
阿尔法UU
1楼-- · 2019-07-15 22:36
人中狼 发表于 2017-9-7 09:49
建议先调试数码管显示,先确定能正确显示想要显示的数据,看你的数码管显示程序像是静态驱动方式,但似乎是3个数码管,这样的话,如果是静态驱动方式,有三个数码管,按你的程序就会是三个数码管显示相同的内容。
其次调试串口发送数据,这样可以确定单片机与计算机之间串口的参数是否设置一致。
最后就可以按你所要求的功 ...

额,那个LSA,LSB,LSC,是用来控制数码管的位显的,现在得情况是没传数据前显示0,传数据后只显示8,其他的数显示不出
人中狼
2楼-- · 2019-07-16 03:14
还是之前的建议,既然LSA,LSB,LSC是位显,那也就是有三位数码管,按现在的显示程序,只会是三位都显示相同的数据。
一个字节的数据按十六进制格式需要两位数码管才能显示出来,按你现在的程序来推断,数码管显示采用了动态扫描的驱动方式,但你的驱动程序却用了静态驱动的方式。
你说传数据后只显示8,但没说明计算机发送的是什么数据,按你的程序推断,如果显示8的话,那么发送的数据是0x08吗
wulinwl
3楼-- · 2019-07-16 08:18
错误:while(!T1);
正确:while(!TI);
阿尔法UU
4楼-- · 2019-07-16 10:42
wulinwl 发表于 2017-9-7 15:46
错误:while(!T1);
正确:while(!TI);

这个改回来之后,单片机给计算机发送的数据是正确的,但是数码管的显示还是不对
阿尔法UU
5楼-- · 2019-07-16 11:23
 精彩回答 2  元偷偷看……
阿尔法UU
6楼-- · 2019-07-16 16:52
人中狼 发表于 2017-9-7 10:28
还是之前的建议,既然LSA,LSB,LSC是位显,那也就是有三位数码管,按现在的显示程序,只会是三位都显示相同的数据。
一个字节的数据按十六进制格式需要两位数码管才能显示出来,按你现在的程序来推断,数码管显示采用了动态扫描的驱动方式,但你的驱动程序却用了静态驱动的方式。
你说传数据后只显示8,但没说明计算机发送的 ...

不知道是不是跳不出中断服务程序

一周热门 更多>