找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2783|回复: 12
打印 上一主题 下一主题
收起左侧

串口接受0~65536数字,然后再在数码管上显示出来程序有点问题,麻烦大神帮忙改改

[复制链接]
跳转到指定楼层
楼主
ID:225054 发表于 2017-10-13 07:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define BUF_LEN 2
sbit dula = P2^6;
sbit wela = P2^7;
uint table1[BUF_LEN],temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar bai,shi,ge,flag,num;//,num1;
uint temp;
void delay(uint xm)
{
uint j,i;
for(i=xm;i>0;i--)
  for(j=110;j>0;j--);
}
void display(uchar,uchar,uchar);
void init(void);
void main(void)
{
init();
while(1)
{
  
display( bai, shi, ge);
  if(flag==1)
  {
  temp=(((uchar)table1[1])<<8)|table[0];//为什么这样合并后回事乱码?
   flag=0;
  }
}
}
void init(void)
{
TMOD=0X20;
TH1=0xfd;
TL1=0Xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
num=0;

}
void ser() interrupt 4
{
RI=0;
num++;
if(num==1)
table1[num]=SBUF;
if(num==2)
{
table1[num]=SBUF;
num=0;
flag=1;
}
}//怎么样才能接受两个八位数据然后在合并成一个16位呢?

void display(uchar bai,uchar shi,uchar ge)
{
  
  
    bai=temp/100;
    shi=temp%100/10;
    ge=temp%10;
  
  wela=1;
  P0=0Xfe;
  wela=0;
  dula=1;
  P0=table[bai];
  dula=0;
  P0=0xff;
  delay(1);
  


    wela=1;
  P0=0Xfd;
  wela=0;
  dula=1;
  P0=table[shi];
  dula=0;
  P0=0xff;
  delay(1);


  wela=1;
  P0=0Xfb;
  wela=0;
  dula=1;
  P0=table[ge];
  dula=0;
  P0=0xff;
  delay(1);

}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:225054 发表于 2017-10-13 13:21 来自触屏版 | 只看该作者
没人帮忙看看吗?
回复

使用道具 举报

板凳
ID:225054 发表于 2017-10-13 22:38 来自触屏版 | 只看该作者
w322405 发表于 2017-10-13 13:21
没人帮忙看看吗?

高手呢?
回复

使用道具 举报

地板
ID:123289 发表于 2017-10-14 19:30 | 只看该作者
一步步调试,看哪一步不是你所设想的。
回复

使用道具 举报

5#
ID:126608 发表于 2017-10-15 21:19 | 只看该作者
为什么段码和位码都在p0口,可是别的程序都在两个口。
回复

使用道具 举报

6#
ID:225054 发表于 2017-10-15 23:30 来自触屏版 | 只看该作者
1123212143255 发表于 2017-10-15 21:19
为什么段码和位码都在p0口,可是别的程序都在两个口。

使用的是郭天祥的板子,数码管是通过两个锁存器和单片机连接的,位选和段选公用P0口的
回复

使用道具 举报

7#
ID:213173 发表于 2017-10-16 15:02 | 只看该作者
1.你定义缓存数组为2,可你在串口中断中用了if(num==2) table1[num]=SBUF;是不存在的,只有table1[0]和table1[1]。
2.在合并数据时table1[0]和table1[1]都要强制转换数据类型,
3.在显示程序中16位数据最大0xffff=65535,需要5位数码管才能完整显示。
这是在你的程序基础修改过的程序,先发送低4位,后发送高4位。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
//#define BUF_LEN 2
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};
uchar data table1[2];
uchar wan,qian,bai,shi,ge;
uint temp=0;
bit num,flag=0;
void display();
void init();

void delay(uint xm)
{
        uint j,i;
        for(i=xm;i>0;i--)
          for(j=110;j>0;j--);
}

