找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2153|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

關(guān)于數(shù)碼管顯示電壓求模和取余問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
在數(shù)碼管上如何顯示ADC采樣放大后的值??比如說電壓為0V時(shí)數(shù)碼管顯示00.00V,電壓2V時(shí)數(shù)碼管顯示02.00V,電壓10V時(shí)數(shù)碼管顯示10.00V。
比如:02.00V 怎么取模取余呢????
                        ucTemp8=?;//千位       
                        ucTemp7=?;//百位
                        此處小數(shù)點(diǎn)
                        ucTemp6=?;//十位
                        ucTemp5=?;//個(gè)位       

                        ucDigShow8=ucTemp8;//數(shù)碼管顯示實(shí)際內(nèi)容
                        ucDigShow7=ucTemp7;
                        ucDigShow6=ucTemp6;
                        ucDigShow5=ucTemp5;




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1056573 發(fā)表于 2023-1-13 20:59 | 只看該作者
unsigne char ucTemp8,ucTemp7,ucTemp6,ucTemp5
unsigne int UC
UC=ucDigShow*100;//ucDigShow是實(shí)際數(shù)值
ucTemp8=UC/1000;//千位      
ucTemp7=UC%1000/100;//百位
此處小數(shù)點(diǎn)
ucTemp6=UC%100/10;//十位
ucTemp5=UC%10;//個(gè)位
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2023-1-13 21:01 | 只看該作者
用整數(shù)處理,假設(shè)ADC采樣運(yùn)算后的電壓12.34V,放大100倍得到1234。在數(shù)碼管百位加個(gè)點(diǎn)不就是12.34。
                unsigned char buf[4];
                b=ch;                               
                for(i=0;i<4;i++)
                {
                        buf[i]=b%10;//由低位到高位保存
                        b/=10;
                }
回復(fù)

使用道具 舉報(bào)

地板
ID:883242 發(fā)表于 2023-1-13 21:58 | 只看該作者
你先舉個(gè)栗子,比如02.00V的機(jī)器內(nèi)碼是什么?先知道內(nèi)碼才能轉(zhuǎn)換。
回復(fù)

使用道具 舉報(bào)

5#
ID:232366 發(fā)表于 2023-1-14 09:43 | 只看該作者
Hephaestus 發(fā)表于 2023-1-13 21:58
你先舉個(gè)栗子,比如02.00V的機(jī)器內(nèi)碼是什么?先知道內(nèi)碼才能轉(zhuǎn)換。

其實(shí)就是一個(gè)四位數(shù)碼管電壓表的電壓顯示問題,上程序又太大不完整我簡單點(diǎn)些ADC采樣和數(shù)碼管顯示緩沖區(qū)的代碼截出就容易理解多了來您幫我看看。

uint8 ADC_Read_data_Out_Show;//ADC讀取數(shù)據(jù)輸出顯示變量"共外部顯示器顯示"
uint32 ulTemp=0;//參與換算的中間變量

unsigned char ucTemp5=0;                          //中間過渡變量
unsigned char ucTemp6=0;                          //中間過渡變量
unsigned char ucTemp7=0;                          //中間過渡變量
unsigned char ucTemp8=0;                          //中間過渡變量

unsigned char ucDigShow8=19;  //第8位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow7=19;  //第7位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow6=19;  //第6位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow5=19;  //第5位數(shù)碼管要顯示的內(nèi)容

void ADC_ALLot()
{               
                unsigned long ulTemp=0;//參與換算的中間變量
                unsigned long ulFilterV=0;//經(jīng)過濾波后的實(shí)時(shí)電壓值

                Start_ADC_Read_Data_Drive();//啟動(dòng)ADC模塊讀取數(shù)據(jù)驅(qū)動(dòng) "啟動(dòng)ADC采樣"
                ulTemp=0;//把char類型數(shù)據(jù)賦值給long類型數(shù)據(jù)之前,必須先清零
                ulTemp=ADC_Read_data_Out_Show;               
                ulTemp=(ulTemp*1.0/255*5.0)*1000; //數(shù)據(jù)處理:進(jìn)行電壓換算
}

