电子秤的设计与实现_毕业论文.doc_第1页
电子秤的设计与实现_毕业论文.doc_第2页
电子秤的设计与实现_毕业论文.doc_第3页
电子秤的设计与实现_毕业论文.doc_第4页
电子秤的设计与实现_毕业论文.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子秤的设计与实现 一. 研究的目的和意义 随着时代科技的迅猛发展,微电子学和计算机等现代电子技术的成就给传统的电子测量与仪器带来了巨大的冲击和革命性的影响。常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。 传统的机械秤有很多缺点,比如精度不高,结构复杂,易老化,成本高等。随着社会的发展,市场对秤的要求的越来越高,尤其是人体秤、厨房秤等各类便携式小型秤。电子秤与传统的机械秤相比有许多优越性,它用压力传感器取代机械秤的弹簧大大减小了秤的体积和制造难度,以lcd或led显示屏取代传统的刻度盘使外形更加美观,由于内部集成了单片机以及软件系统,电子秤还拥有传统机械秤无法比拟的智能性。他可以完成过载报警,总价计算,数据通信等众多功能。目前市场上使用的称量工具,或者结构复杂,或者运行不可靠,且成本高,而且整体水平不高 ,部分小型企业质量差且技术薄弱,设备不全,缺乏产品的开发能力,产品质量在低水平徘徊。因此,有针对性的开发出一套具有实用价值的电子秤系统,从技术上克服上述诸多缺点,改善电子秤应用中的不足之处,具有现实意义。二.设计原理 1.电子秤的原理就是利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过ad模数转换器转换为数字信号,最后把数字信号送入单片机。单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。此外,还可通过键盘设定所称物品的价格。 2. 原理仿真设计电路图图13.程序框图(1)主程序设计 图2 主程序设计(2)子程序a/d 0832的转化 图3 a/d 0832的转化(3)显示子程序的设计 图4 显示子程的设计(4)按键子程的设计在程序中可以先判断按键编码,然后根据编码将键盘代表的数值送到相应的存储单元,再进行功能选择或数据处理。键盘扫描子程序的流程图如下: 图5 按键子程序的设计 3. 程序清单#include#include#include #include #define uchar unsigned char#define uint unsigned int#define busy 0x80 /常量定义#define dataport p0sbit badcs=p13; /片选位sbit badcl=p16; /时钟位sbit badda=p17; /数据位sbit lcm_rs=p10;sbit lcm_rw=p11;sbit lcm_en=p12;uint x1,y1,z1=0,w1,temp1;uchar ad_data,k,n,m,e,num,s; /采样值存储 uchar z; uchar data1; char press_data; /标度变换存储单元unsigned char ad_alarm; unsigned char press_ge=0; /显示值百位unsigned char press_shifen=0; /显示值十位unsigned char press_baifen=0; /显示值个位unsigned char press_qianfen=0; /显示值十分位uchar code str0=weight: . kg ;uchar code str2=price: ;uchar code str3=total: ;uchar code table2=0x37,0x38,0x39,0xfd,0x34,0x35,0x36,0x78,0x31,0x32,0x33,0x2d,0x3d,0x30,0x2e,0x2b; /键盘码 void intu(); void jianpan();void delay(uint);void lcd_wait(void);void delay_lcm(uint); /lcd延时子程序void initlcm( void); /lcd初始化子程序void lcd_wait(void); /lcd检测忙子程序void writecommandlcm(uchar wclcm,uchar busyc); /写指令到icm子函数void writedatalcm(uchar wdlcm); /写数据到lcm子函数void displayonechar(uchar x,uchar y,uchar ddata); /显示指定坐标的一个字符子函数void displaylistchar(uchar x,uchar y,uchar code *ddata); /显示指定坐标的一串字符子函数void weishu(uint m); void weishu1(uint m); void display(void);void ad0832(); void alarm(void);void data_pro(void); void ad0832(void) uchar i; badcs = 0;/当adc0832未工作时其cs输入端应为高电平,此时芯片禁用,开始工作cs为低电平 badcl=0; /第一个时钟下降沿前da为1,第二个与第三时钟下降沿前的数据为通道选择 badda=1; /选置起始位 badcl=1; badcl=0; / 1down badda=1; /通道选择第1位 badcl=1; badcl=0;/ 2 down badda=0; /通道选择第2位,通道选择为1,0选通道0 badcl=1; badcl=0;/ 3 down badda=1; badcl=1; badcl=0;/ 4 down for(i=8;i0;i-) ad_data=1; /从第7位开始,要左移data1=data11 badcl=0;badcl=1;if(badda=1) ad_data|=0x01; /如果输出1,data1最后一位补1 badcs=1;/转换完后cs置1 /*main funcation*/ void main(void) delay(50); /系统延时500ms启动ad_data=0; /采样值存储单元初始化为0 initlcm( );intu(); writecommandlcm(0x01,1);/清显示屏 displaylistchar(0,0,str0); displaylistchar(0,1,str2);while(1) ad0832(); /采样值存储单元初始化为0 data_pro(); display(); jianpan();if(k=1) if(s=3) displayonechar(s+7),1,table2num-1); if(s=1) data1=n; else data1=data1*10+n; if(k=) z1=data1*temp1; writecommandlcm(0x01,1); displaylistchar(0,1,str3);s=0; weishu1(z1); k=0;if(k= ) writecommandlcm(0x80+0x40,1); writecommandlcm(0x01,1); z1=0; s=0; /防止清零时指针后移动 /*延时k*1ms,12.000mhz*/void delay(uint k) uint i,j; for(i=0;ik;i+) for(j=0;j10;j+); /*写指令到icm子函数*/void writecommandlcm(uchar wclcm,uchar busyc) if(busyc)lcd_wait();dataport=wclcm; lcm_rs=0; / 选中指令寄存器 lcm_rw=0; lcm_rw=0; / 写模式 lcm_en=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); lcm_en=0; /*写数据到lcm子函数*/void writedatalcm(uchar wdlcm) lcd_wait( ); /检测忙信号 dataport=wdlcm; lcm_rs=1; / 选中数据寄存器 lcm_rw=0; / 写模式 lcm_en=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); lcm_en=0;/*lcm内部等待函数*/void lcd_wait(void) dataport=0xff; /读lcd前若单片机输出低电平,而读出lcd为高电平,则冲突,proteus仿真会有显示逻辑黄色lcm_en=1; lcm_rs=0; lcm_rw=0; lcm_rw=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); while(dataport&busy) lcm_en=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); lcm_en=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_();_nop_(); lcm_en=0;/*lcm初始化子函数*/void initlcm( ) lcm_en=0; dataport=0;delay(10);writecommandlcm(0x38,0); /三次显示模式设置,不检测忙信号 delay(5); writecommandlcm(0x38,0); delay(5); writecommandlcm(0x38,0); delay(5); writecommandlcm(0x38,1); /8bit数据传送,2行显示,5*7字型,检测忙信号 writecommandlcm(0x08,1); /关闭显示,检测忙信号 writecommandlcm(0x01,1); /清屏,检测忙信号 writecommandlcm(0x06,1); /显示光标右移设置,检测忙信号 writecommandlcm(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号void intu() k=0;x1=0;y1=0;z1=0;/*显示指定坐标的一个字符子函数*/void displayonechar(uchar x,uchar y,uchar ddata) y&=0x01; x&=0x0f; if(y)x|=0x40; /若y为1(显示第二行),地址码+0x40 x|=0x80; /指令码为地址码+0x80 writecommandlcm(x,1); writedatalcm(ddata); /*显示指定坐标的一串字符子函数*/ void displaylistchar(uchar x,uchar y,uchar code *ddata) uchar listlength=0; y&=0x01; x&=0x0f; while(x10) displayonechar(x,y,ddatalistlength); listlength+; x+; /*系统显示子函数*/void display(void) writecommandlcm(0x0c,1); /显示屏打开,光标不显示,不闪烁,检测忙信号displaylistchar(0,0,str0);/displaylistchar(0,1,str2);displayonechar(8,0,press_ge+0x30);displayonechar(10,0,press_shifen+0x30);displayonechar(11,0,press_baifen+0x30); displayonechar(12,0,press_qianfen+0x30);delay(1000); /稳定显示 void data_pro(void) unsigned int; float press; if(0ad_data256) int vary=ad_data;press=(0.019531*vary);temp1=(int)(press*1000); /放大1000倍,便于后面的计算 press_ge=temp1/1000; /取压力值百位press_shifen=(temp1%1000)/100; /取压力值十位press_baifen=(temp1%1000)%100)/10; /取压力值个位press_qianfen=(temp1%1000)%100)%10;/取压力值十分位 void weishu1(uint m) uchar wei5,wei4,wei3,wei2,wei1,wei0; wei5=m/100000; wei4=m%100000/10000; wei3=m%10000/1000; wei2=m%1000/100; wei1=m%100/10; wei0=m%10; displayonechar(7,1,0x30+wei4); displayonechar(8,1,0x30+wei3); displayonechar(9,1,.); displayonechar(10,1,0x30+wei2); /displayonechar(10,1,.); displayonechar(11,1,0x30+wei1); displayonechar(12,1,0x30+wei0);/* 键盘扫描程序*/ void jianpan() uchar temp; p2=0xfe; temp=p2; temp=temp&0xf0; if(temp!=0xf0) delay(5);temp=p2; temp=temp&0xf0;while(temp!=0xf0) temp=p2; switch(temp) case 0xee:num=1;n=7;k=1,s+;break; case 0xde:num=2;n=8;k=1,s+;break; case 0xbe:num=3;n=9;k=1,s+;break; case 0x7e:num=4;k=/,s+;break; while(temp!=0xf0) temp=p2; temp=temp&0xf0; /displayonechar(s+6),1,table2num-1); p2=0xfd; temp=p2; temp=temp&0xf0; if(temp!=0xf0) delay(1);temp=p2; temp=temp&0xf0;while(temp!=0xf0) temp=p2; switch(temp) case 0xed:num=5;n=4;k=1;s+;break; case 0xdd:num=6;n=5;k=1;s+;break; case 0xbd:num=7;n=6;k=1;s+;break; case 0x7d:num=8;k=*;s+;break; while(temp!=0xf0) temp=p2; temp=temp&0xf0; /displayonechar(k+6,1,table2num-1); p2=0xfb; temp=p2; temp=temp&0xf0; if(temp!=0xf0) delay(1);temp=p2; temp=temp&0xf0;while(temp!=0xf0) temp=p2; switch(temp) case 0xeb:num=9;n=1;k=1;s+;break; case 0xdb:num=10;n=2;k=1;s+;break; case 0xbb:num=11;n=3;k=1;s+;break; case 0x7b:num=12;k=-;s+;break; while(temp!=0xf0) temp=p2; temp=temp&0xf0; /displayonechar(k+6,1,table2num-1); p2=0xf7; temp=p2; temp=temp&0xf0; if(temp!=0xf0) delay(1);temp=p2; temp=temp&0xf0;while(temp!=0xf0) temp=p2; switch(temp) case 0xe7:num=13;k= ;break; case 0xd7:num=14;n=0;k=1;s+;break; case 0xb7:num=15;k=;s+;break; case 0x77:num=16;k=+;s+;break; while(temp!=0xf0) temp=p2; temp=temp&0xf0; /displayonechar(k+6,1,table2num-1); 三 元件清单c51单片机 1个lcd1602显示 1个a/d0832芯片 1个ua741放大器 1个按键 13个电解电容30pf 1个 15pf电容 2个 10k电阻 1个 1k电阻 5个 1k滑动变阻 1个 4.7k滑动变阻 1个四调试过程遇到的问题及解决方法在调试过程中,一开始单片机程序烧不进去,发现是单片机坏了,找老师重新换了一块,重量部分显示,但发现没有放大,在进行检查电路发现,放大器的3和4引脚短路,器件本身是坏的,重新换了一个,有了放大,在调试按键部分的过程中,按键显示不正常,经过重新修正程序和换了单片机,按键和总价显示正常。五设计的缺点或缺陷及改进的设想 在设计过程中,由于对电

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论