void main(void)
{
        init();
        while(1)
        {  
                if(flag==1)
                {
                        flag=0;
                        temp=(uint)(table1[1]<<8)|(uint)(table1[0]);
//                        temp=(((uchar)table1[1])<<8)|table[0];//为什么这样合并后回事乱码?
                }
                wan  = temp/10000;                // 万位
                qian = temp%10000/1000;                // 千位
                bai  = temp%1000/100;                        // 百位
                shi  = temp%100/10;                                // 十位
                ge   = temp%10;                                //个位
                display();
        }
}

void init(void)
{
        TMOD=0X20;
        TH1=0xfd;
        TL1=0Xfd;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        num=1;//初始为1
}
void ser() interrupt 4
{
        RI=0;
        num=~num;//初始为1
        table1[num]=SBUF;//低4位存table1[0],高4位存table1[1],
        if(num==1)
                flag=1;
}//怎么样才能接受两个八位数据然后在合并成一个16位呢?

void display()//16位数据最大0xffff=65535,需要5位十进制才能显示
{
        wela=1;
        P0=0Xfe;
        wela=0;
        dula=1;
        P0=table[wan];
        dula=0;
        P0=0xff;
        delay(1);
       
        wela=1;
        P0=0Xfd;
        wela=0;
        dula=1;
        P0=table[qian];
        dula=0;
        P0=0xff;
        delay(1);
       
        wela=1;
        P0=0Xfb;
        wela=0;
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        delay(1);

        wela=1;
        P0=0Xf7;
        wela=0;
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        delay(1);
       
        wela=1;
        P0=0Xef;
        wela=0;
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        delay(1);
}



评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:237942 发表于 2017-10-16 15:18 | 只看该作者
位选信号定义的有问题
回复

使用道具 举报

9#
ID:237942 发表于 2017-10-16 15:18 | 只看该作者
位选信号定义有问题
回复

使用道具 举报

10#
ID:225054 发表于 2017-10-17 07:24 来自触屏版 | 只看该作者
GG276192978 发表于 2017-10-16 15:18
位选信号定义有问题

没错啊,我自己定义一个数可以正常显示
回复

使用道具 举报

11#
ID:225054 发表于 2017-10-18 16:05 来自触屏版 | 只看该作者
wulin 发表于 2017-10-16 15:02
1.你定义缓存数组为2,可你在串口中断中用了if(num==2) table1[num]=SBUF;是不存在的,只有table1[0]和tabl ...

谢谢啊
回复

使用道具 举报

12#
ID:225054 发表于 2017-10-18 16:06 来自触屏版 | 只看该作者
wulin 发表于 2017-10-16 15:02
1.你定义缓存数组为2,可你在串口中断中用了if(num==2) table1[num]=SBUF;是不存在的,只有table1[0]和tabl ...

如何确定接收的是高位和低位啊,这里我还是有点糊涂,
回复

使用道具 举报

13#
ID:213173 发表于 2017-10-19 13:35 | 只看该作者
本帖最后由 wulin 于 2017-10-19 16:58 编辑
w322405 发表于 2017-10-18 16:06
如何确定接收的是高位和低位啊,这里我还是有点糊涂,

你随便发两个不一样的HEX数,例如:令低8位为0x01、令高8位为0x02,得到513就说明顺序对了,如果得到258说明顺序错了。只要把发送顺序、接收保存顺序、合并转换顺序三者之一对调一下就行了。顺便说明一下,上面回复的《2.在合并数据时table1[0]和table1[1]都要强制转换数据类型》不完全正确,不同数据类型的运算中系统会自动转换数据类型再运算,所以这一句可以改为     temp=table1[1]<<8|table1[0];   你原来这样写temp=(((uchar)table1[1])<<8)|table[0];是会出错的。所以:
正确   temp=table1[1]<<8|table1[0];
正确   temp=(uint)(table1[1]<<8)|(uint)(table1[0]);
错误          temp=(((uchar)table1[1])<<8)|table[0];

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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