标题: C语言如何分离每一位显示变量? [打印本页]

作者: samxon    时间: 2023-11-19 16:07
标题: C语言如何分离每一位显示变量?
请帮忙看看,为什么分离不出正确的结果,现在分离结果的0.03, 我需要的是771

uchar adc_result;
uint adcresult_0,adcresult_1,adcresult_2;


                     adc_result = 771;
                        adcresult_0= (adc_result/100)%100;
                        adcresult_1= (adc_result/10)%10;
                        adcresult_2= adc_result%10;

                        DisplayData[0]=DIG_CODE[adcresult_0]|0x80;
                        DisplayData[1]=DIG_CODE[adcresult_1];
                        DisplayData[2]=DIG_CODE[adcresult_2];


作者: Hephaestus    时间: 2023-11-19 16:33
uchar adc_result;
adc_result = 771;

上面这两句反复的看,直到看出问题为止。
作者: csmyldl    时间: 2023-11-19 16:40
adcresult_0= (adc_result/100)%100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10;
这三行应该为:
adcresult_0= adc_result/100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10;
作者: Hephaestus    时间: 2023-11-19 16:48
csmyldl 发表于 2023-11-19 16:40
adcresult_0= (adc_result/100)%100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10; ...

这三行你写错了,楼主是对的。
作者: samxon    时间: 2023-11-19 17:10
csmyldl 发表于 2023-11-19 16:40
adcresult_0= (adc_result/100)%100;
adcresult_1= (adc_result/10)%10;
adcresult_2= adc_result%10; ...

还是不显示小数点后的数。

uchar adc_result;
uint adcresult_0,adcresult_1,adcresult_2;
uchar GetADCResult();

        adc_result = GetADCResult();       

                        //0-1-2母线电压显示
                        //3-4-5功率显示
                        if(adc_result<10)
                        {
                        adcresult_0= adc_result/100;
                        adcresult_1= adc_result/10%10;
                        adcresult_2= adc_result%10;
                        DisplayData[0]=DIG_CODE[adcresult_0]|0x80;
                        DisplayData[1]=DIG_CODE[adcresult_1];
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }
                        else if(adc_result>10)
                        {
                        adcresult_0= adc_result/10;
                        adcresult_1= adc_result%10;
                        adcresult_2= (adc_result*10)%10;
                        DisplayData[0]=DIG_CODE[adcresult_0];
                        DisplayData[1]=DIG_CODE[adcresult_1]|0x80;
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }                       

uchar GetADCResult()
{

        ADC_CONTR = 0x89;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR & 0x10)); //等待ADC转换完成
        ADC_CONTR &= ~0x10; //CLOSE ADC
        return (ADC_RES*256+ADC_RESL)*(5.05)/1024/0.08;       
}
作者: 人中狼    时间: 2023-11-19 17:13
搞清除法的结果是什么,搞清取余的结果是什么,搞清要的是哪一位数字,板凳的错了其中一行代码
作者: samxon    时间: 2023-11-19 17:30
人中狼 发表于 2023-11-19 17:13
搞清除法的结果是什么,搞清取余的结果是什么,搞清要的是哪一位数字,板凳的错了其中一行代码

怀疑是不是ADC没有传小数位过来
作者: samxon    时间: 2023-11-19 17:34
人中狼 发表于 2023-11-19 17:13
搞清除法的结果是什么,搞清取余的结果是什么,搞清要的是哪一位数字,板凳的错了其中一行代码

真的没发现错误,我用excel模拟计算没有错误
作者: Hephaestus    时间: 2023-11-19 17:42
samxon 发表于 2023-11-19 17:34
真的没发现错误,我用excel模拟计算没有错误

把我在沙发的发言读100遍。
作者: samxon    时间: 2023-11-19 17:57
Hephaestus 发表于 2023-11-19 17:42
把我在沙发的发言读100遍。

老师,已看101遍,还是发现不了问题。第三位始终显示0
adc_result = 12.76543;

                        //0-1-2母线电压显示
                        //3-4-5功率显示
                        if(adc_result<10)
                        {
                        adcresult_0= adc_result/100;
                        adcresult_1= adc_result/10%10;
                        adcresult_2= adc_result%10;
                        DisplayData[0]=DIG_CODE[adcresult_0]|0x80;
                        DisplayData[1]=DIG_CODE[adcresult_1];
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }
                        else if(adc_result>10)
                        {
                        adcresult_0= adc_result/10;
                        adcresult_1= adc_result%10;
                        adcresult_2= adc_result*10%10;
                        DisplayData[0]=DIG_CODE[adcresult_0];
                        DisplayData[1]=DIG_CODE[adcresult_1]|0x80;
                        DisplayData[2]=DIG_CODE[adcresult_2];
                        }                       

