单片机电阻表的设计说明书_第1页
单片机电阻表的设计说明书_第2页
单片机电阻表的设计说明书_第3页
单片机电阻表的设计说明书_第4页
单片机电阻表的设计说明书_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

.z目录设计内容和要求2系统总体构造32.1、系统总体设计32.2、主控局部的选择4最小系统6硬件设计64.1总体设计框图64.2电压测量的设计74.3模数ADC转换的设计74.4液晶显示电路的设计8输入、输出局部9软件设计106.1主控程序流程106.2软件仿真11实物制作与仿真12总结13参考文献14附录1原件清单15附录2原理图16附录3程序17附录4实物图31设计内容和要求随着现代科技的飞速开展,生产生活中人们对工具的要约越来越高。其中我日常所使用的电阻表的精度和性能也要求越来越高。并且电阻表完全可以通过现代科技来实现智能化,智能化即不需要人工来调节档位,测量不同阻值的电阻时,可以自动更换档位。并且同时显示出阻值和量程。这次课程设计我的课题就是基于单片机芯片STC89C52设计一个三档位的电阻表,第一档位:1-100欧,第二档:1-5k欧,第三档:1-10k欧。电阻表能自动转换量程,测量结果使用LCD显示,误差小于5%。设计内容包括:1、单片机最小系统2、模数转换3、电阻电压转换4、显示测得的电阻阻值设计原理为通过伏安法测出电阻的阻值,经过模数转换,将测得的阻值显示到LCD上。第二章系统总体构造2.1系统总体设计系统共分为四个局部:电阻电压转换、模数转换器、单片机、LCD显示。2.2主控局部的选择进展深入的分析和思考,将本次设计系统分为一下几个局部:A/D转换电路、被测电阻、单片机系统、显示电路、电机控制电位器电路。电源电路电源电路档位选择电路档位电路显示电路控制电路被测电阻A/D转换电路自动测量电阻表系统框图电阻的测量电路:电阻—电压转换测量法,采用R/U转换器将被测电阻转换成电压,经转换后得到的直流电压经A/D转换器转换为数字信号,由单片机控制输出显示被测电阻值到LCD。电机控制电位器电路:采用继电器作为档位开关控制,继电器是一种电控制器件。它具有控制系统〔又称输入回路〕和被控制系统〔又称输出回路〕之间的互动关系。通常应用于自动化的控制电路中,它实际上是用小电流去控制大电流的一种“自动开关〞。故在电路中起着自动调节、平安保护、转换电路等作用。采用2个继电器分别控制不同电阻测试档位。控制系统由单片机系统控制。A/D转换器:选用ADC0832;ADC0832芯片是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢送,其目前已经有很高的普及率。其具有以下特点:·双通道A/D转换;·输入输出电平与TTL/CMOS相兼容;·5V电源供电时输入电压在0~5V之间;·工作频率为250KHZ,转换时间为32μS;·一般功耗仅为15mW;·8P、14P—DIP〔双列直插〕、PICC多种封装;·商用级芯片温宽为0°Cto+70°C,工业级芯片温宽为−芯片接口说明:·CS_片选使能,低电平芯片使能。·CH0模拟输入通道0,或作为IN+/-使用。·CH1模拟输入通道1,或作为IN+/-使用。·GND芯片参考0电位〔地〕。·DI数据信号输入,选择通道控制。·DO数据信号输出,转换数据输出。·CLK芯片时钟输入。·Vcc/REF电源输入及参考电压输入〔复用〕。ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI数据输入端,可以轻易的实现通道功能的选择。单片机:AT89C52;显示器:选用LCD1602。工业字符型液晶,能够同时显示16*02即32个字符。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由假设干个5*7或者5*11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。特性:3.3V或5V工作电压,比照度可调;内含复位电路;提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;有80字节显示数据存储器DDRAM;内建有192个5*7点阵的字型的字符发生器CGROM;8个可由用户自定义的5*7的字符发生器CGRAM;微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。操作控制。第三章最小系统由STC89C52,复位电路,时钟产生电路组成。其原理图如下:最小系统电路原理图硬件设计本系统是一个简单的单回路控制系统。为了实现对电阻的准确测量和测量档位自动切换,本系统采用了AT89C52单片机作为系统的控制中心,在测试电阻阻值时,有信号测试端将所测信号送入A/D转换器ADC0832,经A/D转换后将数据送入单片机进展数据处理,实时将所测电阻阻值经液晶显示模块显示。在进展档位切换时。由单片机控制的继电器构成档位开关,对档位进展正确切换。总体设计框图如图ATAT89C52〔CPU〕阻值信号采集数据显示A/D转换分频电路电源电路档位切换总体设计框图4.2电压测量的设计如图2所示为被测电阻电压测量。电压经过电阻R1和被测电阻R*接到地。通过OUT输出被测电阻R*上的电压。送到ADC0832的CH0口。图3被测电阻电压测量图4.3模数ADC转换的设计由电压测量得到的电压经过ADC模数转换可得到8位的电压值,经过欧姆定律〔即电压之比等于电阻之比〕可得到被测电阻的阻值的大小。公式如下QUOTE错误!未找到引用源。本设计用到的R1的阻值为200Ω、20kΩ和200kΩ。 由被测电阻得到的电压值经ADC0832的2脚CH0输入,经过内部的AD转换,在DO6输出数字电压量,经过上述公式的转变,在P1.1口上的显示的数字量为被测电阻的阻值数字量。如图3所示为被测电阻电压量转换为阻值量。P1.1P1.1P1.1OUTCH0ADC0832P1.1OUTCH0ADC0832DO被测电阻电压量转换为阻值量图4.4液晶显示电路的设计经过ADC0832模数转换得到的电阻值数字量,在MCU的P1.1口输入,MCU系统处理后在P0口由LCD1602显示出来该被测电阻的阻值。如图4所示为被测电阻阻值显示。P0P0单片机P1.1D0~D7LCD1602OUT被测电阻阻值显示图第5章输入、输出局部电阻表主控制局部电源需要用5V直流电源供电,把频率为50Hz、有效值为220V的单相交流电压转换为幅值稳定的5V直流电压。其主要原理是把单相电经过电源变压器、整流电路、滤波电路、稳压电路转换成稳定的直流电压。由于输入电压为电网电压,一般情况下所需直流电压的数值和电网电压的有效值相差较大,因而电源变压器的作用显现出来起到降压作用。降压后还是交流电压,所以需要整流电路把交流电压转换成直流电压。由于经整流电路整流后的电压含有较大的交流分量,会影响到负载电路的正常工作。需通过低通滤波电路滤波,使输出电压平滑。稳压电路的功能是使输出直流电压根本不受电网电压波动和负载电阻变化的影响,从而获得稳定性足够高的直流压。本电路使用充电器解决电源稳压问题。我们使用的是经过特殊加工过的电路板,在板的内部已经将整流、变压的线路连好了。各原件所用的5V直流电源在电路板内部连成了几条线路,使用起来很方便。电阻输入则是通过将不同阻值的电阻接在表的两端,阻值*围是1-10K欧姆。当接入时电阻表的液晶显示屏上会自动显示出当前所接入的电阻的阻值和量程〔档位〕。当所接电阻超出量程时,LCD显示ERROR。时序参数表时序参数符号极限值单位测试条件最小值典型值最大值E信号周期tc400ns引脚EE脉冲宽度tpw,tF150nsE上升/下降沿时间tR25ns地址建立时间tsp130ns引脚E、RS、R/W地址保持时间tHD110ns数据建立时间〔读操作〕tD100ns引脚DB0~DB7数据保持时间〔读操作〕tHD220ns数据建立时间〔写操作〕tsp240ns数据保持时间〔写操作〕tHD210ns第六章软件设计6.1主控程序流程程序机构主要包括:主控程序模块、LCD1602液晶显示程序、阻值数据显示处理子程序、标志符号显示子程序、延时子程序等几个局部组成。主控程序流程图:开场开场设定初始化获取IntInt<1100Int>100100P16=0;P17=1;Data=200从新获取IntP16=0;P17=1;Data=200从新获取IntP16=0;P17=1;Data=200从新获取Int显示Int值6.2软件仿真本设计通过利用Proteus仿真,将所编写的程序用Keil软件编译,所仿真原理图见第七章。在实验调试过程中每个测量量程档选用2个电阻进展测量,下表就是我们测试的实际电阻值和测量电阻值数据,以及测量误差。量程档实际电阻值仿真测量电阻值误差1K7.3Ω7Ω-4.10%15.2Ω15Ω-1.31%52.7Ω53Ω0.57%200Ω201Ω0.5%500Ω508Ω1.6%750Ω762Ω1.6%900Ω908Ω0.89%950Ω953Ω1.4%5K1.5KΩ1518Ω1.2%2KΩ2016Ω2.46%2.5KΩ2481Ω-3.1%3kΩ2940Ω-2%3.5KΩ3509Ω0.76%4KΩ4019Ω0.61%4.3kΩ4283Ω-3.36%4.5KΩ4518Ω1.23%10k5KΩ5012Ω0.81%5.5kΩ5561Ω0.92%6KΩ6022Ω0.28%6.5KΩ6478Ω-1.84%7KΩ6983Ω-1.62%8kΩ7903Ω-3.3%9.5kΩ9679Ω6%在调试时发现当所测电阻阻值接近量程时测得的值不够准确。第7章实物制作与仿真正面图与反面图未开启时的电路测量电阻时的仿真图总结我设计的自动测量电阻表能够完成根本局部和局部发挥局部的要求,即能够完成测量量程为1kΩ、5kΩ、10kΩ三档,测量准确度为±5%;能自动显示单位,这三档量程具有自动量程转换功能。这个基于单片机设计的电阻表具有智能化的功能如果投入生产可以增加量程以便于使用。这种电阻表本钱低且实用性、可操作性都很强。通过本次课设,我知道了怎么去买器材,不仅仅要知道自己所需要的器材名称还要知道型号。遇到问题我们要学会通过另一种途径解决问题,比方本次课设,我使用的是ADC0832芯片而在电子市场的时候拿到的却是DAC0832,这与卖家的粗心有关,但是根本问题还在我自身,没有看清元器件的型号。下次做每一次失败都是下次成功的根底。感谢学校给我们这次时机,锻炼了我们的动手能力及运用专业软件的能力。通过这次课设让我明白了理论和实际操作之间差距,而且也让我很明确得意识到自己在数电上有很多的知识漏洞,以后应该多钻研一下。这次课程设计我主要负责文论撰写,在写论文过程中积极和同组同学探讨电梯的根本原理,每个模块的功能及如何实现。对Office套件的使用更熟悉,为以后毕业论文的撰写奠定了一定根底。最后再次感谢这次课程设计。参考文献【1】陈舜青?C语言程序设计?**大学【2】*齐朱**?单片机应用系统设计技术?第五版电子工业【3】王敬栋?单片机C语言应用100例?电子工业【4】李群芳?单片机原理接口与应用?:清华大学附录1元器件清单:STC89C52*12、LCD1602*13、电路板*14、排阻〔10k〕*15、12M晶振*1电位器*140脚管座*18脚管座*1自锁开关*1复位开关*1整流桥*130pf瓷片电容*2排针假设干排座假设干转换开关*3各个阻值电阻假设干排线假设干总计本钱80元附录2原理图附录3主程序:*include<reg52.h>*include<LCD1602.h>*include<ADC0832.h>voidget_liangcheng(void);voidhandle_code(void);voiddis_code(void);voiddis_dw_lc(void);unsignedcharcodemes1[]={"Resistors:"};unsignedcharcodedigit[]={"0123456789"};unsignedcharcodemes[]={"2001K5K10K"};unsignedcharres[5],temp_0=0,temp_1=0;unsignedchart=0,sign=7;unsignedintR=0;unsignedcharDIY_1602[]={/*--电阻符号--*/0*00,0*00,0*0E,0*11,0*11,0*0A,0*1B,0*00};/**************函数功能:延时假设干毫秒*****************/voiddelaynms(unsignedcharn){unsignedchari,j,k;delaynms(100); for(i=0;i<n;i++) for(j=0;j<10;j++) for(k=0;k<33;k++);}/*************主函数*******************/voidmain(void){ unsignedcharj,T1=0,T2=0,k=1; delaynmsInit_LCD1602(); Write_DIY1602(DIY_1602);WriteAdd_1602(0*00); j=0; while(mes1[j]!='\0') WriteData_1602(mes1[j++]);while(1) { get_liangcheng(); handle_code();//处理AD读取到的数据 dis_code(); //显示四位数字和一个小数点 dis_dw_lc(); //显示电阻单位和量程。 delaynms(1000); }}voidget_liangcheng(void)//判断用哪一个量程 { unsignedchari; for(i=0;i<5;i++) { P3=(P3&0*f0)+i; delaynms(50); temp_0=GetAD_code(0); sign=7; switch(i) { case0: if((0*05<temp_0)&&(temp_0<=0*4f)) //200 sign=0; break;//中断switch; case1: if((0*20<temp_0)&&(temp_0<=0*99)) //500 sign=1; break; case2: if((0*30<temp_0)&&(temp_0<=0*a9)) //1k sign=2; break; case3: if((0*2b<temp_0)&&(temp_0<=0*b0))//5K sign=3; break; case4: if((0*2b<temp_0)&&(temp_0<0*b0))//10k sign=4; break; } if(sign!=7) //中断for循环 break;}}/*************处理AD读出的数*******************/voidhandle_code(void) //处理AD读出的数{ unsignedchari; P3=(P3&0*f0)+sign; delaynms(50); temp_0=GetAD_code(0); //AD读取电压, temp_1=GetAD_code(1); R=((100*temp_0)/(255-temp_1))*10; //转换成电阻,for(i=0;i<4;i++) //把处理后的前四位数放进数组 { res[3-i]=R%10; R=R/10; }}/*************显示读数和小数点*******************/voiddis_code(void) //显示读数和小数点{ unsignedcharpoint=10,i; if(sign==0||sign==3)//判断各量程的小数点放在第几位 point=3; else if(sign==1||sign==4) point=1; else { if(sign==2) point=2; } WriteAdd_1602(0*40); //显示四个数学和一个小数点 for(i=0;i<4;i++) { if(i==point) WriteData_1602('.'); WriteData_1602(digit[res[i]]); }}/*************显示单位和量程*******************/voiddis_dw_lc(void){unsignedchari; WriteAdd_1602(0*46); //去除上次显示的单位和量程。for(i=0;i<10;i++) WriteData_1602(0*20);switch(sign){ case0: //sign=0.200档显示(o) WriteAdd_1602(0*46); WriteData_1602(0*00); WriteData_1602('/'); WriteData_1602('('); WriteData_1602('2'); WriteData_1602('0'); WriteData_1602('0'); WriteData_1602(0*00); WriteData_1602(')');break; case1: case2: case3: //2K/20K/200/档显示单位(Ko) WriteAdd_1602(0*46); WriteData_1602('k'); WriteData_1602(0*00); if(sign==1) { WriteData_1602('/'); WriteData_1602('('); WriteData_1602('2'); WriteData_1602('k'); WriteData_1602(0*00); WriteData_1602(')'); } else { if(sign==2) { WriteData_1602('/'); WriteData_1602('('); WriteData_1602('2'); WriteData_1602('0'); WriteData_1602('k'); WriteData_1602(0*00); WriteData_1602(')'); } else { WriteData_1602('/'); WriteData_1602('('); WriteData_1602('2'); WriteData_1602('0'); WriteData_1602('0'); WriteData_1602('k'); WriteData_1602(0*00); WriteData_1602(')'); } } break; case4: //10k档位,显示单位〔ko〕 WriteAdd_1602(0*46); WriteData_1602('k'); WriteData_1602(0*00); WriteData_1602('/'); WriteData_1602('10'); WriteData_1602('k'); WriteData_1602(0*00); break;}}ADC0832子程序:*include"ADC0832.h"unsignedcharGetAD_code(unsignedchar*)//*=0,选通通道0,反之选通1通道。{unsignedchari,dat;CS0832=1;//一个转换周期开场CLK0832=0;//为第一个脉冲作准备CS0832=0;//CS置0,片选有效DIO0832=1;//DIO置1,规定的起始信号CLK0832=1;//第一个脉冲CLK0832=0;//第一个脉冲的下降沿,此前DIO必须是高电平DIO0832=1;//DIO置1,通道选择信号CLK0832=1;//第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0CLK0832=0;//第二个脉冲下降沿DIO0832=*;//DI置*,选择通道*CLK0832=1;//第三个脉冲CLK0832=0;//第三个脉冲下降沿DIO0832=1;//第三个脉冲下沉之后,输入端DIO失去作用,应置1CLK0832=1;//第四个脉冲for(i=0;i<8;i++)//高位在前{CLK0832=1;//第四个脉冲CLK0832=0;dat<<=1;//将下面储存的低位数据向右移 dat|=(unsignedchar)DIO0832; //将输出数据DIO通过或运算储存在dat最低位} CS0832=1;//片选无效 returndat; //将读书的数据返回}LCD1602子程序://*******************************************************//*defineLCD1602_GLOBALS*include"LCD1602.h"/*****************************************************函数功能:延时假设干毫秒入口参数:n***************************************************/voidLCD1602_delay(unsignedcharn){unsignedcharii,i,j; for(ii=0;ii<n;ii++) { for(i=0;i<10;i++) for(j=0;j<33;j++); }}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙***************************************************/unsignedcharBusyTest(void){bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读写_nop_();//空操作_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反响时间 result=BF;//将忙碌标志电平赋给resultE=0;//将E恢复低电平returnresult;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/voidWriteCmd_1602(unsignedchardictate){while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反响时间 LCD1602_Port=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反响时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反响时间 E=0;//当E由高电平跳变成低电平时,液晶模块开场执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:****************************************************/voidWriteAdd_1602(unsignedchar*){WriteCmd_1602(*|0*80);//显示位置确实定方法规定为"80H+地址码*"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/voidWriteData_1602(unsignedchary){while(BusyTest()==1); RS=1;

温馨提示

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

评论

0/150

提交评论