设计与开发

单片机数字量 单片机中数的表示及运算

小编 2024-10-22 设计与开发 23 0

单片机中数的表示及运算

单片机中的数是以二进制表示的,分为有符号数和无符号数两种。

有符号数的表示方法

有符号数是指有“ + (正)”、“ − (负)”符号的数。由于单片机采用二进制数,所以只有“1 ”和“0”两种数字,其中用“ 0 ”表示“ + ”,用“ 1 ”表示“ − ” 。单片机中的数据一般只有8位,一般规定最高位为符号位,因为要用1位表示数的符号,所以只有7位用来表示数值,可以表示− 127~+128。

有符号数的表示方法有 3 种:原码、反码和补码。同一有符号数,用 3 种表示方法得到的数是不同的。下面用3种方法来表示两个有符号数+1011101和− 1011101。

(1)原码

用“1”表示“−”,用“0”表示“+”,其他各数保持不变,采用这种方法表示出来的数称为原码。

+1011101用原码表示是01011101,可写成[01011101] 原。

− 1011101用原码表示是11011101,可写成[11011101] 原。

(2)反码

反码是在原码的基础上求得的。对于正的有符号数,其反码与原码相同;对于负的有符号数,其反码除符号位与原码相同外,其他各位数由原码各位数取反得到。

+1011101用反码表示是01011101,可写成[01011101] 反。

− 1011101用反码表示是10100010,可写成[10100010] 反。

(3)补码

补码是在反码的基础上求得的。对于正的有符号数,其补码与反码、原码相同;对于负的有符号数,其补码除符号位与反码一致外,其他数由反码加1得到。

+1011101用补码表示是01011101,可写成[01011101] 补。

− 1011101用补码表示是10100011,可写成[10100011] 补。

有符号数的运算

用原码表示有符号数简单、直观,但在单片机中,如果采用原码进行减法运算,需要很复杂的硬件电路;如果用补码,可以将减法运算变为加法运算,从而省去减法器而简化硬件电路。

例如:用二进制减法运算和补码加法运算分别计算35 − 21。

① 二进制减法运算:35 − 21=00100011 − 00010101=00001110

② 用补码加法运算。

先将算式转换成补码形式,35 − 21=[+35]+[ − 21]= [00100011] 原 +[10010101] 原 =[00100011] 反+ [11101010] 反 =[00100011] 补 +[11101011] 补。

再对补码进行二进制加法运算:

从上面的运算过程可以看出,补码的符号也参与运算,在8位单片机中,由于数据长度只能有8位,上式结果有9位,第9位会自然丢失,补码加法的运算结果与二进制减法的运算结果是一样的,都是00001110=14。

由此可见,用补码的形式进行运算,可以将减法运算转换为加法运算,运算结果仍是正确的,所以单片机普遍采用补码的形式表示有符号数。

无符号数的表示方法

无符号数因为不用符号位, 8 位全部用来表示数据,所以这种方法可以表示的数据范围是 0 ~ 255 。 8位二进制数的不同表示方式的换算关系见表1-6。

表1-6 8位二进制数的不同表示方式的换算关系

表1-6

续表

表1-6

从表1-6中可以看出,对于同一个二进制数,当采用不同的表示方式时,得到的数值是不同的,特别是大于10000000的有符号数。若想确切知道单片机中的二进制数所对应的十进制数是多少,先要了解该二进制数是有符号数还是无符号数,再换算出该二进制数对应的十进制数。

单片机实例分享,数字电子秤制作方案

力传感器可以用来测量物体的质量,最常见的应用就是电子秤。而关于力传感器的信号处理,在开发设计中未必是一帆风顺的,为此笔者为大家提供两种以前在项目开发过程中使用过的非常经典的设计方案,通过对比两种方案的供电特点、采集方式、处理方法,我们能了解两种方案各自的优势,为大家对力传感器的设计与应用提供一定的帮助。

力传感器