void Nixie_ALLot()//數(shù)碼管數(shù)據(jù)分配函數(shù)
{
        static xdata uint16 count=0;
        count++;
        if(count>=250)
        {
                count=0;
                //現(xiàn)在的問題就是這里怎么對"ulTemp"此變量進(jìn)行顯示可以看到上面是已經(jīng),經(jīng)過電壓轉(zhuǎn)換并且放大1000倍后的數(shù)了。
                //那么比如說"ulTemp"此變量經(jīng)放大后的電壓數(shù)值是三位數(shù)比如2V那么改在數(shù)碼管顯示緩沖區(qū)取模取余怎么顯示出來???
                //并且數(shù)碼管是四位的此時(shí)保留兩位小數(shù)(千位數(shù)碼管顯示0百位顯示2(此處加小數(shù)點(diǎn))十位0個(gè)位0)(所以上面我才會(huì)問怎么顯示出來02.00V)
                //也就是10V以內(nèi)千位數(shù)碼管都是0,10以外千位數(shù)碼管正常顯示,同時(shí)都是保留兩位小數(shù)。
                //該怎么對ulTemp變量進(jìn)行顯示
                ucTemp8=;//千位       
                ucTemp7=;//百位       
                //此處為小數(shù)點(diǎn)(固定)       
                ucTemp6=;//十位
                ucTemp5=;//個(gè)位       

                ucDigShow8=ucTemp8;//數(shù)碼管顯示實(shí)際內(nèi)容
                ucDigShow7=ucTemp7;
                ucDigShow6=ucTemp6;
                ucDigShow5=ucTemp5;

               Show_Service();//顯示服務(wù)函數(shù)(請忽略)
        }
        display_drive();//顯示數(shù)碼管字模的驅(qū)動(dòng)函數(shù)(請忽略)
}

回復(fù)

使用道具 舉報(bào)

6#
ID:136523 發(fā)表于 2023-1-14 10:31 | 只看該作者
    temp=ADC();   采樣值,比如當(dāng)前2V  采樣輸出值200.                  
                        ucTemp8=temp/1000;//千位      
                        ucTemp7=temp/100%10;//百位
                        此處小數(shù)點(diǎn). 可以處理到第二位數(shù)碼管的DP點(diǎn), 通常自己建立解碼數(shù)組處理, 比如ucTemp7+0X80。
                        ucTemp6=temp/10%10;//十位
                        ucTemp5=temp%10;//個(gè)位      
回復(fù)

使用道具 舉報(bào)

7#
ID:232366 發(fā)表于 2023-1-14 16:14 | 只看該作者
wulin 發(fā)表于 2023-1-13 21:01
用整數(shù)處理,假設(shè)ADC采樣運(yùn)算后的電壓12.34V,放大100倍得到1234。在數(shù)碼管百位加個(gè)點(diǎn)不就是12.34。
                uns ...

我上面的提問不夠詳細(xì)這個(gè)是比較詳細(xì)的具體如下。





其實(shí)就是一個(gè)四位數(shù)碼管電壓表的電壓顯示問題,上程序又太大不完整我簡單點(diǎn)些ADC采樣和數(shù)碼管顯示緩沖區(qū)的代碼截出就容易理解多了來您幫我看看。

uint8 ADC_Read_data_Out_Show;//ADC讀取數(shù)據(jù)輸出顯示變量"共外部顯示器顯示"
uint32 ulTemp=0;//參與換算的中間變量

unsigned char ucTemp5=0;                          //中間過渡變量
unsigned char ucTemp6=0;                          //中間過渡變量
unsigned char ucTemp7=0;                          //中間過渡變量
unsigned char ucTemp8=0;                          //中間過渡變量

unsigned char ucDigShow8=19;  //第8位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow7=19;  //第7位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow6=19;  //第6位數(shù)碼管要顯示的內(nèi)容
unsigned char ucDigShow5=19;  //第5位數(shù)碼管要顯示的內(nèi)容

