PIC单片机制数之间的转换和程序设计步骤

发布者:江上HZ最新更新时间:2011-09-08 关键字:PIC单片机 手机看文章 扫描二维码
随时随地手机看文章
在我们设计的仪表中采用PIC系列单片机,碰到了浮点数的运算问题,查阅其有关资料发现,其浮点数的格式及其与十进制数之间的转换,与我们常用的MCS-51单片机所提供的三字节、四字节浮点数完全不同,本文将说明其浮点数的格式及其与十进制数之间的转换和程序设计步骤。

1 浮点数的格式

Microchip公司单片机所采用的浮点数格式是IEEE-754标准的变异型。32位浮点数格式为: 


  
其中:×表示一位二进制数0或1;eb为指数的偏差;S为浮点数的符号位,S=0为正数,S=1为负数;小数点“·”在符号位S的右边;BY0BY1BY2为尾数的小数部分。  

应特别注意:

⑴浮点数隐含其整数部分为1。

⑵十进制数0的浮点数表示为00H,00H,00H,00H。

2 浮点数与十进制数之间的相互转换

2.1 十进制数转换成浮点数

设:十进数为A,则2Z=A,Z=lnA/ln2,指数P=int(z);尾数部分X:X=A/2P,其整数部分隐含为1(零除外),将其小数部分按原码格式化为二进制数,即为尾数的小数部分BY0BY1BY2。而指数偏差eb=P+7FH(其中的7FH为指数的偏移量)。符号位S,视十进制数的正负而确定。

例如十进制数50.265化为32位规格化浮点数:A=50.265,则Z=ln50.265/ln2,P=int(Z),故P=5;X=A/2P=50.265/25=1.57078125,将0.57078125化为23位二进制小数,即是BY0BY1BY2,在最高位添上十进制数的符号位S(因十进制数为正数,故S=0);而eb=P+7FH,所以,十进制数50.265的32位规格化浮点数即为84H,49H,0FH,5CH。

2.2 浮点数转换为十进制数

设浮点数为ebS.BY0BY1BY2。由于浮点数隐含尾数的整数为1,故尾数X的实际值为:

BY0BY1BY2;指数P=eb-7FH;故:十进制数

A=(-1)S×2P×X

例:32位规格化浮点数84H,49H,0FH,5CH转换为十进制数。

符号位S=0;指数P=84H-7FH,故P=5;尾数的小数部分为49H,0FH,5CH左移一位,而尾数的整数部分隐含为1,故尾数X的实际值为:1.57078123;十进制数A=(-1)0×25×1.57078123,即A=50.265。

3 浮点数与十进制数相互转换的程序设计

3.1 浮点数转换为十进制数的程序设计

(1)检测浮点数是否为零;若为零,则十进制数整数部分和小数部分均为零。

(2)保存浮点数的符号位,将浮点数隐含的1置于浮点数的符号位,指数偏差eb加1,小数点移到原浮点数的符号位之前。

(3)判断指数偏差大于7FH否?若小于等于7FH,则该进制数整数部分为零,浮点数尾数部分右移n次(注:n=7FH-指数偏差eb),即求得二进制小数部分。若大于7FH,则将小数点右移n’次(注:n’=指数偏差eb-7FH),即求得二进制整数部分和小数部分。

(4)将二进制整数部分转换为十进制整数;将二进制小数部分转换为十进制小数。至此,完成了浮点数到十进制数的转换。

3.2 十进制数转换为浮点数的程序设计

(1)检测十进制数是否为零,若为零,则浮点数置成00H,00H,00H,00H。

(2)保存十进制数的符号位,将十进制数的整数部分转换为二进制整数,将十进制数的小数部分转换为二进制小数(设二进制整数为三个字节,二进制小数为两个字节)。

(3)将浮点数的指数偏差eb置为7FH+23,检测二进制整数的最高位是否为1,不是,则将二进制整数和二进制小数联合左移,左移一次,指数偏差减1,直至二进制整数的最高位为1;隐含尾数整数的1,将二进制整数的最高位改为数的符号位。至此,指数偏差eb单元及原二进制整数的三个单元中的内容,即构成四字节浮点数。

最后应该指出,本文所述32位浮点数,精度相当于7位十进制数;32位浮点数运算程序在Microchip公司提供的有关资料中均有,但是,在调试其浮点子程序时,发现0减0的结果为00H,80H,00H,00H,而不是00H,00H,00H,00H,编程时应注意。

4 结语

本文中的十进制数与浮点数之间相互转换的程序设计,在智能化仪表的键盘置数及数据显示中,具有实用价值。这里提出了一种设计思路,没有复杂的算法,程序设计亦较简单,工作量较少,可利用Microchip公司提供的现成子程序实现十进制整数与二进制整数的相互转换,十进制小数与二进制小数的相互转换。
关键字:PIC单片机 引用地址:PIC单片机制数之间的转换和程序设计步骤

上一篇:采用单片机PICl2F508控制的CJ系列交流接触器的节电器
下一篇:基于PlCl6LF874单片机的电容测试电路设计

推荐阅读最新更新时间:2024-03-16 12:41

