打印

制数转换问题

[复制链接]
2177|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GXLAOYANG|  楼主 | 2013-1-3 10:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是个初学者,最近要学DS18B20这个温度检测芯片,现在碰到问题了,要将检测到的温度用数码管显示出来,就要将从DS18B20读出的十六进制度变为十进制数,现在在这卡住了,网上也找了一些转换的贴子看,但是看不明白,不知有哪位大哥愿意教我一下,谢谢!

相关帖子

沙发
wangyy608| | 2013-1-3 10:48 | 只看该作者
/10

使用特权

评论回复
板凳
GXLAOYANG|  楼主 | 2013-1-3 10:55 | 只看该作者
谢谢楼上的朋友,不知可否详细一点,我在网上也能找到一个完整的写法,但是都没有注释的,每一步都看不明白为何要这样做,比如说要调用什么函数之类的,可能我表达的不是很清楚。

使用特权

评论回复
地板
JerryWu75| | 2013-1-3 10:58 | 只看该作者
造一个LED显示表[]={0-9的数字的显示段数据};
vDisplay(unsigned int X){
    if(X>9999){
       X=9999; //限制最大显示为9999
    }
    Y=X/1000;
    显示缓冲区[千位]=LED显示表[Y];
    X=X%1000;
    Y=X/100;
    显示缓冲区[百位]=LED显示表[Y];
    X=X%100;
    Y=X/10;
    显示缓冲区[十位]=LED显示表[Y];
    Y=X%10;
    显示缓冲区[个位]=LED显示表[Y];
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
GXLAOYANG + 1
5
GXLAOYANG|  楼主 | 2013-1-3 10:59 | 只看该作者
也许这样说比较容易理解点吧:我要将ABCDEF(H)转换成10进制,在用C写程序时应如何写?最好是有个完整的解析过程,这要求有点过份了,有兴趣的朋友请指点一下,谢谢!

使用特权

评论回复
6
wangyy608| | 2013-1-3 11:00 | 只看该作者
123=1*100+2*10+3

使用特权

评论回复
7
ayb_ice| | 2013-1-3 11:01 | 只看该作者
本帖最后由 ayb_ice 于 2013-1-3 11:04 编辑

typedef unsigned char U8;
typedef unsigned int U16;

    U8 i;
    U8 out[4];
    U16 k = 1234;
    for(i=0; i<4; i++){
        out【i】 = k % 10;
        k /= 10;
    }

使用特权

评论回复
8
GXLAOYANG|  楼主 | 2013-1-3 11:24 | 只看该作者
JerryWu75 发表于 2013-1-3 10:58
造一个LED显示表[]={0-9的数字的显示段数据};
vDisplay(unsigned int X){
    if(X>9999){

谢谢!楼上朋友写的应是一个十进数如何拿去显示吧,我要的是如何将一个16进制数变成10进制数,有了十进制数了如何去显示我倒是会。

使用特权

评论回复
9
GXLAOYANG|  楼主 | 2013-1-3 11:25 | 只看该作者
ayb_ice 发表于 2013-1-3 11:01
typedef unsigned char U8;
typedef unsigned int U16;

你好,ayb_ice,你能否在你写的每一句后面帮忙加个注释,谢谢!

使用特权

评论回复
10
JerryWu75| | 2013-1-3 11:39 | 只看该作者
本帖最后由 JerryWu75 于 2013-1-3 11:46 编辑

你的问题提得有问题,你是想知道DS18B20送过来的数据怎样解析,而不是怎样显示!
你需要查看DS18B20的数据手册,DS18B20的暂存寄存器有9个字节:温度值的LSB,温度值的MSB,TH,TL,配置寄存器,保留,保留,保留,CRC.你需要取出温度值LSB和MSB,装配成一个16位整数uT=MSB<<8|LSB,然后检查高5位,如果高5位为11111,则表示温度是负,如果为00000表示温度为正,然后将负值通过补码运算后,得到T,然后乘以0.0625得到实际温度

uT=(unsigned int)温度值的MSB<<8|温度值的LSB
if((uT&0xf800)==0xf800){ //负温度;
uT=65536-uT;
uT*=0.0625; //得到实际温度;
显示负的实际温度;//这里用我之前给你的程序就可以显示温度了,不过你自己需要增加-号的显示,以及需要处理小数点的显示;
} else {
  uT*=0.0625;
显示正的实际温度;//这里用我之前给你的程序就可以显示温度了,不过你自己需要增加+号的显示,以及需要处理小数点的显示;
}

关于小数点的显示可以考虑将实际温度值放大100倍或者10倍,取决于你希望显示到小数点后几位!

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GXLAOYANG + 2
11
GXLAOYANG|  楼主 | 2013-1-3 11:50 | 只看该作者
是的,我就是想知道如何将16进数变成10进数

使用特权

评论回复
12
JerryWu75| | 2013-1-3 11:52 | 只看该作者
本帖最后由 JerryWu75 于 2013-1-3 11:56 编辑

我的帖子里最后uT*=0.0625的到的结果就是实际的温度值,你可以作为10进制数进行显示!
你的是不是希望最后的数据转换为十进制的BCD码?
千位=uT/1000;
uT%=1000;
百位=(uT/100);
uT%=100;
十位=(uT/10);
个位=uT%10;
uT=千位<<12+百位<<8+十位<<4+个位;//现在uT中保存的是BCD格式的数据!

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
GXLAOYANG + 2
13
604603487| | 2013-1-3 12:07 | 只看该作者
DS18B20出来的是16位的2进制数吧?

使用特权

评论回复
14
604603487| | 2013-1-3 12:10 | 只看该作者
我以前看过数据手册,现在忘了,你通过IO口出来的能是16进制数?不是2进制的高低电平序列吗?

使用特权

评论回复
15
胡斯哲| | 2013-1-3 13:01 | 只看该作者
转化的值分高位和低位,高位要像左移8位,再将高位和低位合并,得到的是16位的二井制,得到的二进制再乘以0.0625(为什么要成0.0625我也不知道为什么  呵呵呵),就是10进制。如果用数码管显示的话,直接除和取余就可以;如果是1602显示,根据ascii码表   每个显示的数都要加0x30的。.

使用特权

评论回复
16
GXLAOYANG|  楼主 | 2013-1-3 19:46 | 只看该作者
谢谢各位,我再看看DS18B20的资料。

使用特权

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

本版积分规则

3

主题

95

帖子

0

粉丝