山东省电子设计大赛(电子称).doc

上传人:赵** 文档编号:50922069 上传时间:2022-10-16 格式:DOC 页数:41 大小:743KB
返回 下载 相关 举报
山东省电子设计大赛(电子称).doc_第1页
第1页 / 共41页
山东省电子设计大赛(电子称).doc_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《山东省电子设计大赛(电子称).doc》由会员分享,可在线阅读,更多相关《山东省电子设计大赛(电子称).doc(41页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、山东省电子设计大赛(2014年)实用电子秤(C)编号:C甲1009参赛学校: 指导教师: 设计者: 2004年9月13号摘 要本系统采用单片机AT89S52为控制核心,实现电子秤的基本控制功能。系统的硬件部分包括最小系统板,数据采集、人机交互界面三大部分。最小系统部分主要是扩展了外部数据存储器,数据采集部分由压力传感器、信号的前级处理和A/D转换部分组成。人机界面部分为键盘输入 ,12864点阵式液晶显示,可以直观的显示中文,使用方便。软件部分应用单片机C语言实现了本设计的全部控制功能,包括基本的称重功能,和发挥部分的显示购物清单的功能,可以设置日期和重新设定10种商品的单价,具有超重报警功能

2、,由于系统资源丰富,还可以方便的扩展其应用第一部分:方案论证与比较一、控制器部分本系统基于51系列单片机来实现,因为系统需要大量的控制液晶显示和键盘。不宜采用大规模可编程逻辑器件:CPLD、FPGA来实现。(因为大规模可编程逻辑器件一般是使用状态机方式来实现,即所解决的问题都是规则的有限状态转换问题。本系统状态较多,难度较大。)另外系统没有其它高标准的要求,我们最终选择了AT89S52通用的比较普通单片机来实现系统设计。内部带有8KB的程序存储器,在外面扩展了32K数据存储器,以满足系统要求。 二、数据采集部分(1)、传感器题目要求称重范围9.999Kg,重量误差不大于Kg,考虑到秤台自重、振

3、动和冲击分量,还要避免超重损坏传感器,所以传感器量程必须大于额定称重。我们选择的是L-PSIII型传感器,量程20Kg,精度为,满量程时误差0.002Kg。可以满足本系统的精度要求。其原理如下图所示:称重传感器主要由弹性体、电阻应变片电缆线等组成,内部线路采用惠更斯电桥,当弹性体承受载荷产生变形时,输出信号电压可由下式给出:(2)、前级放大器部分压力传感器输出的电压信号为毫伏级,所以对运算放大器要求很高。我们考虑可以采用以下几种方案可以采用:方案一、利用普通低温漂运算放大器构成多级放大器。普通低温漂运算放大器构成多级放大器会引入大量噪声。由于A/D转换器需要很高的精度,所以几毫伏的干扰信号就会

4、直接影响最后的测量精度。所以,此中方案不宜采用。方案二、由高精度低漂移运算放大器构成差动放大器。差动放大器具有高输入阻抗,增益高的特点,可以利用普通运放(如OP07)做成一个差动放大器。电阻R1、R2电容C1、C2、C3、C4用于滤除前级的噪声,C1、C2为普通小电容,可以滤除高频干扰,C3、C4为大的电解电容,主要用于滤除低频噪声。优点:输入级加入射随放大器,增大了输入阻抗,中间级为差动放大电路,滑动变阻器R6可以调节输出零点,最后一级可以用于微调放大倍数,使输出满足满量程要求。输出级为反向放大器,所以输出电阻不是很大,比较符合应用要求。缺点:此电路要求R3、R4相等,误差将会影响输出精度,

5、难度较大。实际测量,每一级运放都会引入较大噪声。对精度影响较大。方案三:采用专用仪表放大器,如:INA126,INA121等。此类芯片内部采用差动输入,共模抑制比高,差模输入阻抗大,增益高,精度也非常好,且外部接口简单。以INA126为例,接口如下图所示: 放大器增益,通过改变的大小来改变放大器的增益。基于以上分析,我们决定采用制作方便而且精度很好的专用仪表放大器INA126。 (3)、A/D转换器由上面对传感器量程和精度的分析可知:A/D转换器误差应在以下12位A/D精度:10Kg/4096=2.44g14位A/D精度:10Kg/16384=0.61g考虑到其他部分所带来的干扰,12位A/D

6、无法满足系统精度要求。所以我们需要选择14位或者精度更高的A/D。方案一、逐次逼近型A/D转换器,如:ADS7805、ADS7804等。逐次逼近型A/D转换,一般具有采样/保持功能。采样频率高,功耗比较低,是理想的高速、高精度、省电型A/D转换器件。高精度逐次逼近型A/D转换器一般都带有内部基准源和内部时钟,基于89C52构成的系统设计时仅需要外接几个电阻、电容。但考虑到所转换的信号为一慢变信号,逐次逼近型A/D转换器的快速的优点不能很好的发挥,且根据系统的要求,14位AD足以满足精度要求,太高的精度就反而浪费了系统资源。所以此方案并不是理想的选择。方案二、双积分型A/D转换器:如:ICL71

7、35、ICL7109等。双积分型A/D转换器精度高,但速度较慢(如:ICL7135),具有精确的差分输入,输入阻抗高(大于),可自动调零,超量程信号,全部输出于TTL电平兼容。双积分型A/D转换器具有很强的抗干扰能力。对正负对称的工频干扰信号积分为零,所以对50HZ的工频干扰抑制能力较强,对高于工频干扰(例如噪声电压)已有良好的滤波作用。只要干扰电压的平均值为零,对输出就不产生影响。尤其对本系统,缓慢变化的压力信号,很容易受到工频信号的影响。故而采用双积分型A/D转换器可大大降低对滤波电路的要求。作为电子秤,系统对AD的转换速度要求并不高,精度上14位的AD足以满足要求。另外双积分型A/D转换

8、器较强的抗干扰能力,和精确的差分输入,低廉的价格。综合的分析其优点和缺点,我们最终选择了ICL7135。三、人机交互界面(1)、键盘输入键盘输入是人机交互界面中最重要的组成部分,它是系统接受用户指令的直接途径。我们采用了专用的键盘显示芯片ZLG7289。Intel8279是一种比较成熟的可编程键盘/显示芯片,可以满足小系统的要求。ZLG7289是周立功单片机公司设计的串行输入输出可编程键盘/显示芯片有强大的键盘显示功能,支持64键控制。可以比较方便的扩展系统。另外ZLG7289内部有译码电路,大大简化了程序。我们选择功能更好的ZLG7289作为键盘扫描显示芯片(2)、显示输出虽然ZLG7289

9、具有控制数码管显示的功能,但考虑到本题目要求中文显示,数码管无法满足,只能考虑用带有中文字库的液晶显示器。由于可以分页显示,无需太大屏幕,我们选择了点阵式12864型LCDOCM4X8C。第二部分:具体实现方案一、硬件组成:(一)、硬件结构框图如下:(二)、各部分硬件电路实现(1)、基于AT89S52的主控电路图主控电路以89C52为核心扩展32K RAM;单片机使用6M晶振,P0口外接上拉电阻,增大了带负载能力;A12A15接74LS138译码器,输出作外部片选信号。 扩展了几个接口用于其它部分于单片机的通信(2)前端信号处理INA126构成的放大器及滤波电路:通过调节的阻值来改变放大倍数。

10、微弱信号Vi1和Vi2被分别放大后从INA126的第6脚输出。A/D转换器ICL7135的输入电压变化范围是-2V+2V,传感器的输出电压信号在020mv左右,因此放大器的放大倍数在200300左右,可将接成的滑动变阻器。由于ICL7135对高频干扰不敏感,所以滤波电路主要针对工频及其低次谐波引入的干扰。因为压力信号变化十分缓慢,所以滤波电路可以把频率做得很低。(3)A/D转换器基于ICL7135的A/D转换器实现电路:基准源选用芯片MC1403 2.5V分压得到:由于ICL7135内部没有振荡器,所以需要外接。但A/D转换器精度与时钟频率的漂移无关。正向积分时间T1和反向积分时间T2按相同比

11、例增加并不影响测量的结果。ICL7135的时钟频率典型值为200kHz最高允许为1200kHz,时钟频率越高,转换速度越快。每输出一位BCD码的时间为200个时钟周期,选通脉冲位于数据脉冲的中部,如果时钟频率太高,则数据的接受程序还没有接受完毕,数据就已经消失了。考虑到此系统频率要求不是太高,且单片机的工作频率也不是很高,因此我们取时钟频率的典型值:200kHz。由于频率比较低,对时钟漂移要求不高,我们采用阻容方式实现了基本的振荡电路。如下:振荡频率约为160kHz。此外ICL7135外部还需要外接积分电阻、积分电容,但A/D转换器精度与外接的积分电阻、积分电容的精度无关,故可以降低对元件质量

12、的要求。不过积分电容和积分电容的介质损耗会影响到A/D转换器的精度,所以应采用介质损耗较小的聚丙乙烯电容ICL7135还需要外接基准电源,这是因为芯片内部的基准源一般容易受到温度的影响,而基准电源的变化会直接影响转换精度。所以当精度要求较高时,应采用外接基准源。一般接其典型值1V。(4)、人机交互界面(a)、键盘接口图:键盘控制芯片ZLG7289控制键盘的扫描,当监测到有键按下后ZLG7289的9脚便产生一个低电平通知单片机,单片机可以采用查询或者中断方式将数据通过P1.5以串行方式读入。因为查询方式会浪费大量的时间,所以本系统采用的是中断方式。(b)、LCD显示接口电路.LCD复位信号通过反

13、相器接到单片机的RESET上,上电或手动复位时将随单片机同时复位。由于复位后并行口输出高电平,LCD处于选中状态,此时LCD将输出内部状态字,将会影响数据总线上的数据传输。所以外接一个反相器。二、软件组成:(一)、流程图主程序流程如图所示:中断服务程序流程图如下:(2)、软件说明由于涉及到大量数据的运算,程序不宜采用汇编语言,C语言大大缩短了开发时间,且程序可读性非常好。程序中对AD采入的数据进行了数字滤波,进一步减小AD读入数据的误差。7289键盘控制采用中断方式,加快了程序的执行效率。详细的操作过程见使用说明。第三部分:测试及结果分析一、 测试结果及误差分析:砝码重量(g)实际显示重量1(

14、g)实际显示重量2(g)实际显示重量3(g)1009999981501481471492001951971982502442462443002952962943503423443434003933953964504434434445004934944955505525515536005905935946506416416427006896926937507407407418007907917908508398408429008878888889509389389381000986987987注:由于传感器和其他器件本身并非理想线性,程序中对实测数据进行了线性补偿。误差分析:经校准,非线性补偿后

15、,误差已基本达到要求。所用测量仪器:总重1Kg的砝码,万用表,示波器第四部分:使用操作说明本系统采用32键键盘来实现,分为数字键:0-9,商品1-商品10,6个控制键。本系统开机显示公司名称,后提示输入收银员编号和当前日期。正确输入后,进入称重显示。数字键和小数点键:用于输入单价;累加键:相当于确认,可以将当然信息保存至购物清单;并且将金额累加,得到所购买商品的总金额。去皮键:用于去除皮重;清单价:用于输入的单价错误的时候,重新输入;购物清单键:当需要显示当前顾客的总的购物清单时,可以连续按下购物清单键,分页显示所购买的商品信息,并且若以达到最后一页,则显示总计金额,收银员编号,和公司名称,当

16、然日期。运行中如果顾客购买已存入的10种商品,只需按下相应的商品键,既可以将商品的名称和单价以中文的形式显示,同样累加键保存此商品的信息,包括其重量,金额和当前累计金额。另外,已存入的10种商品的单价均可重新设置,直接输入其单价即可,方便实用。如果所称重物超过了系统最大量程10Kg,则蜂明器发出报警声音。第五部分:附录电子秤的信号采集、处理、显示的程序.#include #include/ad控制线#define ad_244 XBYTE0xbfff;sbit ad_stb=P33;sbit ad_start=P11;/lcd控制线sbit lcd_di=P17;sbit lcd_rw=P12

17、;sbit lcd_e=P10;/7289控制线sbit cs7289=P13;sbit clk7289=P14;sbit dio7289=P15;/sbit key7289=P16; /7289查询方式sbit key7289=P32; /7289中断方式sbit baoj=P35;/7289子程序void ini_7289(void);void send7289(short);short receive(void);void keyin(void);/lcd子程序void ini_lcd(void);void lcdd_send(short);void lcdi_send(short);v

18、oid chk_busy(void);/ad子程序void ad(void);void baojing(void);void d_change(long);/初始化,编号,日期void ini();void error1(void);void nop1()void change(s)int dealy; /全局变量short sh=0; /商品号short dot=0; /小数点标志bit list=0;short qb=0;char xdata shuju7=;short xdata bcd5;char xdata s116=单价: 元;char xdata s216=重量: Kg;char

19、 xdata s316=金额: 元;char xdata s416=累计: 元;char code message0=信息学院 山东大学;char code message1=输入收银员代号:;char code message2=输入日期:;char code message316= -山东大学- ;char code message516=垃圾公司欢迎您!;char xdata bianhao16=收银员: ;char xdata riqi16= - - ;long int xdata zongjia=0,jine=0,jine1=0;int xdata shizhong=0,pizhon

20、g=0,zhongliang=0;long int xdata qingdan204;char code shangpin114=单价,苹果,梨 ,花生,大米,桃子,塑料,瓜子,桔子,香蕉,玉米;long int xdata danjia11=0,2000,3635,5502,6660,3320,5502,660,3210,6600,5600;char xdata jiage6=0x0,0x0,0x0,0xfe,0x0,0x0; / 0.00short xdata xiuzheng=0,2,5,6,7,8,9,12,13;char s16;s6=shuju0; s7=shuju1; s8=sh

21、uju2; s9=shuju3; s10=shuju4; s11=shuju5; s12=shuju6;/*void main()short i,j; long int x,z; int y; int xdata duilie3=0; P1=0xff; ini_lcd(); /初始化LCD lcdi_send(0x8a); while(message0i) lcdd_send(message0i+); ini_7289(); /初始化7289 pizhong=ad1(); lcdi_send(0x1); /总清 屏 ini(); /初始页面,收银员编号,日期 lcdi_send(0x1); /

22、总清 屏 EA=1;EX0=1; /中断 /EX1=1; /ad_start=1; while(1) if(list)lcdi_send(0x80); /显示单位名称 for(i=0;i16;i+) lcdd_send(message3i); x=qingdan00; /商品名 单价 for(i=0;i4;i+) s1i=shangpinxi; x=qingdan01; d_change(x); change(s1); lcdi_send(0x90); for(i=0;i16;i+) lcdd_send(s1i); x=qingdan02; /显示重量 d_change(x); change(

23、s2); s210=s29;s29=.; if(s28=32) s28=0x30; lcdi_send(0x88); for(i=0;i16;i+) lcdd_send(s2i); x=qingdan03; d_change(x); change(s3); lcdi_send(0x98); for(i=0;i16;i+) lcdd_send(s3i); /以上为第一页 EA=0;EX0=0; /关键盘中断 for(j=1;jqb;j+) while(key7289); x=qingdanj2; d_change(x); change(s2); /显示数据 s210=s29; s29=.; if

24、(s28=32) s28=0x30; lcdi_send(0x90); for(i=0;i16;i+) lcdd_send(s2i); x=qingdanj1; d_change(x); change(s1); x=qingdanj0; for(i=0;i4;i+) s1i=shangpinxi; lcdi_send(0x80); for(i=0;i16;i+) lcdd_send(s1i); x=qingdanj3; d_change(x); change(s3); lcdi_send(0x88); for(i=0;i16;i+) lcdd_send(s3i); lcdi_send(0x98

25、); for(i=0;i16;i+) lcdd_send(0x20); lcdi_send(0x98); while(key7289=0); while(key7289); d_change(zongjia); change(s4); lcdi_send(0x80); for(i=0;i16;i+) lcdd_send(s4i); lcdi_send(0x90); for(i=0;i16;i+) lcdd_send(bianhaoi); lcdi_send(0x88); for(i=0;i16;i+) lcdd_send(message5i); lcdi_send(0x98); for(i=0

26、;i1; x=duilie0; x=x1; x=x+duilie1+duilie2; */ zhongliang=ad1(); shizhong=zhongliang-pizhong; /数据转换 x=danjiash; jine1=shizhong*x; jine=jine1/1000; d_change(shizhong); change(s2); /显示数据 s210=s29; s29=.; if(s28=32) s28=0x30; lcdi_send(0x90); for(i=0;i16;i+) lcdd_send(s2i); d_change(danjiash); change(s1

27、); for(i=0;i4;i+) s1i=shangpinshi; lcdi_send(0x80); for(i=0;i16;i+) lcdd_send(s1i); d_change(jine); change(s3); lcdi_send(0x88); for(i=0;i16;i+) lcdd_send(s3i); d_change(zongjia); change(s4); lcdi_send(0x98); for(i=0;i16;i+) lcdd_send(s4i); lcdi_send(0x98); /while(1); void keyin(void) interrupt 0 us

28、ing 0 /中断0服务程序char X,i; long int y; send7289(0x15); /接收数据 X=receive(); cs7289=1; X=X&0x1f;switch(X) case 0xf : zongjia=zongjia+jine; qingdanqb0=sh; qingdanqb1=danjiash; qingdanqb2=shizhong; qingdanqb3=jine; qb+; sh=0;dot=0; danjia0=0; for(i=0;i2) break; / lcdi_send(0x84); y=jiage0; y=y*10+jiage1; y=

29、y*10+jiage2; y=y*10+jiage4; danjiash=y*10+jiage5; while(key7289=0); /等待键盘松开 /*void ad(void) interrupt 2 using 1short x,y; x=ad_244; y=x; if(x&0x80) baojing(); else x=x4; y=y&0xf; bcdx=y; */ /初始页面void ini() / 输入收银员编号,日期short i,j; char X; lcdi_send(0x80); /提示输入收银员编号 i=0; while(message1i) lcdd_send(mes

30、sage1i+); for(i=8;i12;i+) while(key7289); send7289(0x15); /接收数据 X=receive(); cs7289=1; bianhaoi=X+0x30; lcdi_send(0x93); for(j=8;j16;j+) lcdd_send(bianhaoj); while(key7289=0); lcdi_send(0x88); /提示输入日期 i=0; while(message2i) lcdd_send(message2i+); for(i=0;i10;i+) /输入日期 if(i=4|i=7) i+; while(key7289=1)

31、; send7289(0x15); /接收数据 X=receive(); cs7289=1; riqii=X+0x30; j=0; lcdi_send(0x9a); for(j=0;j10;j+) lcdd_send(riqij); while(key7289=0); while(key7289); nop1(); while(key7289=0); nop1(); lcdi_send(0x1);/LCD子程序void ini_lcd() /LCD初始化子程序 lcdi_send(0x30); lcdi_send(0x1); /总清 lcdi_send(0xc); lcdi_send(0x2)

32、; /光标右移,AC+1void lcdd_send(short X) /LCD发送数据子程序chk_busy(); nop1(); lcd_di=1;lcd_rw=0;lcd_e=0; P0=X; for(dealy=0;dealy5;dealy+);/ lcd_e=1; X=X; P0=0xff;void lcdi_send(short X) /LCD发送指令子程序chk_busy(); nop1(); lcd_di=0;lcd_rw=0;lcd_e=0; P0=X; for(dealy=0;dealy5;dealy+);/ lcd_e=1; X=X; P0=0xff; void chk_

33、busy()short i=0xff; while(i&0x80) lcd_di=0; lcd_rw=1; lcd_e=0; i=P0; lcd_e=1; /7289子程序void ini_7289()short i; cs7289=1; key7289=1; dio7289=1; /7289初始化子程序 for(i=0;i50;i+) for(dealy=0;dealy5000;dealy+); /延时25ms send7289(0xa4); cs7289=1;void send7289(short X) /7289发送数据子程序short i,j=1; cs7289=0; for(dealy=0;dealy=0;i-) j=ji; dio7289=X&j; j=1;j=1;clk7289=1; for(dealy=0;dealy1;dealy+) ; /延时10us clk7289=0; for(dealy=0;dealy1;dealy+) ; /延时10us dio728

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com