找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于数码管显示电压求模和取余问题

[复制链接]
跳转到指定楼层
楼主
在数码管上如何显示ADC采样放大后的值??比如说电压为0V时数码管显示00.00V,电压2V时数码管显示02.00V,电压10V时数码管显示10.00V。
比如:02.00V 怎么取模取余呢????
                        ucTemp8=?;//千位       
                        ucTemp7=?;//百位
                        此处小数点
                        ucTemp6=?;//十位
                        ucTemp5=?;//个位       

                        ucDigShow8=ucTemp8;//数码管显示实际内容
                        ucDigShow7=ucTemp7;
                        ucDigShow6=ucTemp6;
                        ucDigShow5=ucTemp5;




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

使用道具 举报

沙发
ID:1056573 发表于 2023-1-13 20:59 | 只看该作者
unsigne char ucTemp8,ucTemp7,ucTemp6,ucTemp5
unsigne int UC
UC=ucDigShow*100;//ucDigShow是实际数值
ucTemp8=UC/1000;//千位      
ucTemp7=UC%1000/100;//百位
此处小数点
ucTemp6=UC%100/10;//十位
ucTemp5=UC%10;//个位
回复

使用道具 举报

板凳
ID:213173 发表于 2023-1-13 21:01 | 只看该作者
用整数处理,假设ADC采样运算后的电压12.34V,放大100倍得到1234。在数码管百位加个点不就是12.34。
                unsigned char buf[4];
                b=ch;                               
                for(i=0;i<4;i++)
                {
                        buf[i]=b%10;//由低位到高位保存
                        b/=10;
                }
回复

使用道具 举报

地板
ID:883242 发表于 2023-1-13 21:58 | 只看该作者
你先举个栗子,比如02.00V的机器内码是什么?先知道内码才能转换。
回复

使用道具 举报

5#
ID:232366 发表于 2023-1-14 09:43 | 只看该作者
Hephaestus 发表于 2023-1-13 21:58
你先举个栗子,比如02.00V的机器内码是什么?先知道内码才能转换。

其实就是一个四位数码管电压表的电压显示问题,上程序又太大不完整我简单点些ADC采样和数码管显示缓冲区的代码截出就容易理解多了来您帮我看看。

uint8 ADC_Read_data_Out_Show;//ADC读取数据输出显示变量"共外部显示器显示"
uint32 ulTemp=0;//参与换算的中间变量

unsigned char ucTemp5=0;                          //中间过渡变量
unsigned char ucTemp6=0;                          //中间过渡变量
unsigned char ucTemp7=0;                          //中间过渡变量
unsigned char ucTemp8=0;                          //中间过渡变量

unsigned char ucDigShow8=19;  //第8位数码管要显示的内容
unsigned char ucDigShow7=19;  //第7位数码管要显示的内容
unsigned char ucDigShow6=19;  //第6位数码管要显示的内容
unsigned char ucDigShow5=19;  //第5位数码管要显示的内容

void ADC_ALLot()
{               
                unsigned long ulTemp=0;//参与换算的中间变量
                unsigned long ulFilterV=0;//经过滤波后的实时电压值

                Start_ADC_Read_Data_Drive();//启动ADC模块读取数据驱动 "启动ADC采样"
                ulTemp=0;//把char类型数据赋值给long类型数据之前,必须先清零
                ulTemp=ADC_Read_data_Out_Show;               
                ulTemp=(ulTemp*1.0/255*5.0)*1000; //数据处理:进行电压换算
}

void Nixie_ALLot()//数码管数据分配函数
{
        static xdata uint16 count=0;
        count++;
        if(count>=250)
        {
                count=0;
                //现在的问题就是这里怎么对"ulTemp"此变量进行显示可以看到上面是已经,经过电压转换并且放大1000倍后的数了。
                //那么比如说"ulTemp"此变量经放大后的电压数值是三位数比如2V那么改在数码管显示缓冲区取模取余怎么显示出来???
                //并且数码管是四位的此时保留两位小数(千位数码管显示0百位显示2(此处加小数点)十位0个位0)(所以上面我才会问怎么显示出来02.00V)
                //也就是10V以内千位数码管都是0,10以外千位数码管正常显示,同时都是保留两位小数。
                //该怎么对ulTemp变量进行显示
                ucTemp8=;//千位       
                ucTemp7=;//百位       
                //此处为小数点(固定)       
                ucTemp6=;//十位
                ucTemp5=;//个位       

                ucDigShow8=ucTemp8;//数码管显示实际内容
                ucDigShow7=ucTemp7;
                ucDigShow6=ucTemp6;
                ucDigShow5=ucTemp5;

               Show_Service();//显示服务函数(请忽略)
        }
        display_drive();//显示数码管字模的驱动函数(请忽略)
}

回复

使用道具 举报

6#
ID:136523 发表于 2023-1-14 10:31 | 只看该作者
    temp=ADC();   采样值,比如当前2V  采样输出值200.                  
                        ucTemp8=temp/1000;//千位      
                        ucTemp7=temp/100%10;//百位
                        此处小数点. 可以处理到第二位数码管的DP点, 通常自己建立解码数组处理, 比如ucTemp7+0X80。
                        ucTemp6=temp/10%10;//十位
                        ucTemp5=temp%10;//个位      
回复

使用道具 举报

7#
ID:232366 发表于 2023-1-14 16:14 | 只看该作者
wulin 发表于 2023-1-13 21:01
用整数处理,假设ADC采样运算后的电压12.34V,放大100倍得到1234。在数码管百位加个点不就是12.34。
                uns ...