力传感器的种类繁多,如电阻应变片压力传感器、半导体应变片压力传感器、压阻式压力传感器、电感式压力传感器、电容式压力传感器、谐振式压力传感器及电容式加速度传感器等。但应用最为广泛的是电阻应变片压力传感器,它具有极低的价格和较高的精度以及较好的线性特性,市场上大部分称重工具,比如电子秤,都采用这种压力传感器。本文介绍的制作方案也采用电阻应变式称重传感器,而且笔者会为大家提供两种围绕电阻应变式称重传感器的信号调理电路。

电阻应变式称重传感器的特性

在进入电路分析前,我们有必要先了解一下电阻应变式传感器的特性。电阻应变片是一种将被测物件上的应变量转换成一种电信号的敏感器件。图25.1为电阻应变片的结构示意图,它由基体材料、金属应变丝或应变箔片、绝缘保护片和引出线等组成。

当基体受力发生形变时,电阻应变片也一起产生形变,使应变片的阻值发生改变,从而使加在电阻上的电压发生变化。这种应变片在受力时产生的阻值变化通常较小,一般这种应变片都组成应变电桥,并通过后续的仪表放大器进行放大。为了提高测量精度,通常把4片应变片组合成全桥测量电路,图25.2所示为电阻应变片全桥测量电路的电路模型。4个臂R1、R2、R3、R4都用电阻应变片代替。

图25.1 电阻应变片的结构示意图

图25.2 应变片全桥测量电路模型

在实际的应用中,通常将4片电阻应变片通过特殊的材料紧密粘合在能产生力学应变的基体上。图25.3所示为笔者使用到的梁式电阻应变片称重传感器,类似于横梁,其中间通常留有一些孔或槽,上下两面各贴有电阻应变片。整个传感器由全桥电阻应变片和基体构成,当梁受力发生机械形变时,电阻应变片也会发生形变,直接导致了电阻值的变化。在整个传感器电路中,电阻值的变化会被直接转换成输出电压值的变化。

光有梁式称重传感器还不能制作成电子秤,还需要为梁式称重传感器打造一套可以称重的托盘结构,图25.4所示是电子秤的本体机械图,包含称重托盘、传感器-桥臂和底座。实物如图25.5所示。

图25.3 梁式电阻应变片称重传感器

图25.4 电阻应变片称重传感器工作对象示意图

图25.5 电子称托盘实物

分立件信号调理电路

图25.6 分立件信号调理电路

桥臂式传感器的信号调理电路,采用仪表放大器进行放大。仪表放大器是一种高增益、直流耦合放大器,它具有差分输入、单端输出、高输入阻抗和高共模抑制比等特点,这些特点适用于桥臂式传感器的信号调整放大。运算放大器只有工作在双电源情况下才能对称地进行零点调节,因此不得不为电路设计双路输出电源。这个分立件组成的信号调理电路原理图如图25.6所示,实物电路见图25.7。传感器工作电压由HT7550-5.0V的LDO芯片供电,其中RP2用于电路零点调节,RP1是放大倍数调节,也就是常说的量程。

图25.7 供电电路实物与信号调整放大电路实物

每一款传感器的出厂性能都不一致,因此想得到准确的质量与输出电压值,必须对电路进行调试,首先是电路输出调零。所谓调零,就是电子秤接入传感器信号电路后,空载的输出电压必须为0V。当然,这并不是简单调节一下RP2电位器就能校准输出电压的。真正有效的校准这个信号调理电路输出为0V的方法如下。

这里使用了称重传感器标称值为5kg,若称重物体为100g,输出电压为0.1V;若称重物体为1kg,输出电压为1V。由此,理论上可以得到一个比较好的线性关系:y = kx + b,其中y表示电压,x表示质量。因此,对电路校准输出0V必须在电子秤空载的情况下先对RP2进行调整,用万用表测量出IC6第6脚输出电压为0V时完成第一步;然后将一个1kg的物体置于电子秤上,测量输出电压值可能会偏离1V,此时调整RP1进行量程核准,使输出电压为1V;最后将1kg物体移走,再用万用表测量输出电压值,若不为0V,重新微调RP2。以上步骤可以多重复几次,或更换不同重量的物体测量,使电路保证输出准确的0V。测试连接如图25.8所示,其中电源部分使用万能板焊接,由双路输出变压器供电,控制器使用C51/AVR/Arduino主板的Arduino部分。

