找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么这个单片机程序的计算答案不是显示1650

[复制链接]
跳转到指定楼层
楼主
本人刚刚学习51单片机, 做了一个显示 30 X 55 答案的小程序,
但显示的答案 不是 1650 而是 1672,
请问我错在哪里?
谢谢
(我用的是普中单片机开发板)

#include<reg52.h>
#include<intrins.h>


sbit HC138_A = P1^0;
sbit HC138_B = P1^1;
sbit HC138_C = P1^2;

unsigned char code smgduan[10]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0Xff};


void delay7ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=26;b>0;b--)
for(a=133;a>0;a--);
}


void main()
{
unsigned char x = 30;
unsigned char y = 55;
unsigned int z;
z = x*y;


while(1)
{
HC138_A = 1; HC138_B = 1; HC138_C = 0; P0 = smgduan[z/1000]; delay7ms();
HC138_A = 0; HC138_B = 1; HC138_C = 0; P0 = smgduan[(z%1000)/100]; delay7ms();
HC138_A = 1; HC138_B = 0; HC138_C = 0; P0 = smgduan[(z%100)/10]; delay7ms();
HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z%10]; delay7ms();
}
}

IMG_20211103_235121.jpg (280.41 KB, 下载次数: 35)

IMG_20211103_235121.jpg

C6-4.pdf

45.29 KB, 下载次数: 5

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

使用道具 举报

沙发
ID:213173 发表于 2021-11-4 06:34 | 只看该作者
计算结果本身没有错,是显示出错。你驱动数码管的段码和位码错位。把1650显示成2761,位序反后2761就成1672。
回复

使用道具 举报

板凳
ID:752974 发表于 2021-11-4 08:22 | 只看该作者
检查一下段吗。
回复

使用道具 举报

地板
ID:844772 发表于 2021-11-4 08:35 | 只看该作者
x,y定义的是char,你结果又超出255,所以答案就不可测,需要看编译器怎么翻译的,你可以通过强制类转换方式计算。
回复

使用道具 举报

5#
ID:578842 发表于 2021-11-4 09:04 | 只看该作者
查你的显示函数

无标题.jpg (205.8 KB, 下载次数: 27)

无标题.jpg

无标题1.jpg (189.26 KB, 下载次数: 20)

无标题1.jpg
回复

使用道具 举报

6#
ID:908826 发表于 2021-11-4 09:11 | 只看该作者
你四位数提取每一位的计算对吗???我咋觉得不太对哎。
回复

使用道具 举报

7#
ID:977536 发表于 2021-11-4 09:39 | 只看该作者
可能用于显示的代码出问题了
回复

使用道具 举报

8#
ID:860248 发表于 2021-11-4 12:22 | 只看该作者
#include<reg52.h>
#include<intrins.h>

sbit HC138_A = P1^0;
sbit HC138_B = P1^1;
sbit HC138_C = P1^2;

unsigned char code smgduan[10]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0Xff};

void delay7ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=26;b>0;b--)
            for(a=133;a>0;a--);
}

void main()
{
        unsigned int x = 32;
        unsigned int y = 54;
        unsigned int z;
        z = x*y;                 //答案 1728

       
        while(1)
        {
        P0 = 0X00;
        HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z/1000]; delay7ms();
        }
}

谢谢各位
这次我更加混乱了
我用另一个乘法公式, 答案应该是 1728
我就显示 千位数, 应该显示 1的, 但为什么显示 2?
是 四舍五入 吗? 如何解决呢?

IMG_20211104_121914.jpg (258.05 KB, 下载次数: 26)

IMG_20211104_121914.jpg
回复

使用道具 举报

9#
ID:277550 发表于 2021-11-4 12:29 | 只看该作者
取各位的代码,应该要改一下
z/1000%10//千位
z/100%10//百位
z/10%10//十位
z%10  //个位,最低位
回复

使用道具 举报

10#
ID:860248 发表于 2021-11-4 13:09 | 只看该作者
谢谢
但修改了还是显示 2

                while(1)
                {
                        P0 = 0X00;
                        HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z/1000%10]; delay7ms();
                }
回复

使用道具 举报

11#
ID:213173 发表于 2021-11-4 13:32 | 只看该作者
kscheang 发表于 2021-11-4 13:09
谢谢
但修改了还是显示 2


已经明确的告诉你问题出在段码和位码,还在瞎折腾。数组前面少了0x3f,后面多了0xff。位码低位高位顺序反了。
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit HC138_A = P1^0;
  4. sbit HC138_B = P1^1;
  5. sbit HC138_C = P1^2;

  6. unsigned char code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  7. void delay7ms(void) //误差 0us
  8. {
  9. unsigned char a,b,c;
  10. for(c=1;c>0;c--)
  11. for(b=26;b>0;b--)
  12. for(a=133;a>0;a--);
  13. }


  14. void main()
  15. {
  16.         unsigned char x = 30;
  17.         unsigned char y = 55;
  18.         unsigned int z;
  19.         z = x*y;
  20.         while(1)
  21.         {
  22.                 HC138_A = 0; HC138_B = 0; HC138_C = 0; P0 = smgduan[z%10]; delay7ms();
  23.                 HC138_A = 1; HC138_B = 0; HC138_C = 0; P0 = smgduan[z/10%10]; delay7ms();
  24.                 HC138_A = 0; HC138_B = 1; HC138_C = 0; P0 = smgduan[z/100%10]; delay7ms();
  25.                 HC138_A = 1; HC138_B = 1; HC138_C = 0; P0 = smgduan[z/1000%10]; delay7ms();
  26.         }
  27. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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