我上面的提问不够详细这个是比较详细的具体如下。





其实就是一个四位数码管电压表的电压显示问题,上程序又太大不完整我简单点些ADC采样和数码管显示缓冲区的代码截出就容易理解多了来您帮我看看。

uint8 ADC_Read_data_Out_Show;//ADC读取数据输出显示变量"共外部显示器显示"
uint32 ulTemp=0;//参与换算的中间变量

unsigned char ucTemp5=0;                          //中间过渡变量
unsigned char ucTemp6=0;                          //中间过渡变量
unsigned char ucTemp7=0;                          //中间过渡变量
unsigned char ucTemp8=0;                          //中间过渡变量

unsigned char ucDigShow8=19;  //第8位数码管要显示的内容
unsigned char ucDigShow7=19;  //第7位数码管要显示的内容
unsigned char ucDigShow6=19;  //第6位数码管要显示的内容
unsigned char ucDigShow5=19;  //第5位数码管要显示的内容

void ADC_ALLot()
{               
                unsigned long ulTemp=0;//参与换算的中间变量
                unsigned long ulFilterV=0;//经过滤波后的实时电压值

                Start_ADC_Read_Data_Drive();//启动ADC模块读取数据驱动 "启动ADC采样"
                ulTemp=0;//把char类型数据赋值给long类型数据之前,必须先清零
                ulTemp=ADC_Read_data_Out_Show;               
                ulTemp=(ulTemp*1.0/255*5.0)*1000; //数据处理:进行电压换算
}

void Nixie_ALLot()//数码管数据分配函数
{
        static xdata uint16 count=0;
        count++;
        if(count>=250)
        {
                count=0;
                //现在的问题就是这里怎么对"ulTemp"此变量进行显示可以看到上面是已经,经过电压转换并且放大1000倍后的数了。
                //那么比如说"ulTemp"此变量经放大后的电压数值是三位数比如2V那么改在数码管显示缓冲区取模取余怎么显示出来???
                //并且数码管是四位的此时保留两位小数(千位数码管显示0百位显示2(此处加小数点)十位0个位0)(所以上面我才会问怎么显示出来02.00V)
                //也就是10V以内千位数码管都是0,10以外千位数码管正常显示,同时都是保留两位小数。
                //该怎么对ulTemp变量进行显示
                ucTemp8=;//千位      
                ucTemp7=;//百位      
                //此处为小数点(固定)      
                ucTemp6=;//十位
                ucTemp5=;//个位      

                ucDigShow8=ucTemp8;//数码管显示实际内容
                ucDigShow7=ucTemp7;
                ucDigShow6=ucTemp6;
                ucDigShow5=ucTemp5;

               Show_Service();//显示服务函数(请忽略)
        }
        display_drive();//显示数码管字模的驱动函数(请忽略)
}
回复

使用道具 举报

8#
ID:232366 发表于 2023-1-14 22:20 | 只看该作者
德阳迅诺科技 发表于 2023-1-14 10:31
temp=ADC();   采样值,比如当前2V  采样输出值200.                  
                        ucT ...

感谢给予解答 参考着您的建议,和其他回复我的老师的建议,目前问题已经得以解决。感谢!!!!!!!
回复

使用道具 举报

9#
ID:213173 发表于 2023-1-14 22:24 | 只看该作者
SHANWAZI 发表于 2023-1-14 16:14
我上面的提问不够详细这个是比较详细的具体如下。

不需要写的那么繁琐,给你写个省略示例参考,你按实际电路修改端口定义。




  1. #include <STC15F2K60S2.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define VCC_V  5                        //宏定义电源电压5V
  5. uchar code table[]={//共阴数码管段码"0~f-."
  6.                 0x3f,0x06,0x5b,0x4f,
  7.                 0x66,0x6d,0x7d,0x07,
  8.                 0x7f,0x6f,0x77,0x7c,
  9.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  10. uchar data dis_buf[4];                //缓存数组
  11. uint ADC_result;                                //ADC转换结果
  12. uint ADC_V;
  13. uchar i,j;

  14. void main()
  15. {         
  16.         //初始化略
  17.         while(1)
  18.         {
  19. //                ADC_result=GetADCResult(0);//十位ADC程序略
  20.                 ADC_result=410;//模拟十位ADC结果
  21.                 ADC_V=VCC_V*100*(long)ADC_result/1024;//放大100倍,强制转换数据类型
  22.                 for(i=4;i>0;i--)
  23.                 {
  24.                         dis_buf[i-1]=ADC_V%10;//由低位到高位分解保存
  25.                         ADC_V/=10;
  26.                 }
  27.                 P0=0x00;//段消隐
  28.                 P2&=0xf0;//清位码
  29.                 P2|=~(0x01<<j);//送位码
  30.                 if(j==1)
  31.                         P0=table[dis_buf[j]]|0x80;//送段码加小数点
  32.                 else P0=table[dis_buf[j]];//送段码不加点
  33.                 j=++j%4;//循环计数
  34.         }
  35. }
复制代码



回复

使用道具 举报

10#
ID:232366 发表于 2023-1-16 20:46 | 只看该作者
wulin 发表于 2023-1-14 22:24
不需要写的那么繁琐,给你写个省略示例参考,你按实际电路修改端口定义。

感谢感谢 参考您的建议和其他几个老师的例程目前问题以解决并能正常显示了!!!十分感谢。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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