校准结束后,可以取两种不同重量的物体,进行人工测量,求出线性关系中的斜率和截距,方便后面的调整。笔者测量725g和100g两个物体,实际测量输出电压值分别为714mV和107mV,两点坐标值可以求出斜率k值为0.9712,通过公式代入一个坐标值即可得出截距b值为1.04552。有了这个线性关系,可以利用线性函数关系式实时测量传感器的输出电压,进而计算出测试的称重物体的重量。

接下来就可以测量一下实际物体重量,进入电子秤的具体制作环节。Arduino内置了10位精度的ADC转换功能,使用Arduino处理相关信号调理电路,可以加速整个调试开发过程。简易的电子秤实现流程如图25.9所示。

图25.8 信号调理电路系统

使用Arduino板的A0接口采集输出电压值,用Arduino板上的调试窗口直接观察称重物体的重量。Arduino演示代码如下,程序中使用了人工标定后计算出的线性函数关系因子数,并使用多次采样取平均值的滤波方法。

图25.9 电子秤的实现流程图

void setup()

{

//initialize serial communication at 9600 bits per second:

Serial.begin(9600);

}

// 算术平均滤波法

#define FILTER_N 10

float Filter()

{

int i;

float filter_sum = 0;

for(i=0;i

{

int sensorValue = analogRead(A0); // read the input on analog pin 0

//Convert the analog reading (which goes from 0 - 1023) to avoltage (0 - 5V):

float voltage = sensorValue * (5.0 / 1023.0);

filter_sum += voltage; // read the input on analog pin 0:

delay(1);

}

return (float)(filter_sum / FILTER_N);

}

// the loop routine runs over and over again forever:

void loop()

{

float k = 0.9712;//人工标定计算出的斜率

float b = 1.04552;//人工标定计算出的截距

// 获得滤波器输出值

float Wei = ((Filter()*1000) - b) / k;// 线性函数

Serial.print(Wei,3);// print out the value you read:

Serial.print(‘g’);

Serial.print(“ “);

Serial.print(Wei/1000,3);//print out the value you read:

Serial.println(“kg”);

delay(500);

}

集成化数字电路模块

接下来将要介绍的是用数字电路模块采集称重传感器的输出动态电压。此款模块中有一个电子秤专用模拟/数字转换器芯片——HX711,其内部具有24位A/D高精度转换器,可输入两通道差分信号,其中通道A的增益可编程128倍和64倍。工作电压范围在2.6~5.5V,图25.10所示为官方提供的参考电路。

图25.10 HX711 模块参考应用电路

由于将信号调理电路已集成为芯片,所以就没有了外围调节校准等工作,也不存在标定和计算线性关系因子的环节了。接下来,使用STC89C52RC单片机对模块进行通信,并将使用4×4矩阵键盘对称重物体进行计价操作,LCD1602显示模块显示质量、单价和支付金额,同时在程序设计中增加负压力和过压力检测报警动作。

图25.11 微量物称重

图25.12 称量计价

图25.11所示是对1g重的跳线进行称重示意,其结果很稳定,默认显示的单位是千克(kg);图25.12所示是对称重物体进行单价99元输入后的计算,应付金额为3.5元。因为称重传感器会测量到托盘的重量,存在一定的毛重,所以电子称在进入初始化工作时必须对电子称进行一次毛重计算,正常工作后,当前称重的数据需要减去毛重,这样称出来的重量值才是实物的重量。此款电子秤的实现流程基本和Arduino板一样,只是大部工作均由HX711芯片辅助处理了,单片机只需要连续发送脉冲给HX711,直接读取出HX711已经转换好的称重数据即可。

单片机电子称参考代码如下所示。程序中Weight_Maopi变量就是电子称上电后对托盘称重的毛重。其中转换后的数据除以100是用来缩小数据,为后续计算出的数值能以克计,即4位有效值。而计算实物重量时除以4.22,不同的称重传感器特性曲线不一样,每一个传感器都会有一个矫正值,所以这个数值也随之不同,这里取值为4.22。当发现测试出来的重量偏大时,可加大这个数值,反之减小,该数值一般在4.0到5.0之间。计算式最后补加0.05是保证测量结果以四舍五入百分位计算。完整的驱动程序读者可移步qq群下载。

void Get_Weight()

{

HX711_Buffer = HX711_Read();

HX711_Buffer = HX711_Buffer / 100;

Weight_Shiwu = HX711_Buffer;

Weight_Shiwu = Weight_Shiwu - Weight_Maopi;//获取实物的AD采样数值

Weight_Shiwu = (unsigned int)((float)Weight_Shiwu / 4.22 + 0.05);//计算实物的实际重量

if(Weight_Shiwu < -300)//称重小于毛皮值说明负重300g的漂移值

{

Buzzer = 0;//负重量报警

}

else if(Weight_Shiwu > 5000)//压力传感器上总质量大于5kg的最大量程,报警

{

Buzzer = 0;

}

else if(Weight_Shiwu > -200) //正常测量{

Buzzer = 1;//关闭警报

}

}

