基于51单片机的称重系统设计_第1页
基于51单片机的称重系统设计_第2页
基于51单片机的称重系统设计_第3页
基于51单片机的称重系统设计_第4页
基于51单片机的称重系统设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

PAGE1杭州电子科技大学设计报告课程名称:短学期PCB电路设计学生姓名:学生学号:学生班级:专业:实验日期:基于51单片机的称重系统设计设计要求:89C52单片机最小系统的构成及设计;(包括:时钟、复位、电源、单片机、按键和显示等)在此基础上完成称重系统的设计,称重量程为0~80吨,误差正负100kg。A为称重系统选择合适的4个压力传感器,注意量程和误差。B设计放大电路,以便单片机对其信号进行后续处理。C用7段数码管或其他显示模块进行重量的显示,单位为:kg。D根据应用场合设计扩展功能(加分选做设计部分)电源系统电源系统系统流程图:51单片机压力传感器采集信号51单片机压力传感器采集信号上位机MAX232上位机MAX232放大器放大模拟信号放大器放大模拟信号按键调节按键调节A/D转换A/D转换数码管显示数码管显示复位复位蜂鸣器蜂鸣器晶振晶振主要设计内容和功能:本设计研究的是一基于51单片机的称重系统,称重范围为0到80吨,承重范围较大,可以广泛地运用于汽车过磅,货物称重,也可以用来测体重。本设计主要通过压力传感器采集货物重量信息,产生电压信号,通过运算放大器的放大,再经过一系列的A/D转换、单片机的处理,把货物的重量显示到数码管上。如果有需要,也可以通过串口通信模块把数据到PC上位机中,再由计算机分析处理数据。本设计可以通过按键来选择称重的最大量程,如果超过选择的最大量程,则会有蜂鸣器发出警报。方案论证:传感器:压力传感器选用MPX2200压强为200KPa时对应的最大电压为40mv,所以传感器底座面积设置为1平方米。40mv时对应的重量为20吨。放大器设计:量程为80吨,最大电压对应20吨,故需要4个放大器,由于器件及参数限制,输出电压为4V左右,最大输入电压40mV,故放大倍数为100倍。故电阻成100倍关系。传感器采集的信号从Header2端口输入。仿真结果:从图中可以看到增益为101倍。A/D转换:因为设计要求为误差100kg,最大电压时对应重量为20吨,20×1000/100=200。2^8=256>200。故采用8位A/D转换器。本设计可以采用ADC0809转换器。ADC0809各引脚说明:IN0~IN3:从四个运放接四路模拟量输入。D0~D7:8位数字量的输出,D0~D7分别接单片机的P10~P17端。ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路。ALE:地址锁存允许信号,输入端,高电平有效。START:A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。EOC:A/D转换结束信号,输出端,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。OE:数据输出允许信号,输入端,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。CLK:时钟脉冲输入端。要求时钟频率不高于640KHz。REF(+)、REF(-):基准电压。VCC:接+5V电源。GND:接地。按键设置:两个按键分别接单片机的P06和P07I/O口。当按键没有按下,I/O口端的信号为高电平;当按键按下,I/O口端的信号为低电平,当单片机采集到低电平信号,根据程序做出调节量程的相关反应。数码管显示:因为本设计要求测量重量范围为0到80吨,且可以测量较小的重量,如体重(约为几十千克),所以对显示的位数要求较高,故采用六个八段数码管(最小可以显示到0.1kg)。因为数码管位的显示要用掉单片机的8个I/O口,控制显示位又要用掉6个I/O口,对单片机的资源消耗较多,为节省单片机资源可以使用一个74LS138数据选择器,用3个I/O口来控制6个数码管的显示,这样就可以节约3个I/O口。拓展功能:超重报警:当测量的重物超过设置的量程,蜂鸣器报警。用蜂鸣器的一段接VCC,另一端接PNP三极管的发射极,三极管的基极通过一个电阻再接单片机的一个I/O口,三极管的集电极接地,这样就可以通过单片机I/O口的高低电平实现对蜂鸣器的控制。串口通信:本设计中通讯模块的主要功能是将STC89C52单片机采集到的数据,通过串口传输到RS-232中,最后在上位机中得以显示。由于标准串口的电平规定是接收时电平范围在+/-3~+/-15V之间,发送时电平范围在+/-5~+/-15V之间,而一般单片机系统的工作时候的电压是+3.3V或+5V,由于单片机的电平输出范围并不能满足一般的标准串口电平的基本要求,所有串口端口不能直接与PC上位机的串口端相连接,若要进行连接,则必须对单片机系统的工作电压经过电平转换。所以必须要经过MAX232芯片进行电平转换。模块图如下:MUC的串口MUC的串口MAX232PC机串口本设计采用的MAX232芯片是美国公司为电脑的RS-232标准串口专门设计的单电源电平转换芯片,使用的是+5V单电源供电。MAX232芯片的引脚功能图如下图所示。MAX232引脚功能分为三个部分,分别为电荷泵电路部分、数据转换通道部分和供电部分。电荷泵电路部分由电容和1、2、3、4、5、6引脚构成,其功能是给RS232的串口两个+12V和-12V的电源。数据转换通道部分又分成第一数据通道和第二数据通道,其中第一数据通道是由11、12、13、14引脚构成,而第二数据通道是由7、8、9、10引脚构成,TTL/CMOS的相关数据从11引脚、10引脚输入,由芯片功能转换成为RS232数据,再从7引脚、14引脚送到电脑串口插头中;随后电脑串口插头的RS232数据由13引脚、8引脚输入再转换为TTL/CMOS的数据后,从12引脚、9引脚进行输出。供电部分由15脚和16脚组成,15引脚接地,16引脚接+5V。供电系统:由于本系统中元器件所需要的最大电压为+/-12V(运算放大器OP37AZ),本设计采用+/-12V供电。又由于该系统中单片机及AD转换芯片及液晶显示器所需供电电压均为5V。电压,所以要保证系统稳定可靠的工作,需要设计一个可以稳定提供5V电压的供电系统。可以采用三端稳压器件LM7805作为系统电源的稳压器件以保证系统电压为稳定的直流5V电压,输入12V电压输出5V电压,系统电源输入接口要加滤波电容以确保工作电压稳定。电路仿真:此仿真为验证运放放大增益为200。用一个20mv的直流电压源代替输入信号,输出信号从外接电阻采集。仿真软件为Multisin12.0。仿真结果:输入为40mv,输出为4.04V,约为101倍。原理图:PCB图:规则检查:规则检查时,由于封装原因,J1的两个焊盘外径132mil过大,超过了最大焊盘外径100mil,违法了规则,通过修改焊盘规则解决。收获与体会:在实际设计过程中,遇到很多问题,对软件和单片机都不太熟悉,但通过互联网和查阅资料,对这单片机最小系统和整个称重系统有了初步了解,学会了设计简单的单片机系统,把以前所学的东西应用起来。也学会了使用AltiumDesigner6.9和Multisim12.0软件。特别是AD,之前没有用过,通过这几天看书和自学,可以绘制该系统的原理图和PCB图,完成设计要求。这对以后设计电路有很大的帮助。