作者: 君工创    时间: 2023-11-19 17:58
Hephaestus 发表于 2023-11-19 17:42
把我在沙发的发言读100遍。

被门槛石绊脚了,只要你看出问题了,就是一大进步。
作者: 君工创    时间: 2023-11-19 18:09
君工创 发表于 2023-11-19 17:58
被门槛石绊脚了,只要你看出问题了,就是一大进步。

                        adcresult_0= adc_result/100;
                        adcresult_1= adc_result/10%10;
                        adcresult_2= adc_result%10;
中间行错了,应改为,adcresult_0= adc_result/100;
                                adcresult_1= adc_result%100/10;
                                adcresult_2= adc_result%10;
作者: 指北针    时间: 2023-11-19 18:10
沙发的内容很重要的,
作者: fj51hei    时间: 2023-11-19 18:24
实际看看每个寄存器在远行后的值,然后按自己写程序的思路手工算算运行后的值就可以知道问题出在哪里
作者: Hephaestus    时间: 2023-11-19 18:49
你们居然都看不懂我在沙发的发言,我在说清楚一些
根据:uchar adc_result;

可知下面的语句:
adc_result=771;
编译器会翻译成:
adc_result=3;
作者: 指北针    时间: 2023-11-19 18:50
好好看看沙发的回复,问题就在那里
作者: 君工创    时间: 2023-11-19 19:15
楼主没看出沙发的问题呢。
作者: 鹈鹕    时间: 2023-11-19 19:30
samxon 发表于 2023-11-19 17:57
老师,已看101遍,还是发现不了问题。第三位始终显示0
adc_result = 12.76543;

都跟你说了,就是哪两句话的问题,要是看100遍不行的话,那就看200遍....

不过我可以提示你一下,adc_result = 257;行不行?如果行的话,那就只好请你忠实地按照C规则执行下行语句:

while ("adc_result = 257" 行);
作者: 鹈鹕    时间: 2023-11-19 19:39
Hephaestus 发表于 2023-11-19 16:48
这三行你写错了,楼主是对的。

都是对的。
作者: samxon    时间: 2023-11-19 20:06
Hephaestus 发表于 2023-11-19 18:49
你们居然都看不懂我在沙发的发言,我在说清楚一些
根据:uchar adc_result;

如果变成3了,为什么第二位又显示正常呢
作者: Hephaestus    时间: 2023-11-19 20:18
samxon 发表于 2023-11-19 20:06
如果变成3了,为什么第二位又显示正常呢

把楼主的发言默写100遍,楼主要显示7.71,实际显示0.03
作者: wulin    时间: 2023-11-19 20:44
本帖最后由 wulin 于 2023-11-19 21:04 编辑

        uint adc_result = 771;
//        uint adcresult_0,adcresult_1,adcresult_2;
        
        
//        adc_result = 771;
//        adcresult_0= (adc_result/100)%100;
//        adcresult_1= (adc_result/10)%10;
//        adcresult_2= adc_result%10;
        
        DisplayData[0]=DIG_CODE[adc_result/100%10]|0x80;
        DisplayData[1]=DIG_CODE[adc_result/10%10];
        DisplayData[2]=DIG_CODE[adc_result%10];
作者: 蛋进凉绝    时间: 2023-11-19 20:48
uchar adc_result;
作者: 蛋进凉绝    时间: 2023-11-19 20:50
uchar adc_result;
adc_result = 771;
771-256-256-256=3



作者: samxon    时间: 2023-11-19 21:06
#define uint unsigned int
#define uchar unsigned char
uint adc_result;
adc_result=12.5
一样分离不出小数点后的数
                      adcresult_0= adc_result/10;
                        adcresult_1= adc_result%10;
                        adcresult_2= adc_result*10%10;
                        DisplayData[0]=DIG_CODE[adcresult_0];
                        DisplayData[1]=DIG_CODE[adcresult_1]|0x80;
                        DisplayData[2]=DIG_CODE[adcresult_2];

作者: samxon    时间: 2023-11-19 21:09
#define uint unsigned int;
uint adc_result=12.3
adcresult_2= adc_result*10%10;
DisplayData[2]=DIG_CODE[adcresult_2];
还是分离不出第三位
作者: Hephaestus    时间: 2023-11-19 21:14
samxon 发表于 2023-11-19 21:06
#define uint unsigned int
#define uchar unsigned char
uint adc_result;

uint adc_result;
adc_result=12.5

这次矛盾出在这两句
作者: samxon    时间: 2023-11-19 21:24
Hephaestus 发表于 2023-11-19 21:14
uint adc_result;
adc_result=12.5

float adc_result;
adc_result = 12.5

作者: 人中狼    时间: 2023-11-19 21:26
数据类型要符合目标的数据类型
作者: Hephaestus    时间: 2023-11-19 21:36
samxon 发表于 2023-11-19 21:24
float adc_result;
adc_result = 12.5

