找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请指点一下,单片机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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

9#
ID:517951 发表于 2024-2-20 08:29 | 只看该作者
获取的AD转换值, 最好要做下滤波算法, 比如去掉最大值, 最小值, 得到平均值, 这样得到的数值才是比较精准的.
回复

使用道具 举报

8#
ID:195496 发表于 2024-2-8 23:35 | 只看该作者
简单标定一下就行,测量一个已知电压,读出AD值,标定一下,就行了。下面可以按比例计算出待测电压的数值。
回复

使用道具 举报

7#
ID:727062 发表于 2024-2-8 19:53 | 只看该作者
Hephaestus 发表于 2024-2-7 21:48
也可以定义一个unsigned int变量,把结果加195次,那么这个变量从0~50000分别对应0~5000.0mV,更加直观计算 ...

厉害
回复

使用道具 举报

6#
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)前面就好了
回复

使用道具 举报

5#
ID:883242 发表于 2024-2-7 21:48 | 只看该作者
也可以定义一个unsigned int变量,把结果加195次,那么这个变量从0~50000分别对应0~5000.0mV,更加直观计算量还小。
回复

使用道具 举报

地板
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;
}*/
回复

使用道具 举报

板凳
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;就可以看到实际电压了
回复

使用道具 举报

沙发
ID:1010435 发表于 2024-2-7 09:00 | 只看该作者
1、首先要知道adc的基准电压
2、知道adc的分辨率
3,测到adc数值后,参考二楼
回复

使用道具 举报

楼主
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

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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