资源描述
中 北 大 学
硬件大型实验说明书
学生姓名:
宋亚珍
学 号:
0906034205
学 院:
电子与计算机科学技术学院
专 业:
计算机科学与技术
题 目:
智能电子称设计
指导教师: 乔道迹 职称: 讲师
2013年01月17日
1需求分析
1.1设计背景
单片机以其功能强,体积小,功耗低,易开发等很多优势被广泛应用。本次数字电子秤的设计就是需要通过选择合适的单片机来进行主控,再结合A/D转换、键盘、液晶显示、复位电路和蜂鸣器报警驱动电路的知识,同时在软件的设计过程中用到键盘扫描、液晶显示驱动、模数转换程序及汉字库的的设计,做到对我们所学数电、模电、单片机等知识的综合应用,最终实现所设计数字电子秤的各项功能,达到“巩固知识,培养技能,学而用之”的实践目的。通过这次课程设计,不但要提高我们在工作中的学习能力、探究能力、应用能力和动手能力,还要历练我们不畏艰难、不懂便学、有漏必补的认真严谨的工作态度,强化我们的社会适应力和社会竞争力,为走向社会提前试水,完善自我。
1.2功能需求
设计智能电子秤的软硬件,实现如下功能。能随时检测在称重盘上物体的重量,并显示出来。根据输入的单价,计算出需要的金额。并显示出来。在此基础上的物体的累加,可以直接计算第二种物体的重量,和累计金额重量和价格要求精确到小数点后三位。如果所有重量从称重盘中取下,系统自动复位到初始状态,等待下一次的称重。
1.3设计原理
根据智能电子秤的性能及技术要求,选择89C52单片机为核心,组成称量系统。系统主要有89C52单片机、A/D转换器ADC0832、4*4键盘系统、LM4229显示系统、传感器、锁存器等组成。
当商品放到秤盘上时,秤盘下的重量电阻应变式传感器产生一电信号,信号的强弱随商品重量的大小而变,该电信号经放大电路放大后,送入A/D转换芯片进行模数转换,转换后的数字量与物重成正比,再进入89C52单片机经过数据处理,89C52单片机产生一组满足显示要求的数据,送至显示电路显示出实际重量。另一方面,商品单价通过键盘扫描电路送入89C52单片机,经过数据处理,送至显示电路显示出商品单价。物重与单价经过运算产生总价,也在显示电路上同时显示出来。
2总体设计
2.1 实现方式
该系统采用应变片式传感器进行测量,得出模拟信号;再进行放大和模数转换,然后送入单片机行处理。由A/D接口模块、主机接口模块、键盘与显示模块组成。(如图2-1所示)
图2.1系统框图
2.2选用硬件
处理器的选用:AT89S52单片机是AT89S系列中的增强型高档机产品,它片内存储器容量是AT89S51的一倍,即片内8KB的Flash程序存储器和256B的RAM。另外,它还增加了一个功能极强的、具有独特应用的16位定时/计数器2等多种功能。
本设计的测量电路采用最常见的桥式测量电路,用到的是电阻应变传感器半桥式测量电路[2]。它的两只应变片和两只电阻贴在弹性梁上,测量电阻随重力变化导致弹性梁应变而产生的变化。电阻的变化使桥式测量电路的输出电压发生变化。即输出电压的变化反映出重力的变化。电桥的输出电压可由下式表示:
上式说明电桥的输出电压V和四个桥臂的应变片感受的应变量的代数和成正比。
图2.2 桥式测量电路
键盘输入是人机交互界面中重要的组成部分,它是系统接受用户指令的直接途径。键盘是由若干个按键开关组成,键的多少根据单片机应用系统的用途而定。键盘由许多键组成,每一个键相当于一个机械开关触点,当键按下时,触点闭合,当键松开时,触点断开。单片机接收到按键的触点信号后作相应的功能处理。因此,相对于单片机系统来说键盘接口信号是输入信号。 我们选择4*4键盘。
显示器采用LM4229lcd液晶显示系统。LM4229液晶可以显示图像、文字、还可以画图。
ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。因此我们选择ADC0832芯片。
2.3功能概述
信号采集部分:利用称重传感器获取外部重量信息;信号放大部分;模数转换部分:利用A/D转换器把输入的模拟信号转换成数字信号以送到单片机进行处理;
单片机控制部分:单片机是中央控制系统,它接受外部送进的各种数据和控制信息,通过运算和处理,然后送到外部以实现显示等需要;
人机接口部分:人机联系部件有键盘、显示器等,这些部件同主机电路的连接是由人机接口电路来完成的。人机接口技术是智能仪表和操作者进行联系并得到实际应用的关键之一。
2.4分工情况
课设成员 :李成 宋亚珍 许力仁 王若旭 刘小强
李成:与同组同学协商完成本设计的实现方法和原理,合理分配所设计的单片机资源,定义数据字典及存储单元的分配,确定单片机外部扩展的器件的访问方法;主要完成硬件电原理及各部分的控制原理设计;以及将全组其他同学的软件进行协调与连接,完成整个设计任务。
宋亚珍:充分掌握所设计系统的硬件原理,理解系统中各功能的实现方法及各部件的访问方法,编制该系统中称重数据的采集并将采集数据转换成重量。
许力仁:充分掌握所设计系统的硬件原理,理解系统中各功能的实现方法,设计不同功能的显示程序。
王若旭:充分掌握所设计系统的硬件原理,理解系统中各功能的实现方法,编程实现用户按键的处理(包括按键的识别,功能的实现),实现系统使用的功能设置及金额的累计等功能。
刘小强:充分掌握所设计系统的硬件原理,理解系统中各功能的实现方法,编程实现与上位机的通信,完成数据的传输等功能。
3详细设计
系统硬件的结构框图如下所示:
称重传感器 L-PSIII
滤波电路
放大器 AD620
A/D转换器 ADC0832
AT89S52
单片机
片外数据存储器
62256
(32K)
键盘控制芯片ZZLG7289
4*4
键盘
带有中文字库的点阵式128x64型的LCD
OOCM4X8C
数据采集
部分
人机交互
界面
单片机
控制模块
。
部分,不包括系统电源部分
图3.1 系统硬件结构框图
3.1 数据采集部分的方案确定
数据采集模块由压力传感器、信号的前级处理和A/D转换部分组成。
3.1.1 传感器
传感器的定义:能感受规定的被测量,并按照一定规律转换成可用输出信号的器件或装置。通常传感器由敏感元件和转换元件组成。其中敏感元件指传感器中能直接感受被测量的部分,转换部分指传感器中能将敏感元件输出量转换为适于传输和测量的电信号部分。现代科技的快速发展使人类社会进入了信息时代,在信息时代人们的社会活动将主要依靠对信息资源的开发和获取、传输和处理,而传感器处于自动检测与控制系统之首,是感知获取与检测信息的窗口;传感器处于研究对象与测控系统的接口位置,一切科学研究和生产过程要获取的信息,都要通过它转换为易传输与处理的电信号。因此,传感器的地位与作用特别重要。
电阻应变式传感器
电阻应变式传感器是一种利用电阻应变效应,将各种力学量转换为电信号的结构型传感器。电阻应变片式电阻应变式传感器的核心元件,其工作原理是基于材料的电阻应变效应,电阻应变片即可单独作为传感器使用,又能作为敏感元件结合弹性元件构成力学量传感器。
导体的电阻随着机械变形而发生变化的现象叫做电阻应变效应。电阻应变片把机械应变信号转换为△R/R后,由于应变量及相应电阻变化一般都很微小,难以直接精确测量,且不便处理。因此,要采用转换电路把应变片的△R/R变化转换成电压或电流变化。其转换电路常用测量电桥。
直流电桥的特点是信号不会受各元件和导线的分布电感及电容的影响,抗干扰能力强,但因机械应变的输出信号小,要求用高增益和高稳定性的放大器放大。
下图为一直流供电的平衡电阻电桥,接直流电源E:
图3.2 传感器结构原理图
当电桥输出端接无穷大负载电阻时,可视输出端为开路,此时直流电桥称为电压桥,即只有电压输出。
当忽略电源的内阻时,由分压原理有:
= (2.2)
当满足条件R1R3=R2R4时,即
(2.3)
=0,即电桥平衡。式(2.3)称平衡条件。
应变片测量电桥在测量前使电桥平衡,从而使测量时电桥输出电压只与应变片感受的应变所引起的电阻变化有关。
若差动工作,即R1=R-△R,R2=R+△R,R3=R-△R,R4=R+△R,按式(2.2),则电桥输出为
(2.4)
应变片式传感器有如下特点:
(1)应用和测量范围广,应变片可制成各种机械量传感器。
(2)分辨力和灵敏度高,精度较高。
(3)结构轻小,对试件影响小, 对复杂环境适应性强,可在高温、高压、强磁场等特殊环境中使用,频率响应好。
(4)商品化,使用方便,便于实现远距离、自动化测量。
通过以上对传感器的比较分析,最终选择了电阻应变式传感器。题目要求称重范围0~9.999Kg,重量误差不大于0.005Kg,考虑到秤台自重、振动和冲击分量,还要避免超重损坏传感器,所以传感器量程必须大于额定称重——9.999Kg 。我们选择的是L-PSIII型传感器,量程20Kg,精度为 0.01%,满量程时误差0.002Kg,完全满足本系统的精度要求。
3.1.2 前级放大器部分
经由传感器或敏感元件转换后输出的信号一般电平较低;经由电桥等电路变换后的信号亦难以直接用来显示、记录、控制或进行A/D转换。为此,测量电路中常设有模拟放大环节。这一环节目前主要依靠由集成运算放大器的基本元件构成具有各种特性的放大器来完成。
放大器的输入信号一般是由传感器输出的。传感器的输出信号不仅电平低,内阻高,还常伴有较高的共模电压。因此,一般对放大器有如下一些要求:
1、输入阻抗应远大于信号源内阻。否则,放大器的负载效应会使所测电压造成偏差。
2、抗共模电压干扰能力强。
3、在预定的频带宽度内有稳定准确的增益、良好的线性,输入漂移和噪声应足够小以保证要求的信噪比。从而保证放大器输出性能稳定。
4、能附加一些适应特定要求的电路。如放大器增益的外接电阻调整、方便准确的量程切换、极性自动变换等。
采用专用仪表放大器,如:AD620,INA126等。
此类芯片内部采用差动输入,共模抑制比高,差模输入阻抗大,增益高,精度也非常好,且外部接口简单。
以AD620为例,内部结构如下图所示:
图2.8 AD620的内部等效图
接口如下图所示:
图2.9 AD620的接口图
电路的工作原理:A1、A2工作在负反馈状态,其反向输入端的电压与同相输入端的电压相等。即Rg两端的电压分别为Vin+、Vin-。因此
(2.5)
设图(2.8)中电阻R1=R2=R,则A1、A2两输出端的电压差U12为
(2.6)
将式(2.6)代入式(2.5)得
放大器的增益Av为
(2.7)
可见,仅需调整一个电阻Rg,就能方便的调整放大器的增益。由于整个电路对称,调整时不会造成共模抑制比的降低。
在接口图(2.9)中,通过改变可变电阻R3的阻值大小来改变放大器的增益,放大器增益计算公式如下:
(2.8)
AD620 具有体积小、功耗低、精度高、噪声低和输入偏置电流低的特点。其最大输入偏置电流为20nA,这一参数反映了它的高输入阻抗。AD620在外接电阻Rg时,可实现1~1000范围内的任意增益;工作电源范围为±2.3~±18V;最大电源电流为1.3mA;最大输入失调电压为125V;频带宽度为120kHz(在G=100时)。
基于以上分析,我们决定采用制作方便而且精度很好的专用仪表放大器AD620。
4硬件大型实验的总结
经过十几天的努力,终于按照设计进度要求如期完成了实用智能电子秤的硬件设计任务。在做设计的过程中,虽然碰到了不少的困难,但是在同学的帮忙以及自己的努力下,终于取得了一定成果。
主要工作及结论:
1、熟悉AT89S52芯片的功能及工作特性,掌握其接口扩展方法。
2、通过对数据采集的分析,了解了各种传感器、放大器及A/D转换器,对信号的转换、传输有了更深的认识。
3、对各种实用芯片价格了解不够,选择上任有欠缺,如所选的称重传感器价格较贵,达好几百元。
4、动手能力不强,电子秤的实物没能最终实现。
总之,在这次课程实际中,我学会了怎样把自己所学的书本知识应用到实处。看到自己设计的功能电路能在仿真软件中运行,我有了很大的成就感。另外,通过具体的操作,我掌握了各个功能模块的接口设计方法,无论是在设计思想还是在动手能力上都有了很大的提高,为以后的学习和工作打下了坚实的基础。
附件:
//.....................................................................................
// 电子秤程序
// 功能:1.
// 2.
// 2013年1月15日 下午
// author : lc lxq wrx xlr syz
// school : nuc (the north university of china , the city of taiyuan shanxi province )
#include<reg52.h> //系统头文件
#include<lm4229.h> //包含lm4229 的 常用函数定义
#include<intrins.h> //头文件 包含 _nop()函数的 声明
#define uchar unsigned char
#define uint unsigned int // 类型重定义
float price,press,total_price,press1; //声明的系统变量
uint a;
uint ad_data; //存放 abc8032()函数的返回结果
uchar k,n,m,e,num,s;
uint j;
uchar ds[7]; // 临时存储单元 存放 float to char 转化字符结果
uchar ds1[4];//
uchar ds2[4];
int z=0;
int t=0;
sbit ADCS =P3^5; //片选信号
sbit ADDI =P3^7;
sbit ADDO =P3^7;
sbit ADCLK =P3^6;//定义A/D转换芯片引脚 时钟频率
void keyscan();
void delay(uint ms) //延时子程序
{
uchar i;
while(ms--)
for(i=0;i<120;i++);
}
void flotocha(float t) //浮点型转换为字符型 要有三位精确度 所以存储7位 包括小数点
{
uint tt =t;
tt=(t*1000+0.5);
ds[0]=tt/10000+'0';
ds[1]=tt%10000/1000+'0';
ds[2]=46;
ds[3]=tt%10000%1000/100+'0';
ds[4]=tt%100/10+'0';
ds[5]=tt%10+'0';
ds[6]='\0';
}
//将ASCII字符串转换为浮点数
long calc_asciidec (char *buffer)
{
long data value=0;
long data digit;
//int q=t-1;
value=0;
while(*buffer!=' ')
{
digit=*buffer-'0';
value=value*10+digit;
buffer++;
}
return value;
}
uchar adc0832(unsigned char channel) //AD转换,返回结果 ad转换芯片用的是 adc0832
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
void main() //主程序
{
EA=1; // 总开关
EX1=1;
IT1=0;
a=0; // 开外部中断1
price =0;
lcd_init(); //初始化 lm4229
write_lcd(0,3, " 实用电子称的设计 ");
write_lcd(16,0,"单价: 元/千克 ");
write_lcd(36,0,"重量: 千克 ");
write_lcd(68,0,"总价: 元 ");
while(1) //死循环 不可缺少
{
//price =3;
keyscan();
}
}
void jisuan ()//调用adc0832 ()程序 得到 A/D转换结果
{
ad_data=adc0832(0) ;
press=(0.019531*ad_data*5/4.98);
//上下两句为了让0和5v时 显示值都能满足要求
if(press<=0.02)press=0;
total_price=price*press;
// flotocha(price);
// write_lcd(16,5,ds);
if(a!=1)
{
flotocha(press);
write_lcd(36,5,ds);
}
flotocha(total_price);
write_lcd(68,5,ds);
}
void keyscan() //键盘处理函数
{
uchar temp;
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:num=1;n=7;k=1,s++; ds1[t++]='7'; break;
case 0xde:num=2;n=8;k=1,s++; ds1[t++]='8'; break;
case 0xbe:num=3;n=9;k=1,s++; ds1[t++]='9';break;
case 0x7e:num=4;k='/',s++; break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:num=5;n=4;k=1;s++; ds1[t++]='4'; break;
case 0xdd:num=6;n=5;k=1;s++; ds1[t++]='5'; break;
case 0xbd:num=7;n=6;k=1;s++; ds1[t++]='6'; break;
case 0x7d:num=8;k='*';s++; break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:num=9;n=1;k=1;s++; ds1[t++]='1'; break;
case 0xdb:num=10;n=2;k=1;s++; ds1[t++]='2'; break;
case 0xbb:num=11;n=3;k=1;s++; ds1[t++]='3'; break;
case 0x7b:num=12;k='-';s++; break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(5);
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:num=13;k=' '; t=0; write_lcd(16,5," "); break;
case 0xd7:num=14;n=0;k=1;s++; ds1[t++]='0'; break;
case 0xb7:
{
num=15;k='=';s++;
ds1[t]=' ';
/* for(t=t-1;t>=0;t--)
ds2[z++]=ds1[t];
ds2[z]=' '; */
price=calc_asciidec(ds1);
write_lcd(16,5,ds1);
t=0;
}
break;
case 0x77:num=16;k='+';s++; a=1; break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
void int1() interrupt 2 //外部中断1的 服务子程序
{
if(a==0)
{
jisuan();
press1=press;
}
else if (a==1)
{
jisuan();
write_lcd(52,0,"重量: 千克 ");
flotocha(press-press1);
write_lcd(52,5,ds);
a =0;
press=0;
press1=0;
}
}
展开阅读全文