电子称设计.docx
《电子称设计.docx》由会员分享,可在线阅读,更多相关《电子称设计.docx(24页珍藏版)》请在冰豆网上搜索。
电子称设计
总体方案:
系统总体方案如下图所示:
1:
传感器
传感器结构原理图
称重传感器主要由弹性体、电阻应变片电缆线等组成,内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式给出:
2:
放大电路
INA126构成的放大器及滤波电路:
放大器增益 ,通过改变RG的大小来改变放大器的增益,微弱信号Vi1和Vi2被分别放大后从INA126的V2脚输出。
INA126具有体积小、功耗低、精度高、噪声低和输入偏置电流低的特点。
其最大输入偏置电流为20nA,这一参数反映了它的高输入阻抗。
INA126在外接电阻Rg时,可实现1~1000范围内的任意增益,滤波电路主要针对工频及其低次谐波引入的干扰。
因为压力信号变化十分缓慢,所以滤波电路可以把频率做得很低。
3:
AD转换电路
双积分型A/D转换器:
如:
ICL7135、ICL7109等。
双积分型A/D转换器精度高,但速度较慢(如:
ICL7135),具有精确的差分输入,输入阻抗高(大于),可自动调零,超量程信号,全部输出于TTL电平兼容。
双积分型A/D转换器具有很强的抗干扰能力。
对正负对称的工频干扰信号积分为零,所以对50HZ的工频干扰抑制能力较强,对高于工频干扰(例如噪声电压)已有良好的滤波作用。
只要干扰电压的平均值为零,对输出就不产生影响。
尤其对本系统,缓慢变化的压力信号,很容易受到工频信号的影响。
故而采用双积分型A/D转换器可大大降低对滤波电路的要求。
作为电子秤,系统对AD的转换速度要求并不高,精度上14位的AD足以满足要求。
另外双积分型A/D转换器较强的抗干扰能力,和精确的差分输入,低廉的价格。
综合的分析其优点和缺点,我们最终选择了ICL7135。
基于ICL7135的A/D转换器实现电路:
基准源选用芯片MC14032.5V分压得到:
由于ICL7135内部没有振荡器,所以需要外接。
但A/D转换器精度与时钟频率的漂移无关。
正向积分时间T1和反向积分时间T2按相同比例增加并不影响测量的结果。
ICL7135的时钟频率典型值为200kHz最高允许为1200kHz,时钟频率越高,转换速度越快。
每输出一位BCD码的时间为200个时钟周期,选通脉冲位于数据脉冲的中部,如果时钟频率太高,则数据的接受程序还没有接受完毕,数据就已经消失了。
考虑到此系统频率要求不是太高,且单片机的工作频率也不是很高,因此我们取时钟频率的典型值:
200kHz。
由于频率比较低,对时钟漂移要求不高,我们采用阻容方式实现了基本的振荡电路。
如下:
振荡频率约为160kHz。
此外ICL7135外部还需要外接积分电阻、积分电容,但A/D转换器精度与外接的积分电阻、积分电容的精度无关,故可以降低对元件质量的要求。
不过积分电容和积分电容的介质损耗会影响到A/D转换器的精度,所以应采用介质损耗较小的聚丙乙烯电容.
ICL7135还需要外接基准电源,这是因为芯片内部的基准源一般容易受到温度的影响,而基准电源的变化会直接影响转换精度。
所以当精度要求较高时,应采用外接基准源。
一般接其典型值1V。
4:
键盘接口图:
键盘控制芯片ZLG7289控制键盘的扫描,当监测到有键按下后ZLG7289的9脚便产生一个低电平通知单片机,单片机可以采用查询或者中断方式将数据通过P1.5以串行方式读入。
因为查询方式会浪费大量的时间,所以本系统采用的是中断方式。
5:
LCD显示接口电路
LCD复位信号通过反相器接到单片机的RESET上,上电或手动复位时将随单片机同时复位。
由于复位后并行口输出高电平,LCD处于选中状态,此时LCD将输出内部状态字,将会影响数据总线上的数据传输。
所以外接一个反相器。
第四部分:
软件部分
6:
基于AT89S52的主控电路图
主控电路以89C52为核心扩展32KRAM;单片机使用6M晶振,P0口外接上拉电阻,增大了带负载能力;A12~A15接74LS138译码器,输出作外部片选信号。
扩展了几个接口用于其它部分于单片机的通信
(一)、流程图
主程序流程如图所示:
软件说明:
电子秤的信号采集、处理、显示的程序.
#include
#include//ad控制线
#definead_244XBYTE[0xbfff];
sbitad_stb=P3^3;
sbitad_start=P1^1;
//lcd控制线
sbitlcd_di=P1^7;
sbitlcd_rw=P1^2;
sbitlcd_e=P1^0;
//7289控制线
sbitcs7289=P1^3;
sbitclk7289=P1^4;
sbitdio7289=P1^5;
//sbitkey7289=P1^6;//7289查询方式
sbitkey7289=P3^2;//7289中断方式
sbitbaoj=P3^5;
//7289子程序
voidini_7289(void);
voidsend7289(short);
shortreceive(void);
voidkeyin(void);
//lcd子程序
voidini_lcd(void);
voidlcdd_send(short);
voidlcdi_send(short);
voidchk_busy(void);
//ad子程序
voidad(void);
voidbaojing(void);
voidd_change(long);
//初始化,编号,日期
voidini();
voiderror1(void);
voidnop1()
{}
voidchange(s)
intdealy;//全局变量
shortsh=0;//商品号
shortdot=0;//小数点标志
bitlist=0;
shortqb=0;
charxdatashuju[7]="";
shortxdatabcd[5];
charxdatas1[16]="单价:
元";
charxdatas2[16]="重量:
Kg";
charxdatas3[16]="金额:
元";
charxdatas4[16]="累计:
元";
charcodemessage0[]="信息学院山东大学";
charcodemessage1[]="输入收银员代号:
";
charcodemessage2[]="输入日期:
";
charcodemessage3[16]="--山东大学--";
charcodemessage5[16]="xx公司欢迎您!
!
";
charxdatabianhao[16]="收银员:
";
charxdatariqi[16]="--";
longintxdatazongjia=0,jine=0,jine1=0;
intxdatashizhong=0,pizhong=0,zhongliang=0;
longintxdataqingdan[20][4];
charcodeshangpin[11][4]={{"单价"},{"苹果"},{"梨
"},{"花生"},{"大米"},
{"桃子"},{"塑料"},{"瓜子"},{"桔子"},{"香蕉"},{"玉米
"}};
longintxdatadanjia[11]=
{0,2000,3635,5502,6660,3320,5502,660,3210,6600,5600};
charxdatajiage[6]={0x0,0x0,0x0,0xfe,0x0,0x0};//
0.00
shortxdataxiuzheng[]={0,2,5,6,7,8,9,12,13};
chars[16];
{s[6]=shuju[0];
s[7]=shuju[1];
s[8]=shuju[2];
s[9]=shuju[3];
s[10]=shuju[4];
s[11]=shuju[5];
s[12]=shuju[6];
}
//****************************************************************
voidmain()
{shorti,j;
longintx,z;
inty;
intxdataduilie[3]={0};
P1=0xff;
ini_lcd();//初始化LCD
lcdi_send(0x8a);
while(message0[i])lcdd_send(message0[i++]);
ini_7289();//初始化7289
pizhong=ad1();
lcdi_send(0x1);//总清屏
ini();//初始页面,收银员编号,日期
lcdi_send(0x1);//总清屏
EA=1;EX0=1;//中断
//EX1=1;
//ad_start=1;
while
(1)
{if(list){lcdi_send(0x80);//显示单位名称
for(i=0;i<16;i++)lcdd_send(message3[i]);
x=qingdan[0][0];//商品名单价
for(i=0;i<4;i++)s1[i]=shangpin[x][i];
x=qingdan[0][1];
d_change(x);change(s1);
lcdi_send(0x90);
for(i=0;i<16;i++)lcdd_send(s1[i]);
x=qingdan[0][2];//显示重量
d_change(x);change(s2);
s2[10]=s2[9];s2[9]='.';
if(s2[8]==32)s2[8]=0x30;
lcdi_send(0x88);
for(i=0;i<16;i++)lcdd_send(s2[i]);
x=qingdan[0][3];
d_change(x);change(s3);
lcdi_send(0x98);
for(i=0;i<16;i++)lcdd_send(s3[i]);//以上为第一页
EA=0;EX0=0;//关键盘中断
for(j=1;j{while(key7289);
x=qingdan[j][2];
d_change(x);change(s2);//显示数据
s2[10]=s2[9];
s2[9]='.';if(s2[8]==32)s2[8]=0x30;
lcdi_send(0x90);
for(i=0;i<16;i++)lcdd_send(s2[i]);
x=qingdan[j][1];
d_change(x);change(s1);
x=qingdan[j][0];
for(i=0;i<4;i++)s1[i]=shangpin[x][i];
lcdi_send(0x80);
for(i=0;i<16;i++)lcdd_send(s1[i]);
x=qingdan[j][3];
d_change(x);change(s3);
lcdi_send(0x88);
for(i=0;i<16;i++)lcdd_send(s3[i]);
lcdi_send(0x98);
for(i=0;i<16;i++)lcdd_send(0x20);
lcdi_send(0x98);
while(key7289==0);
}
while(key7289);
d_change(zongjia);change(s4);
lcdi_send(0x80);
for(i=0;i<16;i++)lcdd_send(s4[i]);
lcdi_send(0x90);
for(i=0;i<16;i++)lcdd_send(bianhao[i]);
lcdi_send(0x88);
for(i=0;i<16;i++)lcdd_send(message5[i]);
lcdi_send(0x98);
for(i=0;i<16;i++)lcdd_send(riqi[i]);
list=0;
while(key7289==0);
while(key7289==1);
while(key7289==0);
EA=1;EX0=1;
}
else{y=0;
/*duilie[2]=duilie[1];//数字滤波
duilie[1]=duilie[0];
y=ad1();
duilie[0]=y>>1;
x=duilie[0];
x=x<<1;
x=x+duilie[1]+duilie[2];*/
zhongliang=ad1();
shizhong=zhongliang-pizhong;//数据转换
x=danjia[sh];
jine1=shizhong*x;
jine=jine1/1000;
d_change(shizhong);change(s2);//显示数据
s2[10]=s2[9];s2[9]='.';
if(s2[8]==32)s2[8]=0x30;
lcdi_send(0x90);
for(i=0;i<16;i++)lcdd_send(s2[i]);
d_change(danjia[sh]);change(s1);
for(i=0;i<4;i++)s1[i]=shangpin[sh][i];
lcdi_send(0x80);
for(i=0;i<16;i++)lcdd_send(s1[i]);
d_change(jine);change(s3);
lcdi_send(0x88);
for(i=0;i<16;i++)lcdd_send(s3[i]);
d_change(zongjia);change(s4);
lcdi_send(0x98);
for(i=0;i<16;i++)lcdd_send(s4[i]);
lcdi_send(0x98);
//while
(1);
}
}
}
voidkeyin(void)interrupt0using0//中断0服务程序
{charX,i;
longinty;
send7289(0x15);//接收数据
X=receive();
cs7289=1;
X=X&0x1f;
switch(X)
{case0xf:
{zongjia=zongjia+jine;
qingdan[qb][0]=sh;
qingdan[qb][1]=danjia[sh];
qingdan[qb][2]=shizhong;
qingdan[qb][3]=jine;
qb++;sh=0;dot=0;
danjia[0]=0;
for(i=0;i<6;i++)jiage[i]=0;
}
break;//累加
case0xe:
pizhong=zhongliang;break;//去皮
case0xd:
{danjia[sh]=0;dot=0;}break;//清单价
case0xc:
{zongjia=0;jine=0;dot=0;list=0;qb=0;pizhong=0;
if(sh==0)danjia[sh]=0;}break;//总清
case0xa:
dot=1;break;//点
case0xb:
list=1;break;//清单
case0x19:
sh=10;break;
case0x18:
sh=9;break;
case0x17:
sh=8;break;
case0x16:
sh=7;break;
case0x15:
sh=6;break;
case0x14:
sh=5;break;
case0x13:
sh=4;break;
case0x12:
sh=3;break;
case0x11:
sh=2;break;
case0x10:
sh=1;break;
case0x1f:
case0x1e:
case0x1d:
case0x1c:
case0x1a:
break;
case0x1b:
dot=1;break;
default:
{if(dot==0)
{jiage[0]=jiage[1];jiage[1]=jiage[2];jiage[2]=X;}
if(dot==1){jiage[4]=X;dot++;}
elseif(dot==2){jiage[5]=X;dot++;}
elseif(dot>2)break;
//lcdi_send(0x84);
y=jiage[0];
y=y*10+jiage[1];
y=y*10+jiage[2];
y=y*10+jiage[4];
danjia[sh]=y*10+jiage[5];
}
}
while(key7289==0);//等待键盘松开
}
/*
voidad(void)interrupt2using1
{shortx,y;
x=ad_244;
y=x;
if(x&0x80)baojing();
elsex=x>>4;
y=y&0xf;
bcd[x]=y;
}*/
//初始页面
voidini()//输入收银员编号,日期
{shorti,j;
charX;
lcdi_send(0x80);//提示输入收银员编号
i=0;
while(message1[i])lcdd_send(message1[i++]);
for(i=8;i<12;i++)
{
while(key7289);
send7289(0x15);//接收数据
X=receive();
cs7289=1;
bianhao[i]=X+0x30;
lcdi_send(0x93);
for(j=8;j<16;j++)lcdd_send(bianhao[j]);
while(key7289==0);
}
lcdi_send(0x88);//提示输入日期
i=0;
while(message2[i])lcdd_send(message2[i++]);
for(i=0;i<10;i++)//输入日期
{if(i==4||i==7)i++;
while(key7289==1);
send7289(0x15);//接收数据
X=receive();
cs7289=1;
riqi[i]=X+0x30;
j=0;
lcdi_send(0x9a);
for(j=0;j<10;j++)lcdd_send(riqi[j]);
while(key7289==0);
}
while(key7289);
nop1();
while(key7289==0);
nop1();
lcdi_send(0x1);
}
//LCD子程序
voidini_lcd()//LCD初始化子程序
{
lcdi_send(0x30);
lcdi_send(0x1);//总清
lcdi_send(0xc);
lcdi_send(0x2);//光标右移,AC+1
}
voidlcdd_send(shortX)//LCD发送数据子程序
{chk_busy();
nop1();
lcd_di=1;lcd_rw=0;lcd_e=0;
P0=X;
for(dealy=0;dealy<5;dealy++);//
lcd_e=1;X=X;
P0=0xff;
}
voidlcdi_send(shortX)//LCD发送指令子程序
{chk_busy();
nop1();
lcd_di=0;lcd_rw=0;lcd_e=0;
P0=X;
for(dealy=0;dealy<5;dealy++);//
lcd_e=1;X=X;
P0=0xff;
}
voidchk_busy()
{shorti=0xff;
while(i&0x80)
{lcd_di=0;
lcd_rw=1;
lcd_e=0;
i=P0;
lcd_e=1;
}
}
//7289子程序
voidini_7289()
{shorti;
cs7289=1;key7289=1;dio7289=1;//7289初始化子程序
for(i=0;i<50;i++)
for(dealy=0;dealy<5000;dealy++);//延时25ms
send7289(0xa4);cs7289=1;
}
voidsend7289(shortX)//7289发送数据子程序
{shorti,j=1;
cs7289=0;
for(dealy=0;dealy<6;dealy++);//延时50us
for(i=7;i>=0;i--)
{j=j<
dio7289=X&j;
j=1;j=1;clk7289=1;
for(dealy=0;dealy<1;dealy++);//延时10us
clk7289=0;
for(dealy=0;dealy<1;dealy++);//延时10us