PIC单片机程序结构框架
TI TLE“This is……”;程序标题 ;程序说明 LIST P=16F84,F=1NHX8M include p16F84.inc -config_RC_Qsc &_WDT_0FF… ;资源定义和变量定义 STATUS EQU 03 FSR EQU 04 PORTA EQU 05 PORTB EQU 06 J EQU 01F K EQU 01E ;………………… ORG 0000 ; goto MAIN ;跳过中断矢量 ORG 0004 goto INTSRV;子程序入口地址 ;…………………………………… MAIN       ;从0005H开始放主程序 call Initports ;端口初始化 call Init
[单片机]
基于PIC单片机的一种车载红外夜视仪设计
0 引言   随着汽车市场的快速发展和安防意识的日益强化,人们对汽车安全保障技术的要求越来越高,而现有汽车照明系统在雪夜、雪天或大雾等能见度较低情况下视距不远、效果不佳的弊病成为汽车行驶的安全隐患之一。更严重的是在夜晚行车时,驾驶员通常会被对方车辆的灯光干扰出现盲区,容易发生车祸。夜视系统却可以在黑暗中帮助驾驶员导航,使驾驶员在有灯光和黑暗两种情况下都能看清驾驶环境。因此开发一种结构简单、性能稳定、可靠性好、适用性强的汽车红外夜视系统,具有重要的市场应用前景。 1 系统总体设计   1)系统原理   根据工作原理的不同,红外夜视系统分为被动红外夜视系统和主动红外夜视系统。主动红外夜视系统利用其所携带的红外光源主动照射目标,由光
[单片机]
基于<font color='red'>PIC单片机</font>的一种车载红外夜视仪设计
学习pic单片机经验
刚接触pic单片机 使用的是MPLAB IDE 对于配置字的要求可以通过软件进行设置 也可以用__CONFIG();进行设置 但是发现官网上用的是MOLAB X IDE 对于配置字的格式要求 变成了#pragma 当然也可以通过软件的窗口 pic存储器视图 配置字 对配置字进行设置 XC8对于中断的格式也有了变化 __interrupt(优先级) #pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/O
[单片机]
pic单片机编译错误汇总
一、Error : Can't find 0x12C words for psect rbss_1 in segment BANK1   连接器告诉你总共有0x12C(300)个字节准备放到bank1 中但bank1 容量不够。显然,只有把一部分原本定位在bank1 中的变量改放到其它bank 中才能解决此问题。 二、 Error :Fixup overflow in expression_r(...)    Error ; . fixup overflow in expression_r(location 0x1FEE (0x1FE6+8), size 2, value 0xFF5) 既然定义的指针有明确的
[单片机]
基于UCC3895与PIC单片机的智能充电器
   0 引言   现代通讯设备、电子产品、电动车辆、 UPS 等普遍采用蓄电池作为电源,然而多数充电设备功能单一,通用性差,维护质量低,导致产品的使用效率大大降低。本文采用 UCC3895 和 PIC 单片机,针对常用的铅酸蓄电池,设计开发了一种智能充电器。    UCC3895 是 TI 公司生产的专用于 PWM 移相全桥 DC / DC 变换的新型控制芯片,可工作于电压模式,也可工作于电流模式,并且可实现输出脉冲占空比从 0 到 100 %相移控制,软启动和软停止可按要求进行调节;内置 7MHz 带宽的误差比较放大器;具有完善的限流及过流保护、电源欠压保护,基准欠压保护、软启动和软停止等功能。    PI
[电源管理]
刚学PIC单片机,分享第一个电子时钟,定时器计时
#define _XTAL_FREQ 4000000 //晶振定义 #include pic.h //头文件包含 //__CONFIG(0x3b31);//芯片配置字定义 // CONFIG1 #pragma config FOSC = XT // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled
[单片机]
刚学<font color='red'>PIC单片机</font>,分享第一个电子时钟,定时器计时
PIC单片机实现x ms/1s钟精确延时
1、编写子程序DelayMS,实现延时x毫秒的功能,x由w寄存器中的值设定。 ;**************DelayMS************** DelayMS ; 延时x毫秒,x由变量w寄存器设定 movwf L1 ; Loop1 movlw .39 ; movwf L2 ; Loop2 movlw .31 ; movwf L3 ; Loop3 nop
[单片机]
浅谈分析51,AVR,PIC单片机的区别
我觉得51比较好。因为51是比较标准的复杂指令单片机,通过学习51可以比较全面掌握单片机和通用CPU知识,达到触类旁通的目的(Z80也不错,可惜有些过时了,开发工具也很落后)。而PIC是一种精简指令系统,虽然机器码好懂,但是局限性较大,就是说会过分偏重理解MicroChip的设计思想。其实全面掌握单片机技术较用精某一种芯片来得划算(不要被某一个公司捆住思想)。 类似PIC的芯片很多,比如AVR、MSP430、Z8等,掌握51的结构和指令系统之后理解这些单片机的原理就很容易。而反过来也许就要各个击破。 还有一些理由: 就芯片而言:51单片机有非常低廉的价格和数不胜数的衍生芯片系列,这些产品从低速(1MPS)到高速(30MPS)几乎涵
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved