51单片机AD转换结果怎么换成十进制数

2019-03-24 17:10发布

官方手册上面说放在ADC_RES和ADC_RESL里面,得到结果需要怎么处理才能变成十进制数?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
xgliyouquan
1楼-- · 2019-03-25 23:08
看过例子就明白了,以下例子来源于《51单片机轻松入门-基于STC15W4K系列》,完整工程请查看附件。 第9章(ADC).rar (181.68 KB, 下载次数: 28) 2017-7-14 19:28 上传 点击文件名下载附件

#include "UART.H"   // 包含IAP15W4K58S4寄存器定义文件
#define VCC 4.972   // 存放用万用表实测的单片机供电电压

unsigned int ADC_P11()
{
        unsigned int i;                    // 用于软件延时程序
        unsigned char status;        // 用于判断AD转换结束的标志
        unsigned int AD_Dat=0;  // 10位AD转换值
        unsigned char Tmp;            // 临时变量用于将AD转换出来的2个字节合成一个字节               
        ADC_CONTR|=0x80;              // 开AD转换电源,第一次使用时要打开内部模拟电源
    for (i=0;i<10000;i++);  // 适当延时等待AD转换供电稳定,一般延时1ms以内即可,为了缩短AD
                            // 调用时间,可把这2行剪切到主程序中去。
        P1ASF|=0x02;                        // 选择P1.1作为AD转换通道,0x02= 0000 0010       
        ADC_CONTR=0xE1;         // 选择P1.1作为AD转换通道,最高转换速度,清转换完成标志。
        for (i=0;i<1000;i++);   // 如果是多通道模拟量进行AD转换,则更换AD转换通道后要适当延时,
// 使输入电压稳定,延时量取20μs~200μs即可,与输入电压源的内阻有关,如果输入电压信号源的内
// 阻在10K以下,可不加延时,如果是单通道模拟量转换,则不需要更换AD转换通道,也不需要加延时。
        ADC_CONTR|=0x08;        // 启动 A/D 转换,ADC_START=1。
        status=0;
        while(status==0)              // 等待AD转换结束。
        {
            status=ADC_CONTR&0x10;   // 判断ADC_FLAG是否等于1,0x10=0001 0000B。
        }
        ADC_CONTR&=0xE7;             // 将ADC_FLAG清0, 0xE7=1110 0111B,ADC_FLAG=0,ADC_START=0。       
        AD_Dat = ADC_RES;                // 默认高字节高8位。
        AD_Dat <<= 2;
        Tmp = ADC_RESL;         // 默认低字节低2位。
        Tmp &= 0x03;            // 屏蔽无关位
        AD_Dat |= Tmp;                // 高低字节拼接成一个10位数。
        return AD_Dat;
}  
void main(void)
{        
        float Vin;                                   // 存放计算出来的外部输入电压
        unsigned int ADvalue;               // 存放AD转换返回的结果
        UART_init();                                   // 串口初始化9600/22.1184MHz
        printf("串口初始化完毕");
        while(1)
        {                         
                ADvalue=ADC_P11();                   // 采样P1.1口模拟输入电压
                Vin=VCC*ADvalue/1023;      // 注意是1023才正确
                printf("%.3f     ",Vin);                
                delay500ms();
        }                              // 若不用串口显示,此行可设置断点仿真观察结果
}


初级小白
2楼-- · 2019-03-25 23:45
 精彩回答 2  元偷偷看……
发平爱项目
3楼-- · 2019-03-26 03:16
直接当十进制用就好了,要显示的话,就要一一分离,假如为123,则用 百位=x/100;十位=x/10%10;个位=x%10;的方法可以得到。
初级小白
4楼-- · 2019-03-26 07:57
发平爱项目 发表于 2017-7-20 09:10
直接当十进制用就好了,要显示的话,就要一一分离,假如为123,则用 百位=x/100;十位=x/10%10;个位=x%10 ...

好的 大概明白了。
大浩浩
5楼-- · 2019-03-26 09:36
 精彩回答 2  元偷偷看……
mcu5i51
6楼-- · 2019-03-26 12:25
MCU或计算机中的 “数”,常见的只有整形,浮点,位三种,有的时候会用到定点方式,本身是没有进制概念的,如一百就是一百,用内部数据表示的话,只要没有溢出,哪种方法都是一百;
你所说的十进制数,本身应该是一个字符串,就是我们用各种语言写出来的字符,比如“100”,或者一种编码方式,比如常见的十进制BCD码,对应 0x0100;

一周热门 更多>