电子秤的设计与实现精品文档14页.docx
- 文档编号:14902822
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:17
- 大小:21.15KB
电子秤的设计与实现精品文档14页.docx
《电子秤的设计与实现精品文档14页.docx》由会员分享,可在线阅读,更多相关《电子秤的设计与实现精品文档14页.docx(17页珍藏版)》请在冰点文库上搜索。
电子秤的设计与实现精品文档14页
电子秤的设计与实现
一.家庭是幼儿语言活动的重要环境,为了与家长配合做好幼儿阅读训练工作,孩子一入园就召开家长会,给家长提出早期抓好幼儿阅读的要求。
我把幼儿在园里的阅读活动及阅读情况及时传递给家长,要求孩子回家向家长朗诵儿歌,表演故事。
我和家长共同配合,一道训练,幼儿的阅读能力提高很快。
研究的目的和意义
课本、报刊杂志中的成语、名言警句等俯首皆是,但学生写作文运用到文章中的甚少,即使运用也很难做到恰如其分。
为什么?
还是没有彻底“记死”的缘故。
要解决这个问题,方法很简单,每天花3-5分钟左右的时间记一条成语、一则名言警句即可。
可以写在后黑板的“积累专栏”上每日一换,可以在每天课前的3分钟让学生轮流讲解,也可让学生个人搜集,每天往笔记本上抄写,教师定期检查等等。
这样,一年就可记300多条成语、300多则名言警句,日积月累,终究会成为一笔不小的财富。
这些成语典故“贮藏”在学生脑中,自然会出口成章,写作时便会随心所欲地“提取”出来,使文章增色添辉。
随着时代科技的迅猛发展,微电子学和计算机等现代电子技术的成就给传统的电子测量与仪器带来了巨大的冲击和革命性的影响。
常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。
课本、报刊杂志中的成语、名言警句等俯首皆是,但学生写作文运用到文章中的甚少,即使运用也很难做到恰如其分。
为什么?
还是没有彻底“记死”的缘故。
要解决这个问题,方法很简单,每天花3-5分钟左右的时间记一条成语、一则名言警句即可。
可以写在后黑板的“积累专栏”上每日一换,可以在每天课前的3分钟让学生轮流讲解,也可让学生个人搜集,每天往笔记本上抄写,教师定期检查等等。
这样,一年就可记300多条成语、300多则名言警句,日积月累,终究会成为一笔不小的财富。
这些成语典故“贮藏”在学生脑中,自然会出口成章,写作时便会随心所欲地“提取”出来,使文章增色添辉。
传统的机械秤有很多缺点,比如精度不高,结构复杂,易老化,成本高等。
随着社会的发展,市场对秤的要求的越来越高,尤其是人体秤、厨房秤等各类便携式小型秤。
电子秤与传统的机械秤相比有许多优越性,它用压力传感器取代机械秤的弹簧大大减小了秤的体积和制造难度,以LCD或LED显示屏取代传统的刻度盘使外形更加美观,由于内部集成了单片机以及软件系统,电子秤还拥有传统机械秤无法比拟的智能性。
他可以完成过载报警,总价计算,数据通信等众多功能。
目前市场上使用的称量工具,或者结构复杂,或者运行不可靠,且成本高,而且整体水平不高,部分小型企业质量差且技术薄弱,设备不全,缺乏产品的开发能力,产品质量在低水平徘徊。
因此,有针对性的开发出一套具有实用价值的电子秤系统,从技术上克服上述诸多缺点,改善电子秤应用中的不足之处,具有现实意义。
二.设计原理
1.电子秤的原理就是利用压力传感器采集因压力变化产生的电压信号,经过电压放大电路放大,然后再经过A\D模数转换器转换为数字信号,最后把数字信号送入单片机。
单片机经过相应的处理后,得出当前所称物品的重量及总额,然后再显示出来。
此外,还可通过键盘设定所称物品的价格。
2.原理仿真设计电路图
图1
3.程序框图
(1)主程序设计
图2主程序设计
(2)子程序A/D0832的转化
图3A/D0832的转化
(3)显示子程序的设计
图4显示子程的设计
(4)按键子程的设计
在程序中可以先判断按键编码,然后根据编码将键盘代表的数值送到相应的存储单元,再进行功能选择或数据处理。
键盘扫描子程序的流程图如下:
图5按键子程序的设计
3.程序清单
#include
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineBUSY0x80//常量定义
#defineDATAPORTP0
sbitbADcs=P1^3;//片选位
sbitbADcl=P1^6;//时钟位
sbitbADda=P1^7;//数据位
sbitLCM_RS=P1^0;
sbitLCM_RW=P1^1;
sbitLCM_EN=P1^2;
uintx1,y1,z1=0,w1,temp1;
ucharad_data,k,n,m,e,num,s;//采样值存储
ucharz;
uchardata1;
charpress_data;//标度变换存储单元
unsignedcharad_alarm;unsignedcharpress_ge=0;//显示值百位
unsignedcharpress_shifen=0;//显示值十位
unsignedcharpress_baifen=0;//显示值个位
unsignedcharpress_qianfen=0;//显示值十分位
ucharcodestr0[]={"Weight:
.Kg"};
ucharcodestr2[]={"Price:
"};
ucharcodestr3[]={"Total:
"};
ucharcodetable2[]={0x37,0x38,0x39,0xfd,0x34,0x35,0x36,0x78,0x31,0x32,0x33,0x2d,0x3d,0x30,0x2e,0x2b};//键盘码
voidintu();
voidjianpan();
voiddelay(uint);
voidlcd_wait(void);
voiddelay_LCM(uint);//LCD延时子程序
voidinitLCM(void);//LCD初始化子程序
voidlcd_wait(void);//LCD检测忙子程序
voidWriteCommandLCM(ucharWCLCM,ucharBusyC);//写指令到ICM子函数
voidWriteDataLCM(ucharWDLCM);//写数据到LCM子函数
voidDisplayOneChar(ucharX,ucharY,ucharDData);//显示指定坐标的一个字符子函数
voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//显示指定坐标的一串字符子函数
voidweishu(uintm);
voidweishu1(uintm);
voiddisplay(void);
voidad0832();
voidalarm(void);
voiddata_pro(void);
voidad0832(void)
{uchari;
bADcs=0;//当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,开始工作CS为低电平
bADcl=0;//第一个时钟下降沿前da为1,第二个与第三时钟下降沿前的数据为通道选择
bADda=1;//选置起始位
bADcl=1;
bADcl=0;//1down
bADda=1;//通道选择第1位
bADcl=1;
bADcl=0;//2down
bADda=0;//通道选择第2位,通道选择为1,0选通道0
bADcl=1;
bADcl=0;//3down
bADda=1;
bADcl=1;
bADcl=0;//4down
for(i=8;i>0;i--)
ad_data<<=1;//从第7位开始,要左移data1=data1<<1
bADcl=0;
bADcl=1;
if(bADda==1)ad_data|=0x01;//如果输出1,data1最后一位补1
bADcs=1;//转换完后CS置1
/**********mainfuncation************/
voidmain(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,table2[num-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**********/
voiddelay(uintk)
uinti,j;
for(i=0;i for(j=0;j<10;j++); /**********写指令到ICM子函数************/ voidWriteCommandLCM(ucharWCLCM,ucharBusyC) 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子函数************/ voidWriteDataLCM(ucharWDLCM) 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内部等待函数*************/ voidlcd_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初始化子函数***********/ voidinitLCM() 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);//显示屏打开,光标不显示,不闪烁,检测忙信号 voidintu() k=0; x1=0; y1=0; z1=0; /****显示指定坐标的一个字符子函数****/ voidDisplayOneChar(ucharX,ucharY,ucharDData) Y&=0x01; X&=0x0f; if(Y) X|=0x40;//若y为1(显示第二行),地址码+0X40 X|=0x80;//指令码为地址码+0X80 WriteCommandLCM(X,1); WriteDataLCM(DData); /*******显示指定坐标的一串字符子函数*****/ voidDisplayListChar(ucharX,ucharY,ucharcode*DData) ucharListLength=0; Y&=0x01; X&=0x0f; while(X<10) DisplayOneChar(X,Y,DData[ListLength]); ListLength++; X++; /*****************系统显示子函数*****************/ voiddisplay(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);//稳定显示 voiddata_pro(void) unsignedint; floatpress; if(0 intvary=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;//取压力值十分位 voidweishu1(uintm) ucharwei5,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); /*****键盘扫描程序*****/ voidjianpan() {uchartemp; P2=0xfe; temp=P2; temp=temp&0xf0; if(temp! =0xf0) delay(5); temp=P2; temp=temp&0xf0; while(temp! =0xf0) temp=P2; switch(temp) case0xee: num=1;n=7;k=1,s++;break; case0xde: num=2;n=8;k=1,s++;break; case0xbe: num=3;n=9;k=1,s++;break; case0x7e: num=4;k='/',s++;break; while(temp! =0xf0) temp=P2; temp=temp&0xf0; //DisplayOneChar((s+6),1,table2[num-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) case0xed: num=5;n=4;k=1;s++;break; case0xdd: num=6;n=5;k=1;s++;break; case0xbd: num=7;n=6;k=1;s++;break; case0x7d: num=8;k='*';s++;break; while(temp! =0xf0) temp=P2; temp=temp&0xf0; //DisplayOneChar(k+6,1,table2[num-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) case0xeb: num=9;n=1;k=1;s++;break; case0xdb: num=10;n=2;k=1;s++;break; case0xbb: num=11;n=3;k=1;s++;break; case0x7b: num=12;k='-';s++;break; while(temp! =0xf0) temp=P2; temp=temp&0xf0; //DisplayOneChar(k+6,1,table2[num-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) case0xe7: num=13;k='';break; case0xd7: num=14;n=0;k=1;s++;;break; case0xb7: num=15;k='=';s++;break; case0x77: num=16;k='+';s++;;break; while(temp! =0xf0) temp=P2; temp=temp&0xf0; //DisplayOneChar(k+6,1,table2[num-1]); 三.元件清单 C51单片机1个 LCD1602显示1个 A/D0832芯片1个 UA741放大器1个 按键13个 电解电容30PF1个 15PF电容2个 10k电阻1个 1k电阻5个 1k滑动变阻1个 4.7k滑动变阻1个 四.调试过程遇到的问题及解决方法 在调试过程中,一开始单片机程序烧不进去,发现是单片机坏了,找老师重新换了一块,重量部分显示,但发现没有放大,在进行检查电路发现,放大器的3和4引脚短路,器件本身是坏的,重新换了一个,有了放大,在调试按键部分的过程中,按键显示不正常,经过重新修正程序和换了单片机,按键和总价显示正常。 五.设计的缺点或缺陷及改进的设想 在设计过程中,由于对电路知识的了解有限,在实际焊板实验后,重量变化范围不如仿真时大,而且对于总价处理位数有限,希望以后多多学习c语言编程,对此有更深的了解和掌握。 六.结论意见和建议 随着集成电路和计算机技术的迅速发展,使电子仪器的整体水平发生巨大变化,传统的仪器逐步的被智能仪器所取代。 智能仪器的核心部件是单片机,因其极高的性价比得到广泛的应用与发展,从而加快了智能仪器的发展。 而传感器作为测控系统中对象信息入口,越来越受到人们的关注,传感器好比人体“五官”的工程模拟物,它是一种能够将特定的被测量信息(物理量、化学量、生物量等)按一定规律转换成某种可用信号输出的器件或装置。 本次设计是在以上仪器基础上设计而成的,因此只有充分了解有关智能仪器,单片机、传感器部分之间的关系才能达到要求。 首先是传感器的精密度,它将直接影响电子秤的称重准确度。 本次课设传感器发出信号不很稳定,如果用精密度较高的传感器效果会好得多。 其次,数据采集处理阶段,此阶段是对传感器发出信号进行量化、采集,主要分为信号放大、采集,然后进行A\D转换,该阶段需要注意的是对传感器输出信号进行放大时,应选取合适的运算放大电路,是输出满足量程要求。 七.实验电路板图片 图6电路板正面图 八.PCB图 图8实验原理图 图9电气规则检查 图10生成网络表 参考文献 [1]胡汉才.单片机原理及其接口技术(第3版).清华大学出版社 [2]李学磊.压力传感器研究现状及发展趋势.山东农业大学,2019 [3]李建忠.单片机原理及应用.西安.西安电子科技大学出版社 [4]马忠梅.单片机的C语言应用程序设计[M].北京.航空航天大学出版社,2019 [5]崔凤英.串行A\D在电子秤上的应用.青岛科技大学,2019 [6
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子秤 设计 实现 精品 文档 14