打印

关于51MCB的float的运算程序,大家帮忙看一下,谢谢。

[复制链接]
1524|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hero245|  楼主 | 2009-12-15 15:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hero245 于 2009-12-15 15:55 编辑

#include<STC12C5410AD.H>
#include <INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
float bdre_tmp;
float pv;
uint bdre;
uchar bdreh,bdrel;
uint cy=620;//假如对3V采样为 620  10位AD转换
void main()
{
       pv=3072/cy;             //pv=4.9548...,电源参考电压pv(float),3*1024/cy   
    bdre_tmp=1.5/pv*1024;   //求1.5V时的采样值(float) ,理念计算值为bdre_tmp=1.5/4.9548....*1024=310=0x136=0B00000001 00110110
    bdre=bdre_tmp;          //bdre是uint
    bdreh=(uchar)(bdre>>8); //bdre高位  
    bdrel=(uchar)(bdre);    //bdre低位
    P1=bdreh;      //高位送到P1口  
    P2=bdrel;      //低位送到P2口
}


这个程序主要是标定AD转换的电源参考值,通过对基准的3V采样后,再求出1.5V时,相对与参考电源的采样值:bdre,想从P1口和P2口读出bdre的值,但我从keil仿真看到的是0x0180,不是理论0x136.不知问题出在哪里。是不是程序有问题?还是我对float的运算理解有误。请各位高手指点一下。

相关帖子

沙发
hero245|  楼主 | 2009-12-15 16:54 | 只看该作者
找到问题了,呵呵,是我搞错,一时忘记了数据类型在运算时会向前一级自动转换。
改为下面的就OK了
#include<STC12C5410AD.H>
#include <INTRINS.H>

#define uchar unsigned char
#define uint unsigned int

uint bdre_tmp;
float pv;
float cy_tmp;
uint bdre;
uchar bdreh,bdrel;
uint cy=620;//假如对3V基准的采样值  

void main()
{
      cy_tmp=(float)cy;
           pv=3072.0/cy_tmp;        //求参考的电源电压
           bdre_tmp=1.5/pv*1024.0;   //求1.5V时的采样值(float)
           bdre=bdre_tmp;          //bdre是uint
           bdreh=(uchar)(bdre>>8); //bdre高位  
           bdrel=(uchar)(bdre);           //bdre低位
          
           P1=bdreh;
          P2=bdrel;
       

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

9

帖子

1

粉丝