[讨论] 关于串口发送数码管显示的问题

whhjdz   2010-2-17 18:32 楼主
大家好,下面这个程序可以用串口助手发送十六进制数并在数码管上显示.因为串口通讯软件只能发2位数,所以显示也只能是2位,
请教大家:如和实现三位数字的发送与显示,举例说明:比如我想发送123并在单片机的数码管上显示123,该如何发送与分离数字.
程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
uchar ss,sg;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};


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

void display(uint i)
{
uchar ss,sg;

ss=i/16;
sg=i%16;

P0=table[ss];
P2=0x7f;
delay(2);
P0=table[sg];
P2=0xbf;
delay(2);

}
void main(void)
{
uint i = 0;
Init_Uart();
while(1)
  {
      
   if(RI==1)
     {
   RI = 0;
   i = SBUF;
   }
   else  display(i);
   

  }
}


void Init_Uart(void)
{
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
SCON = 0x50;
PCON = 0;
EA = 1;
}



111.JPG

回复评论 (9)

程序加了注释

/*********************  (C) COPYRIGHT 2010  **************
* 文件名称: 串口.c
* 程序作者: whhjdz(QQ:595279970 ,Email:whhjdz@163.com)
* 程序版本: V1.0
* 编制日期: 02-17-2010
* 功能描述: PC串口与单片机通讯实验
* 编译器:Keil C uVision3
* 芯片:STC89C52,12M晶振
* 注意:  P0 -- 数码管段显示    P2 --  数码管位选
*                                        
*********************************************************/

#include                 //头文件

#define        uchar        unsigned char        //定义变量
#define        uint        unsigned int
uchar ss,sg;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};        //0~F字模




void delay(uint z)          //延时子函数
{
        uint x,y;
        for(x=z;x>0;x--)
          for(y=110;y>0;y--);
}


void display(uint i)          //显示子函数
{
        uchar ss,sg;

        ss=i/16;                 //分离数的十位
        sg=i%16;                 //分离数的个位

        P0=table[ss];
        P2=0x7f;                  //第一个数码管点亮并显示数的十位
        delay(2);
        P0=table[sg];          
        P2=0xbf;                  //第二个数码管点亮并显示数的个位
        delay(2);

}

void        Init_Uart(void)                 //定时器初始化(设置波特率)
{
        TMOD = 0x20;
        TH1 = 0xFD;
        TL1 = 0xFD;
        TR1 = 1;
        SCON = 0x50;
        PCON = 0;
        EA = 1;
}

void main(void)
{
        uint i = 0;
        Init_Uart();
        while(1)
                {
                    
                        if(RI==1)       
                   {
                        RI = 0;
                        i = SBUF;
                        }
                        else  display(i);                       

                }
}
点赞  2010-2-17 18:46
将显示程序改了一下,能显示三位了,但最大只能显示到255,对应的十六进制是FF

void display(uint i)          //显示子函数
{
        uchar sb,ss,sg;

        sb=i/100;                         //分离数的百位
        ss=i%100/10;                 //分离数的十位
        sg=i%10;                     //分离数的个位
       
       
        P0=table[sb];
        P2=0x7f;                  //第一个数码管点亮并显示数的百位
        delay(2);
        P0=table[ss];          
        P2=0xbf;                  //第二个数码管点亮并显示数的十位
        delay(2);
        P0=table[sg];
        P2=0xdf;                 //第二个数码管点亮并显示数的个位
        delay(2);

}
点赞  2010-2-17 19:58
楼主厉害!小生佩服!
点赞  2010-2-17 21:06

strong

顶!!该贴强的!!解决了问题,不错!
你好呀
点赞  2010-2-18 08:06
关于为什么只能显示0-255,其实大家都知道,因为你读了一个字节,也就是Uchar,而字节表示的范围从0-255,如果你想显示大于255的数字,那你得2个字节来表示。unsigned int.但显示范围从0-65535,还是有范围限制。如果想显示更大的数字,你得用四个字节来表示,还有个问题,如果你不停地发送2个字节,在接受端你得知道哪一个是高字节,哪一个是低字节,建议你最好加上前导符号和终止符号,供接受端识别。

