OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4235|回复: 3

stc12c5a60s单片机ad转换的结果要怎么转换成10进制的浮点型?

[复制链接]

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2016-2-9
在线时间
62 小时
发表于 2016-3-20 17:01:35 | 显示全部楼层 |阅读模式
8金钱
)M7$_BK3Y6W_FBMFOFXH~_M.png
就是这个,不是很懂,他这个是不是ADC_RES存的是整数部分,然后ADC_RESL存的是小数部分?

最佳答案

查看完整内容[请看2#楼]

我知道,之前我理解错了,以为ADC_RES*4 和ADC_RES还是10位二进制,但其实可以直接 int a; a=ADC_RES*4 和ADC_RES; 这样a就是ADC_RES*4 和ADC_RES的十进制了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2016-2-9
在线时间
62 小时
 楼主| 发表于 2016-3-20 17:01:36 | 显示全部楼层
HER107 发表于 2016-3-21 20:53
他是10位ADC……ADC_RES里面是高八位,ADC_RESL 里面是低2位,ADC_RES*4 和ADC_RES

我知道,之前我理解错了,以为ADC_RES*4 和ADC_RES还是10位二进制,但其实可以直接
int a;
a=ADC_RES*4 和ADC_RES;
这样a就是ADC_RES*4 和ADC_RES的十进制了。
回复

使用道具 举报

30

主题

188

帖子

0

精华

高级会员

Rank: 4

积分
594
金钱
594
注册时间
2014-4-3
在线时间
74 小时
发表于 2016-3-21 20:30:01 | 显示全部楼层


以下内容来源于《51单片机轻松入门-基于STC15W4K系列》第9章
功能:将AD转换结果发计算机显示。

#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();
        }                              // 若不用串口显示,此行可设置断点仿真观察结果
}
回复

使用道具 举报

36

主题

249

帖子

0

精华

高级会员

Rank: 4

积分
680
金钱
680
注册时间
2015-12-13
在线时间
243 小时
发表于 2016-3-21 20:53:11 | 显示全部楼层
他是10位ADC……ADC_RES里面是高八位,ADC_RESL 里面是低2位,ADC_RES*4 和ADC_RES<<=2是一样的道理,意思是左移2位!  不过我感觉这样写好像有点不妥!!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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