找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1341|回复: 13
收起左侧

关于51单片机数码管显示大于32768以上的数字时乱码的问题

[复制链接]
ID:158391 发表于 2022-12-13 14:33 | 显示全部楼层 |阅读模式
51单片机数码管显示32767以下的数字正常,32768以上的数字就是乱码,是数据类型定义错误吗?应该怎么改?我现在自学51,小白一个,求大佬指导!
原程序如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit WE1 = P2^2;
sbit WE2 = P2^3;
sbit WE3 = P2^4;

uint i,ge,shi,bai,qian,wan;
void delay(uint z)
{
uint x,y;
for( x = z; x > 0; x--)
for(y = 124; y > 0; y--);
}

uint code duan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void display(i)
{
ge = i%10;
shi = i%100/10;
bai = i%1000/100;
qian = i%10000/1000;
wan = i/10000;

WE1 = 1;
WE2 = 1;
WE3 = 1;
P0 = duan[ge];
delay(1);
P0 = 0x00;

WE1 = 0;
WE2 = 1;
WE3 = 1;
P0 = duan[shi];
delay(1);
P0 = 0x00;
WE1 = 1;
WE2 = 0;
WE3 = 1;
P0 = duan[bai];
delay(1);
P0 = 0x00;
WE1 = 0;
WE2 = 0;
WE3 = 1;
P0 = duan[qian];
delay(1);
P0 = 0x00;
WE1 = 1;
WE2 = 1;
WE3 = 0;
P0 = duan[wan];
delay(1);
P0 = 0x00;

}

void main()
{
while(1)
{
i = 32768;
display(i);

}
}
另外在51上计数器最大能计多大的数,它的数据类型最大能定义多大的,比如我想计到50亿,然后让这个数在数码管上显示出来
回复

使用道具 举报

ID:883242 发表于 2022-12-13 16:25 | 显示全部楼层
好奇怪,我用MinGW_x64 8.1运行了下你的分拆那部分代码,没有问题啊!

没有仿真器就用串口把ge,shi,bai,qian,wan的值打印出来。
回复

使用道具 举报

ID:213173 发表于 2022-12-13 16:47 | 显示全部楼层
void display(i)//参数没有声明数据类型输错。改为 void display(uint i)
回复

使用道具 举报

ID:227393 发表于 2022-12-13 16:51 来自手机 | 显示全部楼层
延时时间不够,重影了
回复

使用道具 举报

ID:584814 发表于 2022-12-13 17:20 | 显示全部楼层
溢出错误。
int能存储的数据的范围为:-32768~32767,32768自然出错;
unsigned int能存储的数据范围为:0~65535,65536也出错;
long int能存储的数据范围为:-2147483648~2147483647,这个够长9位数码管都不出错
unsigned long int ......
回复

使用道具 举报

ID:883242 发表于 2022-12-13 17:51 | 显示全部楼层
man1234567 发表于 2022-12-13 17:20
溢出错误。
int能存储的数据的范围为:-32768~32767,32768自然出错;
unsigned int能存储的数据范围为: ...

为什么不仔细审题就乱发言呢?楼主代码是:
#define uint unsigned int
uint i,ge,shi,bai,qian,wan;

根本就没有你说的那些问题。
回复

使用道具 举报

ID:158391 发表于 2022-12-13 18:16 | 显示全部楼层
Hephaestus 发表于 2022-12-13 16:25
好奇怪,我用MinGW_x64 8.1运行了下你的分拆那部分代码,没有问题啊!

没有仿真器就用串口把ge,shi,bai, ...

这个。。。。。还没学到数据传输,呵呵
回复

使用道具 举报

ID:158391 发表于 2022-12-13 18:19 | 显示全部楼层
wulin 发表于 2022-12-13 16:47
void display(i)//参数没有声明数据类型输错。改为 void display(uint i)

感谢大神!按您改的可以正常显示了。但我已经在上面定义了全局变量 uint i,为什么这里还需要再次声明一下呢?
回复

使用道具 举报

ID:158391 发表于 2022-12-13 18:31 | 显示全部楼层
man1234567 发表于 2022-12-13 17:20
溢出错误。
int能存储的数据的范围为:-32768~32767,32768自然出错;
unsigned int能存储的数据范围为: ...

感谢,按板凳说的重新在定义一下uint i就可以正常显示了
回复

使用道具 举报

ID:213173 发表于 2022-12-13 19:07 | 显示全部楼层
ldc2000 发表于 2022-12-13 18:19
感谢大神!按您改的可以正常显示了。但我已经在上面定义了全局变量 uint i,为什么这里还需要再次声明一 ...

此“i”非彼“i”,void display(i)形参不声明数据类型Keil编译器默认int型,数据范围-32768~32767。
回复

使用道具 举报

ID:158391 发表于 2022-12-13 19:13 | 显示全部楼层
wulin 发表于 2022-12-13 19:07
此“i”非彼“i”,void display(i)形参不声明数据类型Keil编译器默认int型,数据范围-32768~32767。

呦西!就是全局变量不能作用在函数内部,局部和全局两个互不关联是吧
回复

使用道具 举报

ID:1034262 发表于 2022-12-13 20:32 | 显示全部楼层
溢出问题,初学者很多都会遇到。int型变量正数只能到32767,超过用long型。
回复

使用道具 举报

ID:996773 发表于 2022-12-14 08:49 | 显示全部楼层
我是用汇编的,楼主思路和我不一样哦,我会以寄存器为单元,例如从30h开始,加1,然后在显示器上显示,再加1,再刷新显示,等加满100的时候开始往31H加1,显示器上开始显示第三位数字,30h显示单元归0,这样循环下去,只要显示位数足够,51寄存器也足够的,计数器数字远大于上亿。这思路很简单不复杂
回复

使用道具 举报

ID:77589 发表于 2022-12-14 09:07 | 显示全部楼层
这明显是所定义的数据类型不能装下你给出的数据,发生溢出了!不管在什么地方声明变量都要从实际考虑所使用的数据类型能否包括所有情况。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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