还是不对,float不能用/(整除)和%两个运算。
作者: zhuls    时间: 2023-11-19 21:40
如果:
    uchar adc_result;  //那么后面的“adc_result = 771;"这个就不对了,除非你的uchar 不是 “unsigned char”

  这个:
     adcresult_0= (adc_result/100)%100;//=>最好能写成adc_result/100)%10;虽然结果是一样的。
   而且  adcresult_0也不用定义成uint,除非你的uint是“unsigned char”;虽然结果是一样的。

还是按常规化的书写格式比较好,非常规的格式指不定会有什么异常发生。



作者: zhuls    时间: 2023-11-19 21:46
samxon 发表于 2023-11-19 17:30
怀疑是不是ADC没有传小数位过来

uchar GetADCResult()//  uchar这个怎么会有小数点回传?有小数点是float
作者: 君工创    时间: 2023-11-19 22:07
楼主定义的变量是:uchar adc_result;
作者: Hephaestus    时间: 2023-11-19 22:15
zhuls 发表于 2023-11-19 21:40
如果:
    uchar adc_result;  //那么后面的“adc_result = 771;"这个就不对了,除非你的uchar 不是 “u ...

你以为写成char或者unsigned char就是8位了?naive!我用过char是16位的编译器,你见识太少。
作者: samxon    时间: 2023-11-20 08:47
Hephaestus 发表于 2023-11-19 21:36
还是不对,float不能用/(整除)和%两个运算。

感谢你的指导,把C教程数据类型又看了一遍,现在正常了。
作者: zhuls    时间: 2023-11-20 08:49
Hephaestus 发表于 2023-11-19 22:15
你以为写成char或者unsigned char就是8位了?naive!我用过char是16位的编译器,你见识太少。

你用的16位的是什么编译器?说出来让我见识一下。
作者: 1657531323    时间: 2023-11-20 08:50
应改为:adcresult_0= adc_result/100;                                 adcresult_1= adc_result%100/10;
作者: qq603599910    时间: 2023-11-20 10:00
这个我也偶尔会烦这样的错误,因为经常会处理十进制5-6位数,然后全局变量定义时没有考虑到大数值超标问题.
作者: jiban530    时间: 2023-11-20 10:04
数据类型错了,后面的一切都是白干。这个很重要
作者: Hephaestus    时间: 2023-11-20 13:51
zhuls 发表于 2023-11-20 08:49
你用的16位的是什么编译器?说出来让我见识一下。

你去ti官网找spru514z这份文档看看。
作者: csmyldl    时间: 2023-11-20 14:16
uchar adc_result;
adc_result = 771;
adc_result的取值范围只能是0-255,adc_result = 771;后,默认adc_result的值是255
作者: Hephaestus    时间: 2023-11-20 14:31
csmyldl 发表于 2023-11-20 14:16
uchar adc_result;
adc_result = 771;
adc_result的取值范围只能是0-255,adc_result = 771;后,默认adc ...

又错了,数据大于类型所能容纳的时候,是截断高位的。你把771换成二进制就能知道为什么你以为是255,事实却是3
作者: zhuls    时间: 2023-11-20 17:05
Hephaestus 发表于 2023-11-20 13:51
你去ti官网找spru514z这份文档看看。

学习了~

然而,文档中所说的中wide character(w_char) ,并不是character(char),不是同一回事。如同undigned char 和char 一样有区别的。
而且,据我所知,C51是不支持w_char的,虽然我无法确定楼主用的是不是C51。

欢迎探讨~~
作者: Hephaestus    时间: 2023-11-20 18:45
zhuls 发表于 2023-11-20 17:05
学习了~

然而,文档中所说的中wide character(w_char) ,并不是character(char),不是同一回 ...



这是基本数据类型,跟wchar有个蛋关系???

wchar是字符串才要有的,用于区分ASCII与UTF-8 Unicode编码,你对上位机编程一无所知才会混淆这两个基本概念。

作者: zhuls    时间: 2023-11-20 19:40
Hephaestus 发表于 2023-11-20 18:45
这是基本数据类型,跟wchar有个蛋关系???

wchar是字符串才要有的,用于区分ASCII与UTF-8 Unico ...

是,你说的对,但这只是不同平台的表现~~
作者: mtt661    时间: 2023-11-21 12:13
Hephaestus 发表于 2023-11-19 16:33
uchar adc_result;
adc_result = 771;

确实要反复看,771-若干个256后,就是3  uchar改uint
作者: Hephaestus    时间: 2023-11-21 13:59
mtt661 发表于 2023-11-21 12:13
确实要反复看,771-若干个256后,就是3  uchar改uint

不用反复,只要把771转成二进制或十六进制,就能看出问题来。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1