[ 本帖最后由 jxb01033016 于 2010-2-18 12:41 编辑 ]
点赞  2010-2-18 12:39
楼上所说正解呀,后来想了在群里面,得一师傅指点,基本达到了要求,现将程序发上
/*********************  (C) COPYRIGHT 2010  **************
* 文件名称: 串口.c
* 程序作者: whhjdz(QQ:595279970 ,Email:whhjdz@163.com)
* 程序版本: V1.0
* 编制日期: 02-17-2010
* 功能描述: PC串口与单片机通讯实验:8位数码管显示来自电脑发送的数字
* 编译器:Keil C uVision3
* 芯片:STC89C52,12M晶振
* 注意:  P0 -- 数码管段显示    P2 --  数码管位选
*                                        
*********************************************************/

#include                 //头文件

#define        uchar        unsigned char        //定义变量
#define        uint        unsigned int
#define LED P0
uchar bb,ss,sg;

uchar code table[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};        //0~F字模




void delay(uint z)          //延时子函数
{
        uint x,y;
        for(x=z;x>0;x--)
          for(y=110;y>0;y--);
}



void display(uint j)          //显示子函数
{
uchar b,c,d,e,f,g,h,i;///(A)串口数据

if(j!=0xff)
{

if(bb==1)
{
b=j;
}

if(bb==2)

{
c=j;

}
if(bb==3)

{

d=j;
}

if(bb==4)

{
e=j;

}

if(bb==5)

{
f=j;

}

if(bb==6)

{
g=j;

}

if(bb==7)

{
h=j;

}

if(bb==8)

{
bb=0;
i=j;

}

}

else bb=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;






        P0=table;
        P2=0x7f;                  //第一个数码管点亮并显示数的百位
        delay(2);
        P0=table[c];          
        P2=0xbf;                  //第二个数码管点亮并显示数的十位
        delay(2);
       
        P0=table[d];
        P2=0xdf;                 //第二个数码管点亮并显示数的个位
        delay(2);  
        P0=table[e];
        P2=0xef;                  //第一个数码管点亮并显示数的百位
        delay(2);

        P0=table[f];          
        P2=0xf7;                  //第二个数码管点亮并显示数的十位
        delay(2);
        P0=table[g];
        P2=0xfb;                 //第二个数码管点亮并显示数的个位
        delay(2);

        P0=table[h];
        P2=0xfd;                  //第一个数码管点亮并显示数的百位
        delay(2);
        P0=table;          
        P2=0xfe;                  //第二个数码管点亮并显示数的十位
        delay(2);

}


void        Init_Uart(void)                 //定时器初始化(设置波特率)
{
        TMOD = 0x20;
        TH1 = 0xFD;
        TL1 = 0xFD;
        TR1 = 1;
        SCON = 0x50;
        PCON = 0;
        EA = 1;
}

void main(void)
{
        uint j = 0;
        Init_Uart();
        while(1)
                {
                    
                        if(RI==1)       
                           {
                                bb++;
                                RI = 0;                       
                            j = SBUF;
                                  }
                        else  display(j);                       

                }
}
点赞  2010-2-18 19:33
不好意思,显示子函数的注释部分没修改,不影响程序的运行
点赞  2010-2-18 19:36
LS程序结构还可以调整下:
void display(uint j) ,可以用SWITCH和CASE代替IF,程序看起来更加清楚明了。
而且你这样的程序执行效率不高,应该是IF
  
                                                                        ELSE  IF
                                                                                    ELSE   IF
点赞  2010-2-19 11:26
多谢多谢
点赞  2010-2-20 19:15
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复