void ADC_ALLot()
{               
                unsigned long ulTemp=0;//參與換算的中間變量
                unsigned long ulFilterV=0;//經(jīng)過濾波后的實(shí)時(shí)電壓值

                Start_ADC_Read_Data_Drive();//啟動(dòng)ADC模塊讀取數(shù)據(jù)驅(qū)動(dòng) "啟動(dòng)ADC采樣"
                ulTemp=0;//把char類型數(shù)據(jù)賦值給long類型數(shù)據(jù)之前,必須先清零
                ulTemp=ADC_Read_data_Out_Show;               
                ulTemp=(ulTemp*1.0/255*5.0)*1000; //數(shù)據(jù)處理:進(jìn)行電壓換算
}

void Nixie_ALLot()//數(shù)碼管數(shù)據(jù)分配函數(shù)
{
        static xdata uint16 count=0;
        count++;
        if(count>=250)
        {
                count=0;
                //現(xiàn)在的問題就是這里怎么對"ulTemp"此變量進(jìn)行顯示可以看到上面是已經(jīng),經(jīng)過電壓轉(zhuǎn)換并且放大1000倍后的數(shù)了。
                //那么比如說"ulTemp"此變量經(jīng)放大后的電壓數(shù)值是三位數(shù)比如2V那么改在數(shù)碼管顯示緩沖區(qū)取模取余怎么顯示出來???
                //并且數(shù)碼管是四位的此時(shí)保留兩位小數(shù)(千位數(shù)碼管顯示0百位顯示2(此處加小數(shù)點(diǎn))十位0個(gè)位0)(所以上面我才會(huì)問怎么顯示出來02.00V)
                //也就是10V以內(nèi)千位數(shù)碼管都是0,10以外千位數(shù)碼管正常顯示,同時(shí)都是保留兩位小數(shù)。
                //該怎么對ulTemp變量進(jìn)行顯示
                ucTemp8=;//千位      
                ucTemp7=;//百位      
                //此處為小數(shù)點(diǎn)(固定)      
                ucTemp6=;//十位
                ucTemp5=;//個(gè)位      

                ucDigShow8=ucTemp8;//數(shù)碼管顯示實(shí)際內(nèi)容
                ucDigShow7=ucTemp7;
                ucDigShow6=ucTemp6;
                ucDigShow5=ucTemp5;

               Show_Service();//顯示服務(wù)函數(shù)(請忽略)
        }
        display_drive();//顯示數(shù)碼管字模的驅(qū)動(dòng)函數(shù)(請忽略)
}
回復(fù)

使用道具 舉報(bào)

8#
ID:232366 發(fā)表于 2023-1-14 22:20 | 只看該作者
德陽迅諾科技 發(fā)表于 2023-1-14 10:31
temp=ADC();   采樣值,比如當(dāng)前2V  采樣輸出值200.                  
                        ucT ...

感謝給予解答 參考著您的建議,和其他回復(fù)我的老師的建議,目前問題已經(jīng)得以解決。感謝!。。。。!
回復(fù)

使用道具 舉報(bào)

9#
ID:213173 發(fā)表于 2023-1-14 22:24 | 只看該作者
SHANWAZI 發(fā)表于 2023-1-14 16:14
我上面的提問不夠詳細(xì)這個(gè)是比較詳細(xì)的具體如下。

不需要寫的那么繁瑣,給你寫個(gè)省略示例參考,你按實(shí)際電路修改端口定義。




  1. #include <STC15F2K60S2.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define VCC_V  5                        //宏定義電源電壓5V
  5. uchar code table[]={//共陰數(shù)碼管段碼"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];                //緩存數(shù)組
  11. uint ADC_result;                                //ADC轉(zhuǎn)換結(jié)果
  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結(jié)果
  21.                 ADC_V=VCC_V*100*(long)ADC_result/1024;//放大100倍,強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型
  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;//送段碼加小數(shù)點(diǎn)
  32.                 else P0=table[dis_buf[j]];//送段碼不加點(diǎn)
  33.                 j=++j%4;//循環(huán)計(jì)數(shù)
  34.         }
  35. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

10#
ID:232366 發(fā)表于 2023-1-16 20:46 | 只看該作者
wulin 發(fā)表于 2023-1-14 22:24
不需要寫的那么繁瑣,給你寫個(gè)省略示例參考,你按實(shí)際電路修改端口定義。

感謝感謝 參考您的建議和其他幾個(gè)老師的例程目前問題以解決并能正常顯示了。!十分感謝。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表