在单片机中的浮点数编程

问题背景:

   在使用8BIT单片机进行开发,不支持浮点数运算。但是开发必须用到sin,cos,arctan等浮点数函数。

 

苦想了两天,才发现,自己要当一回“计算机”。

 

单片机不支持浮点数,可是编程却一定要用到小数。这时,只好自定义“定点小数”了。

所需的浮点数范围有两个区域-1~1,-60~60。精度就按小数点后2、3位了。

 

如果在高级语言中,我想定义的数组是

 

 

double arctantable[95]=

{

0.0174551, 0.0349208,      0.0524078,      0.0699268,      0.0874887,      0.105104,       0.122785,       0.140541,       0.158384,       0.176327,

 

0.19438,        0.212557,       0.230868,       0.249328,       0.267949,       0.286745,       0.305731,       0.32492,        0.344328,       0.36397,

 

0.383864,       0.404026,       0.424475,       0.445229,       0.466308,       0.487733,       0.509525,       0.531709,       0.554309,       0.57735,

 

0.600861,       0.624869,       0.649408,       0.674509,       0.700208,       0.726543,       0.753554,       0.781286,       0.809784,       0.8391,

 

0.869287,       0.900404,       0.932515,       0.965689,       1,       1.03553,        1.07237,        1.11061,        1.15037,        1.19175,

 

1.2349, 1.27994,        1.32704,        1.37638,        1.42815,        1.48256,        1.53986,        1.60033,        1.66428,        1.73205,

 

1.80405,        1.88073,        1.96261,        2.0503, 2.14451,        2.24604,        2.35585,        2.47509,        2.60509,        2.74748,

 

2.90421,        3.07768,        3.27085,        3.48741,        3.73205,        4.01078,        4.33148,        4.70463,        5.14455,        5.67128,

 

6.31375,        7.11537,        8.14434,        9.51436,        11.43,   14.3007,        19.0811,        28.6362,        57.2899,  

-57.2897, -0.0174551, 0.0174551, 57.2897, -57.2897, -0.0174551  

};

 

 

在单片机中,我可不能这样定义。会报错的。

观察数据后,我们发现整数部分要6bit,符号位要1bit,小数部分(0.99)110 0011(7bit),故一个浮点数,用2byte来表示,高8bit是符号位和整数部分,低8bit是小数部分。

0.0174551(0.02)在单片机中,可以表示为0x0002;

0.0349208,可表示为0x0003;

-57.2897,可表示为0xb91d;等等……

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是51单片机编程简单计算器的程序示例,可以实现加、减、乘、除四种基本运算。 ``` #include <reg52.h> // 导入单片机头文件 sbit LED = P2^0; // 定义LED灯所在的引脚 sbit KEY_ADD = P1^0; // 定义加法键所在的引脚 sbit KEY_SUB = P1^1; // 定义减法键所在的引脚 sbit KEY_MUL = P1^2; // 定义乘法键所在的引脚 sbit KEY_DIV = P1^3; // 定义除法键所在的引脚 int num1 = 0; // 第一个操作数 int num2 = 0; // 第二个操作数 int result = 0; // 计算结果 void delay(int ms) // 延时函数 { int i, j; for (i = 0; i < ms; i++) { for (j = 0; j < 110; j++); } } void main() { while (1) { // 无限循环 if (KEY_ADD == 0) { // 按下加法键 num1 = 10; // 设置第一个操作数为10 num2 = 20; // 设置第二个操作数为20 result = num1 + num2; // 计算结果 LED = 0; // 点亮LED灯 delay(500); // 延时500毫秒 LED = 1; // 熄灭LED灯 } if (KEY_SUB == 0) { // 按下减法键 num1 = 30; // 设置第一个操作数为30 num2 = 15; // 设置第二个操作数为15 result = num1 - num2; // 计算结果 LED = 0; // 点亮LED灯 delay(500); // 延时500毫秒 LED = 1; // 熄灭LED灯 } if (KEY_MUL == 0) { // 按下乘法键 num1 = 5; // 设置第一个操作数为5 num2 = 8; // 设置第二个操作数为8 result = num1 * num2; // 计算结果 LED = 0; // 点亮LED灯 delay(500); // 延时500毫秒 LED = 1; // 熄灭LED灯 } if (KEY_DIV == 0) { // 按下除法键 num1 = 50; // 设置第一个操作数为50 num2 = 10; // 设置第二个操作数为10 result = num1 / num2; // 计算结果 LED = 0; // 点亮LED灯 delay(500); // 延时500毫秒 LED = 1; // 熄灭LED灯 } } } ``` 在程序示例,我们定义了四个按键和一个LED灯。按下不同的按键,就会进行不同的运算,并在LED灯上显示结果。程序的操作数和结果都是整数类型,如果需要进行浮点数运算,则需要使用浮点数类型。同时,程序的计算方式是固定的,如果需要实现输入任意操作数进行计算的功能,则需要使用键盘输入等其他方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值