总结

通过两种称重传感器信号处理电路的分析和实测,可总结出:分立件仪表放大器电路结构复杂,电源供电复杂、调试步骤繁多,虽然线性度比较好,但若电源不稳定,温度上升,工作时间过长,会影响输出电压,发生漂移,在运算上增加了复杂的计算难度。而电子秤专用集成化芯片,具有供电简单、功耗低、线路精简、转换精度高、无调试步骤、无温漂等优点。希望笔者在电子称制作项目中的对比经验能为读者在力传感器的应用处理方面提供一些帮助。

相关问答

待测电压经A/D转换器得到的8位 数字量 进入51 单片机 后怎样转...

[最佳回答]假设ADC的参考电压是Vref,ADC转换结果是X所示实际电压V是:V=Vref×X÷256要得到两位小数?如果使用C语言编写那就没有问题了.但是还有一种方法,假设V...

单片机 数字 频率计的特点?

本应用系统设计的目的是通过在“单片机原理及应用”课堂上学习的知识,以及查阅资料,培养一种自学的能力。并且引导一种创新的思维,把学到的知识应用到日常生...

单片机 怎么储存一个 数字 输出?

单片机可以使用不同的方式来储存一个数字输出。其中一种常见的方式是使用寄存器来存储数字。寄存器是一种高速存储器,可以直接访问和操作。单片机通常具有多个...

为什么很多 单片机 的工作电压是5v?

因为大多数芯片都是5V的TTL电平,要做到电平兼容,电平匹配,避免要电平转换操作,所有很多单片机的工作电压都是5V。TTL指的是TTL电平,0~5V之间,小于0.2V输出...因...

单片机 的显示屏 数字 闪烁什么原因?

单片机的显示屏数字闪烁可能是由以下原因导致的:1.单片机部件损坏:可能是由于某个部件损坏导致的问题,比如说脉冲发生器、电压比较器、电压调节电路等。2...

51 单片机数字 电压表原理?

单片机数字电压表是利用单片机内部的模数转换器(ADC)将输入的模拟电压信号转换为数字信号,然后经过处理显示出电压值。其原理是通过外部电压传感器将待测电压...

如何用51 单片机 储存5个 数字 ?

用51单片机储存5个数字,先看这几个数字是什么类型,如果是整型数字,则定义inta[5]的整型数组,然后将五个数字赋值给数组的每个元素。若需要做乘法运算,可...

51 单片机 计算器屏幕不显示 数字 ?

如果51单片机计算器屏幕不显示数字,可能有几个原因。首先,检查电源供应是否正常,确保屏幕背光和电源电压稳定。其次,检查屏幕连接是否正确,确保连接线没有...

单片机 代码中num代表什么意思?

num用于操作一个周期中执行的次数,这是单词number的简写,常用这个变量表示计数的,或者表示数量的,等等,只要声明一下num是变量,程序中就可以使用了。输入...

单片机 C语言中一个字母,一个 数字 各占几个字节 - 懂得

字母a-z,数字0-9都是占一个字节。置于一个数值就是另一回事了,你可以定义:char一个字节,int两个字节,long四个字节,float四个字节字母占一个字节,...

猜你喜欢