发 帖  
原厂入驻New
为什么51单片机串口通信数码管永远只能显示出两位来?
175 51单片机 数码管
分享
题目如下

结果如下
无论我怎么更换位选信号 原本应该显示出来的五位数码管永远只能出来两位,以下是我的代码。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag,i,yi,er,san,si,wu;
uint a;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
        uint i,j;
        for(i=0;i<xms;i++)
                for(j=110;j>0;j--);
}
void display(uchar yi,uchar er,uchar san,uchar si,uchar wu)
{
        dula=1;
        P0=table[yi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xef;
        wela=0;
        delayms(1);
        dula=1;
        P0=table[er];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delayms(1);
        dula=1;
        P0=table[san];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delayms(1);
        dula=1;
        P0=table[si];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delayms(1);
        dula=1;
        P0=table[wu];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delayms(1);
}
void init()
{
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
}
void main()
{
        init();
        while(flag==1)
        {
                wu=a/65536;
                si=a%65536/4096;
                san=a%65536%4096/256;
                er=a%65536%4096%256/16;
                yi=a%65536%4096%256%16;
                display(yi,er,san,si,wu);
        }
}
void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}
0
2019-9-18 03:30:45   评论 分享淘帖 邀请回答
4个回答
刚入门吧,C语言基础太差
错误一:你串口每次都接收一个字符就做运算a=SBUF,SBUF是一个char型数据,最大就只有255,正确做法,应该接收两个字符后进行移位再相与
错误二:分离一个数字每一位的方法,学C语言这么基础的东西还没搞懂?
                wu=a/10000;
                si=a%10000/1000;
                san=a%1000/100;
                er=a%100/10;
                yi=a%10;
2019-9-18 09:02:59 评论

举报

没学过C的就不要编这么复杂的程序了,你先编一个程序显示任意一个5位数,弄好了再弄别的,
2019-9-18 09:51:32 评论

举报

wu=a/65536;这句话你能解释是什么意思吗
2019-9-18 09:51:54 评论

举报

串口每次接收的数据范围0~255,按16进制分解只能得到0x00~0xff,所以只能显示2位数字
分解为16进制数要用移位法,否则会消耗CPU很多时间。
                        wu = a>>16&0x0f;
                        si = a>>12&0x0f;
                        san= a>>8&0x0f;
                        er = a>>4&0x0f;
                        yi = a&0x0f;
2019-9-18 15:16:55 评论

举报

只有小组成员才能发言,加入小组>>

819个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

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