中南民族大学学生课程设计报告课程名称:C程序设计语言选题名称:通讯录管理年级:专业:信息管理与信息系统学号:姓名:指导教师:完成地点:管理学院综合实验室完成日期:1.课程设计的目的为了熟练掌握C语言的语法特点、及其数据结构,提高自身编写程序的能力。通过课程设计实现理论知识与实际情况的结合,使所学知识能够在现实社会中起到一定的作用,防止所编写的程序脱离实际,让程序可以更好的发挥作用,以便减轻实际工作中所遇到的繁琐步骤,提高现实工作中的效率。此外通过课程设计提高逻辑思考能力和解决实际问题的能力。程序设计是公认的、最能直接有效地训练学生的创新思维,培养分析问题、解决问题能力的学科之一。其次课程设计有利于治学态度的培养。程序设计中,语句的语法和常量变量的定义都有严格的要求,有时输了一个中文标点、打错了一个字母,编译就不通过,程序无法正常运行。因此,程序设计初学阶段,学生经常会犯这样的错误,可能要通过几次乃至十多次的反复修改、调试,才能成功,但这种现象会随着学习的深入而慢慢改观。这当中就有一个严谨治学、一丝不苟的科学精神的培养,又有一个不怕失败、百折不挠品格的锻炼。通讯录信息管理系统是生活中不可缺少的部分编写了一个通讯录信息管理系统是十分必要的。本程序设计具有通讯信息的录入,进行保存、查找、删除等功能,操作界面简洁美观,易于操作。程序用了条件、循环、指针、结构体等知识点,综合了文件的打开和保存编写的。可运用于小的管理软件。软件运用菜单实现交互式管理,用户轻松的按键既可实现对软件的操作,操作简单易懂,功能丰富,可以很好的满足的需要。通过对通讯录管理系统的设计,进一步理解和掌握C语言这门课程的知识点,能够熟练的调用各种函数,把各种C语句有机的结合起来,提高自己C语言程序设计的能力,为今后解决实际问题打下良好基础。2.设计方案论证2.1设计思路建立一个函数,用来添加、显示、删除、查询通讯录等信息,完成通讯录的功能。主函数可以调用六个子函数,分别完成添加记录、显示记录、删除记录、查询记录、退出系统等功能。在主函数中可以以1、2、3、4、0数字键分别可以执行某个功能模块。退出程序删除记录查询记录显示退出程序删除记录查询记录显示记录添加记录通讯录管理系统 2.2程序设计2.2.1根据图1定义数据类型建立函数typedefstruct { charscore;/*编号*/ charname[10];/*姓名*/ charnum[15];/*号码*/ charemail[20]; /*邮箱*/ charage[8]; /*年龄*/ charadds[20]; /*住址*/ }Person;2.2.2主函数及其流程图Y定义主函数main()和一系列的功能函数,只有通过这些函数才可实现程序的功能。每次使用都会调用主函数。主函数主要是利用switch语句对数据进行处理,流程图如下:Y添加记录选择1开始N选择2YYYYNNNN退出系统查询记录删除记录显示记录选择0选择4选择3添加记录选择1开始N选择2YYYYNNNN退出系统查询记录删除记录显示记录选择0选择4选择3结束结束2.2.3增加函数及其流程图.添加通讯录记录流程图:.显示通讯录记录流程图:.删除通讯录记录流程图:.查询通讯录记录流程图:2.3源程序#include<stdio.h>#include<stdlib.h>#include<string.h>typedefstruct { charscore;/*编号*/ charname[10];/*姓名*/ charnum[15];/*号码*/ charemail[20]; /*邮箱*/ charage[8]; /*年龄*/ charadds[20]; /*住址*/ }Person;Personpe[80];intmenu_select() { charc; do{ system("cls"); printf("\t\t*****通讯录*****\n"); printf("\t\t┌───────┐\n"); printf("\t\t│1.添加记录│\n"); printf("\t\t│2.显示记录│\n"); printf("\t\t│3.删除记录│\n"); printf("\t\t│4.查询记录│\n"); printf("\t\t│0.退出程序│\n"); printf("\t\t└───────┘\n"); printf("\t\t请您选择(0-4):"); c=getchar(); }while(c<'0'||c>'4'); return(c-'0'); }intInput(Personper[],intn){ inti=0; charsign,x[10]; while(sign!='n'&&sign!='N') { printf("\t编号:"); scanf("\t%d",&per[n+i].score); printf("\t姓名:"); scanf("\t%s",per[n+i].name); printf("\t年龄:"); scanf("\t%s",per[n+i].age); printf("\t电话号码:"); scanf("\t%s",per[n+i].num); printf("\t通讯住址:"); scanf("\t%s",per[n+i].adds); printf("\t电子邮箱:"); scanf("\t%s",per[n+i].email); gets(x); printf("\n\t是否继续添加?(Y/N)"); scanf("\t%c",&sign); i++; } return(n+i);}voidDisplay(Personper[],intn){ inti; printf("\n");/*格式*/ printf("编号姓名年龄电话号码通讯地址电子邮箱\n"); printf("\n"); for(i=1;i<n+1;i++) { printf("%-5d%-8s%-6s%-13s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].adds,per[i-1].email); if(i>1&&i%10==0) { printf("\t\n"); printf("\t"); system("pause"); printf("\t\n"); } } printf("\n"); system("pause");}intDelete_a_record(Personper[],intn){ chars[20]; inti=0,j; printf("\t请输入想删除记录中的名字:"); scanf("%s",s); while(strcmp(per[i].name,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return(n); } for(j=i;j<n-1;j++) { strcpy(per[j].num,per[j+1].num); strcpy(per[j].name,per[j+1].name); strcpy(per[j].age,per[j+1].age); strcpy(per[j].adds,per[j+1].adds); strcpy(per[j].email,per[j+1].email); per[j].score=per[j+1].score; } printf("\t\t\t已经成功删除!\n"); return(n-1);}voidQuery_a_record(Personper[],intn){ intm; printf("\t\n请选择查询方式:\n");printf("\t┌──────┐\n");printf("\t│1姓名│\n");printf("\t│2电话│\n");printf("\t│3地址│\n");printf("\t│4返回│\n");printf("\t└──────┘\n");printf("请选择:");scanf("%d",&m);while(m!=1&&m!=2&&m!=3&&m!=4){ printf("输入错误,请重新选择:"); scanf("%d",&m); } if(m==1) { chars[20]; inti=0; printf("\t请输入想查询的姓名:"); scanf("\t%s",s); while(strcmp(per[i].name,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t此人编号:%d\n",per[i].score); printf("\t此人年龄:%s\n",per[i].age); printf("\t电话号码:%s\n",per[i].num); printf("\t通讯地址:%s\n",per[i].adds); printf("\t电子邮箱:%s\n",per[i].email); }; if(m==2) { chars[20]; inti=0; printf("\t请输入想查询的电话:"); scanf("\t%s",s); while(strcmp(per[i].num,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t此人编号:%d\n",per[i].score); printf("\t此人姓名:%s\n",per[i].name); printf("\t此人年龄:%s\n",per[i].age); printf("\t通讯地址:%s\n",per[i].adds); printf("\t电子邮箱:%s\n",per[i].email); }; if(m==3) { chars[20]; inti=0; printf("\t请输入想查询的地址:"); scanf("\t%s",s); while(strcmp(per[i].adds,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t此人编号:%d\n",per[i].score); printf("\t此人姓名:%s\n",per[i].name); printf("\t此人年龄:%s\n",per[i].age); printf("\t电话号码:%s\n",per[i].num); printf("\t电子邮箱:%s\n",per[i].email); };}voidChange(Personper[],intn){ chars[20]; inti=0; printf("\t请输入想修改的记录中的名字:"); scanf("%s",s); while(strcmp(per[i].name,s)!=0&&i<n)i++; if(i==n) { printf("\t通讯录中没有此人!\n"); return; } printf("\t编号:"); scanf("\t%d",&per[i].score); printf("\t姓名:"); scanf("\t%s",per[i].name); printf("\t年龄:"); scanf("\t%s",per[i].age); printf("\t电话号码:"); scanf("\t%s",per[i].num); printf("\t通讯住址:"); scanf("\t%s",per[i].adds); printf("\t电子邮箱:"); scanf("\t%s",per[i].email); printf("\t修改成功!");}voidWritetoText(Personper[],intn){ inti=0; FILE*fp;/*定义文件指针*/ charfilename[20];/*定义文件名*/ printf("\t保存到文件\n");/*输入文件名*/ printf("\t请输入所保存的文件名:"); scanf("\t%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("\t无法打开文件\n"); system("pause"); return; } fprintf(fp,"******************************************通讯录******************************************\n"); fprintf(fp,"编号姓名年龄电话号码通讯地址电子邮箱\n"); fprintf(fp,"\n"); while(i<n) { fprintf(fp,"%-3d\t%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",per[i].score,per[i].name,per[i].age,per[i].num,per[i].adds,per[i].email); i++; } fprintf(fp,"\n"); fprintf(fp,"***************************************共有%d条记录****************************************\n",n); fclose(fp);/*关闭文件*/ printf("保存成功!\n");}voidmain(){ intn=0; for(;;) { switch(menu_select()) { case1: printf("\n\t添加记录到通讯录\n"); n=Input(pe,n); break; case2: printf("\n\t\t\t通讯录记录表\n"); Display(pe,n); break; case3: printf("\n\t从通讯录中删除记录\n"); n=Delete_a_record(pe,n); printf("\t"); system("pause"); break; case4: printf("\n\t在通讯录中查找记录\n"); Query_a_record(pe,n); printf("\t"); system("pause"); break; case0: printf("\n\t\t谢谢使用,再见!\n"); printf("\n\t\t"); system("pause"); exit(0); } }}3.设计结果与分析3.1运行程序将源程序编译、链接后生成可执行文件,运行该文件会看到如图所示界面。运行主函数时,首先调用函数menu();,该函数主要是利用输

温馨提示

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

评论

0/150

提交评论