找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1020|回复: 46
收起左侧

C语言如何分离每一位显示变量?

  [复制链接]
ID:705846 发表于 2023-11-19 16:07 | 显示全部楼层 |阅读模式
请帮忙看看,为什么分离不出正确的结果,现在分离结果的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];

回复

使用道具 举报

ID:883242 发表于 2023-11-19 16:33 | 显示全部楼层
uchar adc_result;
adc_result = 771;

上面这两句反复的看,直到看出问题为止。
回复

使用道具 举报

ID:235200 发表于 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;
回复

使用道具 举报

ID:883242 发表于 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; ...

这三行你写错了,楼主是对的。
回复

使用道具 举报

ID:705846 发表于 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;       
}
回复

使用道具 举报

ID:384109 发表于 2023-11-19 17:13 | 显示全部楼层
搞清除法的结果是什么,搞清取余的结果是什么,搞清要的是哪一位数字,板凳的错了其中一行代码
回复

使用道具 举报

ID:705846 发表于 2023-11-19 17:30 | 显示全部楼层
人中狼 发表于 2023-11-19 17:13
搞清除法的结果是什么,搞清取余的结果是什么,搞清要的是哪一位数字,板凳的错了其中一行代码

怀疑是不是ADC没有传小数位过来
回复

使用道具 举报

ID:705846 发表于 2023-11-19 17:34 | 显示全部楼层
人中狼 发表于 2023-11-19 17:13
搞清除法的结果是什么,搞清取余的结果是什么,搞清要的是哪一位数字,板凳的错了其中一行代码

真的没发现错误,我用excel模拟计算没有错误
回复

使用道具 举报

ID:883242 发表于 2023-11-19 17:42 | 显示全部楼层
samxon 发表于 2023-11-19 17:34
真的没发现错误,我用excel模拟计算没有错误

把我在沙发的发言读100遍。
回复

使用道具 举报

ID:705846 发表于 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];
                        }                       
回复

使用道具 举报

ID:965189 发表于 2023-11-19 17:58 | 显示全部楼层
Hephaestus 发表于 2023-11-19 17:42
把我在沙发的发言读100遍。

被门槛石绊脚了,只要你看出问题了,就是一大进步。
回复

使用道具 举报

ID:965189 发表于 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;
回复

使用道具 举报

ID:373976 发表于 2023-11-19 18:10 | 显示全部楼层
沙发的内容很重要的,
回复

使用道具 举报

ID:712493 发表于 2023-11-19 18:24 | 显示全部楼层
实际看看每个寄存器在远行后的值,然后按自己写程序的思路手工算算运行后的值就可以知道问题出在哪里
回复

使用道具 举报

ID:883242 发表于 2023-11-19 18:49 | 显示全部楼层
你们居然都看不懂我在沙发的发言,我在说清楚一些
根据:uchar adc_result;

可知下面的语句:
adc_result=771;
编译器会翻译成:
adc_result=3;
回复

使用道具 举报

ID:373976 发表于 2023-11-19 18:50 | 显示全部楼层
好好看看沙发的回复,问题就在那里
回复

使用道具 举报

ID:965189 发表于 2023-11-19 19:15 | 显示全部楼层
楼主没看出沙发的问题呢。
回复

使用道具 举报

ID:397054 发表于 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" 行);
回复

使用道具 举报

ID:397054 发表于 2023-11-19 19:39 | 显示全部楼层
Hephaestus 发表于 2023-11-19 16:48
这三行你写错了,楼主是对的。

都是对的。
回复

使用道具 举报

ID:705846 发表于 2023-11-19 20:06 | 显示全部楼层
Hephaestus 发表于 2023-11-19 18:49
你们居然都看不懂我在沙发的发言,我在说清楚一些
根据:uchar adc_result;

如果变成3了,为什么第二位又显示正常呢
回复

使用道具 举报

ID:883242 发表于 2023-11-19 20:18 | 显示全部楼层
samxon 发表于 2023-11-19 20:06
如果变成3了,为什么第二位又显示正常呢

把楼主的发言默写100遍,楼主要显示7.71,实际显示0.03
回复

使用道具 举报

ID:213173 发表于 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];
回复

使用道具 举报

ID:61207 发表于 2023-11-19 20:48 | 显示全部楼层
uchar adc_result;
回复

使用道具 举报

ID:61207 发表于 2023-11-19 20:50 | 显示全部楼层
uchar adc_result;
adc_result = 771;
771-256-256-256=3


回复

使用道具 举报

ID:705846 发表于 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];
回复

使用道具 举报

ID:705846 发表于 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];
还是分离不出第三位
回复

使用道具 举报

ID:883242 发表于 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

这次矛盾出在这两句
回复

使用道具 举报

ID:705846 发表于 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
回复

使用道具 举报

ID:384109 发表于 2023-11-19 21:26 | 显示全部楼层
数据类型要符合目标的数据类型
回复

使用道具 举报

ID:883242 发表于 2023-11-19 21:36 | 显示全部楼层
samxon 发表于 2023-11-19 21:24
float adc_result;
adc_result = 12.5

还是不对,float不能用/(整除)和%两个运算。
回复

使用道具 举报

ID:69038 发表于 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”;虽然结果是一样的。

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


回复

使用道具 举报

ID:69038 发表于 2023-11-19 21:46 | 显示全部楼层
samxon 发表于 2023-11-19 17:30
怀疑是不是ADC没有传小数位过来

uchar GetADCResult()//  uchar这个怎么会有小数点回传?有小数点是float
回复

使用道具 举报

ID:965189 发表于 2023-11-19 22:07 | 显示全部楼层
楼主定义的变量是:uchar adc_result;
回复

使用道具 举报

ID:883242 发表于 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位的编译器,你见识太少。
回复

使用道具 举报

ID:705846 发表于 2023-11-20 08:47 | 显示全部楼层
Hephaestus 发表于 2023-11-19 21:36
还是不对,float不能用/(整除)和%两个运算。

感谢你的指导,把C教程数据类型又看了一遍,现在正常了。
回复

使用道具 举报

ID:69038 发表于 2023-11-20 08:49 | 显示全部楼层
Hephaestus 发表于 2023-11-19 22:15
你以为写成char或者unsigned char就是8位了?naive!我用过char是16位的编译器,你见识太少。

你用的16位的是什么编译器?说出来让我见识一下。
回复

使用道具 举报

ID:1100408 发表于 2023-11-20 08:50 | 显示全部楼层
应改为:adcresult_0= adc_result/100;                                 adcresult_1= adc_result%100/10;
回复

使用道具 举报

ID:272119 发表于 2023-11-20 10:00 | 显示全部楼层
这个我也偶尔会烦这样的错误,因为经常会处理十进制5-6位数,然后全局变量定义时没有考虑到大数值超标问题.
回复

使用道具 举报

ID:1096212 发表于 2023-11-20 10:04 | 显示全部楼层
数据类型错了,后面的一切都是白干。这个很重要
回复

使用道具 举报

ID:883242 发表于 2023-11-20 13:51 | 显示全部楼层
zhuls 发表于 2023-11-20 08:49
你用的16位的是什么编译器?说出来让我见识一下。

你去ti官网找spru514z这份文档看看。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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