久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2248|回復: 11
打印 上一主題 下一主題
收起左側

請指點一下,單片機adc程序中如何把結果轉換實際電壓值 感激不盡本人剛學

[復制鏈接]
跳轉到指定樓層
樓主
ID:727062 發表于 2024-2-6 22:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
   #include<reg51.h>
        #include"US16.H"
         
         

        
        
                        void UartInit(void)                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數據,可變波特率
        AUXR = 0x0F;                //定時器時鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        TMOD &= 0x0F;                //設置定時器模式
        TMOD |= 0x20;                //設置定時器模式
        TL1 = 0xFD;                //設置定時初始值
        TH1 = 0xFD;                //設置定時重載值
        ET1 = 0;                //禁止定時器%d中斷
        TR1 = 1;                //定時器1開始計時
        EA=1;
        ES=1;
        
}                                   

        
          void main ()

   {                        
                           unsigned char i;  
                           UartInit();        //串口初始化
                       InitADC();         //adc初始化

                    


                            while(1)
                         {
                                 i=        GetADCResult(0X01);//通道1轉換結果
                        
                                

                                SBUF=i;                        //發到上位機
                                Delay500ms();
                                 
                                          
               
                          }

   }

   void uaut () interrupt 4


{


                        
           
           while(!TI);
            TI=0;
         
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2024-2-7 07:07 | 只看該作者
八位ADC結果換算成10進制電壓值
毫伏=參考電壓毫伏*(long)八位ADC結果/256
示例:U_mv = Vcc * 1000 * (long)ADC_V / 256;


十位ADC結果換算成10進制電壓值
毫伏=參考電壓毫伏*(long)十位ADC結果/1024

十二位ADC結果換算成10進制電壓值
毫伏=參考電壓毫伏*(long)十二位ADC結果/4096

回復

使用道具 舉報

板凳
ID:1010435 發表于 2024-2-7 09:00 | 只看該作者
1、首先要知道adc的基準電壓
2、知道adc的分辨率
3,測到adc數值后,參考二樓
回復

使用道具 舉報

地板
ID:727062 發表于 2024-2-7 09:58 | 只看該作者
wulin 發表于 2024-2-7 07:07
八位ADC結果換算成10進制電壓值
毫伏=參考電壓毫伏*(long)八位ADC結果/256
示例:U_mv = Vcc * 1000 * (l ...

我做的是8位的,vin和vcc都是5v,數據手冊是  8-bit A/D Conversion Result:(ADC_RES[7:0])= 256 x Vin /Vcc,那我如果串口顯示是不是把 i= i*256;SBUF=i;就可以看到實際電壓了
回復

使用道具 舉報

5#
ID:213173 發表于 2024-2-7 13:35 | 只看該作者
354724834 發表于 2024-2-7 09:58
我做的是8位的,vin和vcc都是5v,數據手冊是  8-bit A/D Conversion Result:(ADC_RES[7:0])= 256 x Vin / ...

void UartInit(void)     //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數據,可變波特率
        AUXR &= 0xBF;                //定時器時鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        TMOD &= 0x0F;                //設置定時器模式
        TMOD |= 0x20;                //設置定時器模式
        TL1 = 0xFD;                        //設置定時初始值
        TH1 = 0xFD;                        //設置定時重載值
        ET1 = 0;                        //禁止定時器中斷
        TR1 = 1;                        //定時器1開始計時
//        EA=1;
//        ES=1;
}      

/*----------------------------
發送串口數據
----------------------------*/
void SendData(unsigned char dat)
{
    while (!TI);                    //等待前一個數據發送完成
    TI = 0;                         //清除發送標志
    SBUF = dat;                     //發送當前數據
}

void main ()
{                        
        unsigned char ADC_R;//AD轉換值  
        unsigned int U_mv; //電壓值
        UartInit();        //串口初始化
        InitADC();         //adc初始化
        while(1)
        {
                ADC_R=GetADCResult(0X01);//通道1轉換結果
                U_mv = (5000*(long)ADC_R/256+5)/10;//強制轉換數據類型,轉換成10進制(4舍5入)電壓值
                //串口助手以文本模式接收
                SendData(U_mv/100%10+'0');//整數位
                SendData('.');            //小數點
                SendData(U_mv/10%10+'0'); //小數第1位
                SendData(U_mv%10+'0');    //小數第2位
                Delay500ms();
        }
}
/*
void uaut () interrupt 4
{
        while(!TI);
        TI=0;
}*/
回復

使用道具 舉報

6#
ID:883242 發表于 2024-2-7 21:48 | 只看該作者
也可以定義一個unsigned int變量,把結果加195次,那么這個變量從0~50000分別對應0~5000.0mV,更加直觀計算量還小。
回復

使用道具 舉報

7#
ID:727062 發表于 2024-2-8 19:38 | 只看該作者
wulin 發表于 2024-2-7 13:35
void UartInit(void)     //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速

非常感謝指點,下載之后無顯示,后來我把 sbuf =dat; 放在while(!TI)前面就好了
回復

使用道具 舉報

8#
ID:727062 發表于 2024-2-8 19:53 | 只看該作者
Hephaestus 發表于 2024-2-7 21:48
也可以定義一個unsigned int變量,把結果加195次,那么這個變量從0~50000分別對應0~5000.0mV,更加直觀計算 ...

厲害
回復

使用道具 舉報

9#
ID:195496 發表于 2024-2-8 23:35 | 只看該作者
簡單標定一下就行,測量一個已知電壓,讀出AD值,標定一下,就行了。下面可以按比例計算出待測電壓的數值。
回復

使用道具 舉報

10#
ID:517951 發表于 2024-2-20 08:29 | 只看該作者
獲取的AD轉換值, 最好要做下濾波算法, 比如去掉最大值, 最小值, 得到平均值, 這樣得到的數值才是比較精準的.
回復

使用道具 舉報

11#
ID:727062 發表于 2024-12-4 22:01 | 只看該作者
Hephaestus 發表于 2024-2-7 21:48
也可以定義一個unsigned int變量,把結果加195次,那么這個變量從0~50000分別對應0~5000.0mV,更加直觀計算 ...

為什么加195
回復

使用道具 舉報

12#
ID:1133081 發表于 2024-12-5 13:43 | 只看該作者

50000/256≈195。有人這么%嗎?為什么要加195次?不會乘法?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 中文字幕第十页 | 午夜免费av | 亚洲国产精品一区二区www | 自拍偷拍亚洲一区 | www.国产.com | 欧美色图另类 | 岛国av免费在线观看 | 国精日本亚洲欧州国产中文久久 | 日韩精品区 | 欧美成人自拍 | 最新国产视频 | 久久久久久中文字幕 | 国产精品一区二区久久久久 | 99精品久久 | 四虎成人精品永久免费av九九 | 国产剧情一区 | 精品在线一区 | 看毛片的网站 | 日韩在线免费观看视频 | 亚洲精品国产a久久久久久 午夜影院网站 | 黄一区二区三区 | 日韩一二区在线 | 国产精品1区 | 99久久中文字幕三级久久日本 | 污片在线观看 | 亚洲综合字幕 | 秋霞电影院午夜伦 | 91久久夜色精品国产网站 | 黑人精品 | 日韩福利在线观看 | 欧美精品一区在线发布 | 国产一区二区三区在线 | 亚州综合一区 | 国产传媒在线观看 | 欧美天堂 | 中文字幕av亚洲精品一部二部 | 美女一区二区在线观看 | 老司机精品福利视频 | 国产成人精品久久 | 中文字幕一区二区三区精彩视频 |