单片机串口通信问题

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-16 22:08
人中狼 发表于 2017-9-7 10:28
还是之前的建议,既然LSA,LSB,LSC是位显,那也就是有三位数码管,按现在的显示程序,只会是三位都显示相同的数据。
一个字节的数据按十六进制格式需要两位数码管才能显示出来,按你现在的程序来推断,数码管显示采用了动态扫描的驱动方式,但你的驱动程序却用了静态驱动的方式。
你说传数据后只显示8,但没说明计算机发送的 ...

发送的数据2,3,4,5,6都发过了,不知道是不是跳不出中断服务程序,静态数码管没显示了。。
人中狼
2楼-- · 2019-07-16 23:37
LSA,LSB,LSC这三个引脚现在是如何控制的。
现在需要说明一下运行情况:
一,在计算机未发送数据时,数码管显示什么,是否正常,temp最好初始化一个固定的数值。
二,计算机发送数据后,单片机是否能正确返回,如果可以正常返回的话,那就是只有显示有问题。
三,计算机最好发送小于0x0f的数据,大于这个值得数据如果能正确显示的话,显示的并不是正常数值,需要按数据位和数码管的段对应来判断是什么数值。
阿尔法UU
3楼-- · 2019-07-17 00:58
人中狼 发表于 2017-9-7 17:05
LSA,LSB,LSC这三个引脚现在是如何控制的。
现在需要说明一下运行情况:
一,在计算机未发送数据时,数码管显示什么,是否正常,temp最好初始化一个固定的数值。

改为静态数码管后,就不用LSA,LSB,LSC,控制了,计算机发送数据后可以正确返回数据,但是数码管刚开始时为0,发送数据后就不亮,发的数据是1,2,3,4,这些小于16的数。
wulinwl
4楼-- · 2019-07-17 03:56
 精彩回答 2  元偷偷看……
人中狼
5楼-- · 2019-07-17 07:57
你这里有几个问题:一,你所使用的数码管是什么型号的,即几位(也就是几个8字),是共阴的还是共阳的,第一次贴的程序是共阴数码管的段码,之后改过的程序是共阳数码管的段码。二,你先后的两个程序都是静态驱动数码管的程序,并没有任何一个是动态驱动的,动态驱动是指多位数码管(即多个8字)在显示时是每次只显示一个数码管,经过一定的延时后,再显示下一个数码管。三,三个数码管的位控制引脚再静态驱动方式下一定是一个固定的电平,在改过的程序里没有对这三个引脚进行控制,如果是共阴数码管,这三个引脚应该置0,或直接接地。
阿尔法UU
6楼-- · 2019-07-17 08:44
wulinwl 发表于 2017-9-7 18:17
在你的程序基础上改为三位动态显示
#include
#define uchar unsigned char

感谢大佬,我修改你的程序后,可以了,但是有个问题,为什么要用三个数码管显示,还有就是为啥不能直接显示我想要的数,就是输入3得到3,而是得到3的ASCII码051呢,我有点疑惑,还有就是为啥我用静态数码管显示不了呢
#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,aa=0,flag=0;
uchar bai,shi,ge;
uchar x=0;
void display();
void init();
void main()
{
        init();
        while(1)
        {
                if(flag==1)
                {  
                        ES=0;
                        flag=0;
                        SBUF=temp;
                        while(!TI);
                        TI=0;
                        ES=1;
                }
/*************数据分解***************/
                bai=temp/100;                        // 百位
                shi=temp/10%10;                        // 十位
                ge =temp%10;                        // 个位

                display();
        }
}        

void init()
{
        SCON=0X50;
        TMOD=0X20;
        PCON=0X80;
        TH1=0XF3;
        TL1=0xF3;
        EA=1;
        TR1=1;
        ES=1;
}
void display()
{
        aa++;
        if(aa>=100)                //0~65535根据主循环速度调整到约1ms为佳
        {
                aa=0;
                switch(x)
                {
                        case 0:  
                                P1=0x00;                //消隐
                                LSA=0,LSB=0,LSC=0;                       
                                               //显示百位
                                P1=table[bai];        
                                x=1;                        //循环动态显示
                        break;
        
                        case 1:
                                P1=0x00;
                                LSA=1,LSB=0,LSC=0;                //显示十位
                        
                                P1=table[shi];
                                x=2;
                         break;
        
                        case 2:
                                P1=0x00;
                                LSA=0,LSB=1,LSC=0;                //显示个位
                                P1=table[ge];
                                x=0;
                        break;
                }        
        }
}

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

一周热门 更多>