我正在尝试使用开发板上的电位分压器创建一个数字电压表。它使用8051芯片。要将它转换为伏特,我们必须将数字乘以5000/196。我有以下代码编译,但当我发送到董事会时我得到
“摘要:
收到517行
收到4694字节
291字节写入
错误:
4403字节无法写入“
我不知道它为什么不发送,但我确信我在我的代码中的某个地方是愚蠢的。
#include<8051.h> //header file, containing information on 8051
#include<stdio.h> //standard input/output file
#include<math.h>
#define DAC 0x0600 //DAC address
float conv=5000/196;
unsigned char xdata * idata DPTR; //pointer declaration, made as external to main
unsigned int volt_in;
void delay();
void main()
{
unsigned char a; //variable to store signal value
DPTR=DAC; //pointer as a variable takes address of // DAC
while(1)
{
a=0;
*DPTR=a; //assign a to address in DPTR
while(P3_5!=0){
a++;
*DPTR=a;
}
a=(int) a*conv;
volt_in=a;
printf ("The voltage is %d Mv. \r" , volt_in);
a=~a;
P1=a;
//delay();
}
}
void putchar(char c)
{
while(!TI);
TI=0;
SBUF=c;
}
void delay()
{
unsigned int k;
for (k=0xFFFF;k>0;k--);
}
我完全迷失了,所以任何帮助都会很棒。非常感谢提前
答案 0 :(得分:1)
听起来像你的8051具有非常有限的程序存储器(闪存),并且浮点仿真库使图像变得臃肿,因此它非常适合。 AFAIK,8051s没有浮点指令,因此必须模拟所有操作。
我建议尝试使用缩放整数而不是浮点数。换句话说,使用代表1/100毫伏的长整数并重新格式化printf中的输出。
顺便说一句,我假设“Mv”应该代表毫伏。正确的缩写是“mv”。 “Mv”意味着Megavolt。答案 1 :(得分:0)
我不确定这段代码是如何工作的。
你的预编译常量是5000/196,这是25.为什么你需要你的变量“conv”浮动?你将char“a”与float“conv”相乘,它将被上升为浮动,只是在代码的同一行中再次转换为char“a”。不是最有效的事情。而char“a”无法存储乘法运算的结果。它不应该工作,无论你的意图是什么,除非你有一些聪明的,优化的算法超出我的理解。但在这种情况下,记录它是一个好主意,因为程序员的意图在这里并不明显,并且在一段时间后也不会显而易见。
无论如何,你甚至不需要分数点表示,你只在这里处理整数,并将结果显示为整数。为什么你首先需要漂浮?或者我错过了什么?
是的,8051浮点有点重,缺乏硬件支持,它可能不是可重入的,所以你应该采取一些措施不要从中断使用它(不保存FP堆栈),标准8051是有限的到4 KB ROM(如果你想让它适合它,请使用8052)。除非绝对必要,否则最好避免使用8051或任何小型微浮点,否则您需要浪费大量空间和指令周期。