找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2900|回复: 8
收起左侧

这个为啥我发两位数时它显示这两位数,但是我发三位数时只显示我发送的第三位数

[复制链接]
ID:654651 发表于 2019-12-5 09:22 | 显示全部楼层 |阅读模式
#include "reg52.h"                         //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;          //对数据类型进行声明定义
typedef unsigned char u8;
u8 receiveData=0;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值


void delay(u16 i)
{
        while(i--);       
}
void UsartInit()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X00;                        //波特率不加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是2400的
        TL1=TL1;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}

void display(unsigned char x)
{
                                LSA=0;LSB=0;LSC=0;P0=smgduan[x%16];delay(100);P0=0x00;//显示第0位
                                LSA=1;LSB=0;LSC=0;P0=smgduan[x%256/16];delay(100);P0=0x00;//显示第1位
                            LSA=0;LSB=1;LSC=0;P0=smgduan[x/256];delay(100);P0=0x00;//显示第2位
}                               
void main()
{       
        UsartInit();  //        串口初始化
        while(1)
        {
                display(receiveData);
        }               
}

void Usart() interrupt 4
{
        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志位
}

回复

使用道具 举报

ID:584814 发表于 2019-12-5 10:49 | 显示全部楼层
疑似数据溢出或正常,你可以直接在u8 receiveData=0语句中赋值试试。
回复

使用道具 举报

ID:396245 发表于 2019-12-5 11:05 | 显示全部楼层
void display(unsigned char x)//unsigned char占1个字节,最大255。超过255的高位将被舍去,0x1234》》0x34
{
                                LSA=0;LSB=0;LSC=0;P0=smgduan[x%16];delay(100);P0=0x00;//显示第0位
                                LSA=1;LSB=0;LSC=0;P0=smgduan[x%256/16];delay(100);P0=0x00;//显示第1位
                                LSA=0;LSB=1;LSC=0;P0=smgduan[x/256];delay(100);P0=0x00;//显示第2位
}

还有注意标红色的地方,我想你应该能看懂了。
回复

使用道具 举报

ID:213173 发表于 2019-12-5 11:18 | 显示全部楼层
串口助手在HEX模式时每次收发16进制一个字节数据,假设你在串口助手里发送123,实际发出的是0x12和0x03,在你的程序中0x12瞬间被0x03覆盖了,所以就只能显示第三位数。
回复

使用道具 举报

ID:654651 发表于 2019-12-5 12:55 | 显示全部楼层
wulin 发表于 2019-12-5 11:18
串口助手在HEX模式时每次收发16进制一个字节数据,假设你在串口助手里发送123,实际发出的是0x12和0x03,在 ...

那我应该怎样去解决这个问题
回复

使用道具 举报

ID:654651 发表于 2019-12-5 12:57 | 显示全部楼层
SroneBridge 发表于 2019-12-5 11:05
void display(unsigned char x)//unsigned char占1个字节,最大255。超过255的高位将被舍去,0x1234》》0x3 ...

那解决这个问题应该怎么办
回复

使用道具 举报

ID:275826 发表于 2019-12-5 14:45 | 显示全部楼层
要定义一个接收数组,把接收到的字节都存储
回复

使用道具 举报

ID:213173 发表于 2019-12-5 21:35 | 显示全部楼层
liuhengzhi 发表于 2019-12-5 12:55
那我应该怎样去解决这个问题

这是串口收发数据串的问题。在实际应用中串口通讯都是以数据串的形式工作。一串完整的数据称作一帧,一帧数据包含若干个字节。具体有多少字节是由通讯协议确定的。最简单的自定义通讯协议通常包含1~2个字节的数据头,1~4个字节的有效数据,一个字节的数据尾(验证数据)。串口接收中断函数一旦收到数据头信息就开启缓存数组,按顺序保存收到的数据。待一帧数据接收结束,产生一个结束标志。数据解析程序按通讯协议解析收到的数据串,经控制程序执行任务。如果需要传输的有效数据值大于255,就需要把这个数据分解为若干字节传输。接收端再把若干字节合并还原。
回复

使用道具 举报

ID:235200 发表于 2019-12-6 00:39 | 显示全部楼层
liuhengzhi 发表于 2019-12-5 12:55
那我应该怎样去解决这个问题

如果你要显示123,就要分2次或3次发,发送12 和03,接收后还要处理,或发送01 02 03,分配显示在3位数码管上,如果你直接按16进制发,只要发7B就行了,然后分离出百十个位
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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