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

下载本文档

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

文档简介

单片机课程设计说明书目录1、 设计内容和要求.22、 系统总体结构.3 2.1、系统总体设计.3 2.2、主控部分的选择.43、 最小系统.64、 硬件设计.641 总体设计框图.642 电压测量的设计.74.3 模数ADC转换的设计.7 4.4 液晶显示电路的设计.85、 输入、输出部分.96、 软件设计.10 6.1主控程序流程.10 6.2软件仿真.117、 实物制作与仿真.128、 总结.139、 参考文献.14附录1 原件清单.15附录2 原理图.16附录3 程序.17附录4 实物图.31第1章 设计内容和要求 随着现代科技的飞速发展,生产生活中人们对工具的要约越来越高。其中我日常所使用的电阻表的精度和性能也要求越来越高。并且电阻表完全可以通过现代科技来实现智能化,智能化即不需要人工来调节档位,测量不同阻值的电阻时,可以自动更换档位。并且同时显示出阻值和量程。这次课程设计我的课题就是基于单片机芯片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电源供电时输入电压在05V之间; 工作频率为250KHZ,转换时间为32S; 一般功耗仅为15mW; 8P、14PDIP(双列直插)、PICC 多种封装; 商用级芯片温宽为0C to +70C,工业级芯片温宽为40C to +85C;芯片接口说明: CS_片选使能,低电平芯片使能。CH0 模拟输入通道0,或作为IN+/-使用。 CH1 模拟输入通道1,或作为IN+/-使用。 GND 芯片参考0 电位(地)。 DI 数据信号输入,选择通道控制。 DO 数据信号输出,转换数据输出。 CLK 芯片时钟输入。 Vcc/REF 电源输入及参考电压输入(复用)。 ADC0832 为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在05V之间。芯片转换时间仅为32S,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。单片机:AT89C52;显示器:选用LCD1602。工业字符型液晶,能够同时显示16x02即32个字符。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。特性:3.3V或5V工作电压,对比度可调;内含复位电路;提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能;有80字节显示数据存储器DDRAM;内建有192个5X7点阵的字型的字符发生器CGROM;8个可由用户自定义的5X7的字符发生器CGRAM;微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。操作控制。第三章最小系统由STC89C52,复位电路,时钟产生电路组成。其原理图如下: 最小系统电路原理图第4章 硬件设计本系统是一个简单的单回路控制系统。为了实现对电阻的精确测量和测量档位自动切换,本系统采用了AT89C52单片机作为系统的控制中心,在测试电阻阻值时,有信号测试端将所测信号送入A/D转换器ADC0832,经A/D转换后将数据送入单片机进行数据处理,实时将所测电阻阻值经液晶显示模块显示。在进行档位切换时。由单片机控制的继电器构成档位开关,对档位进行正确切换。总体设计框图如图AT89C52(CPU)阻值信号采集数据显示A/D转换分频电路电源电路档位切换总体设计框图42 电压测量的设计 如图2所示为被测电阻电压测量。电压经过已知电阻R1和被测电阻Rx接到地。通过OUT输出被测电阻Rx上的电压。送到ADC0832的CH0口。图3 被测电阻电压测量图4.3 模数ADC转换的设计由电压测量得到的电压经过ADC模数转换可得到8位的电压值,经过欧姆定律(即电压之比等于电阻之比)可得到被测电阻的阻值的大小。公式如下错误!未找到引用源。本设计用到的R1的阻值为200、20k和200k。由被测电阻得到的电压值经ADC0832的2脚CH0输入,经过内部的AD转换,在DO 6输出数字电压量,经过上述公式的转变,在P1.1口上的显示的数字量为被测电阻的阻值数字量。如图3所示为被测电阻电压量转换为阻值量。P1.1P1.1OUTCH0 ADC0832 DO 被测电阻电压量转换为阻值量图4.4 液晶显示电路的设计经过ADC0832模数转换得到的电阻值数字量,在MCU的P1.1口输入,MCU系统处理后在P0口由LCD1602显示出来该被测电阻的阻值。如图4所示为被测电阻阻值显示。 P0 单片机P1.1D0D7 LCD1602OUT 被测电阻阻值显示图第5章 输入、输出部分电阻表主控制部分电源需要用5V直流电源供电,把频率为50Hz、有效值为220V的单相交流电压转换为幅值稳定的5V直流电压。其主要原理是把单相电经过电源变压器、整流电路、滤波电路、稳压电路转换成稳定的直流电压。由于输入电压为电网电压,一般情况下所需直流电压的数值和电网电压的有效值相差较大,因而电源变压器的作用显现出来起到降压作用。降压后还是交流电压,所以需要整流电路把交流电压转换成直流电压。由于经整流电路整流后的电压含有较大的交流分量,会影响到负载电路的正常工作。需通过低通滤波电路滤波,使输出电压平滑。稳压电路的功能是使输出直流电压基本不受电网电压波动和负载电阻变化的影响,从而获得稳定性足够高的直流压。本电路使用充电器解决电源稳压问题。我们使用的是经过特殊加工过的电路板,在板的内部已经将整流、变压的线路连好了。各原件所用的5V直流电源在电路板内部连成了几条线路,使用起来很方便。电阻输入则是通过将不同阻值的电阻接在表的两端,阻值范围是1-10K欧姆。当接入时电阻表的液晶显示屏上会自动显示出当前所接入的电阻的阻值和量程(档位)。当所接电阻超出量程时,LCD显示ERROR。时序参数表时序参数符号极限值单位测试条件最小值典型值最大值E信号周期tc400-ns引脚EE脉冲宽度tpw ,tF150-nsE上升/下降沿时间tR-25ns地址建立时间tsp130-ns引脚E、RS、R/W地址保持时间tHD110-ns数据建立时间(读操作)tD-100ns引脚DB0DB7数据保持时间(读操作)tHD220-ns数据建立时间(写操作)tsp240-ns数据保持时间(写操作)tHD210-ns第六章 软件设计6.1主控程序流程 程序机构主要包括:主控程序模块、LCD1602液晶显示程序、阻值数据显示处理子程序、标志符号显示子程序、延时子程序等几个部分组成。主控程序流程图:开始设定初始化获取IntInt100100P16=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.37-4.10%15.215-1.31%52.7530.57%2002010.5%5005081.6%7507621.6%9009080.89%9509531.4%5K1.5K15181.2%2K20162.46%2.5K2481-3.1%3k2940-2%3.5K35090.76%4K40190.61%4.3k4283-3.36%4.5K45181.23%10k5K50120.81%5.5k55610.92%6K60220.28%6.5K6478-1.84% 7K6983-1.62%8k7903-3.3%9.5k96796%在调试时发现当所测电阻阻值接近量程时测得的值不够精确。第7章 实物制作与仿真正面图与反面图 未开启时的电路测量电阻时的仿真图总结我设计的自动测量电阻表能够完成基本部分和部分发挥部分的要求,即能够完成测量量程为 1k、5k、10k三档,测量准确度为5%;能自动显示单位,这三档量程具有自动量程转换功能。这个基于单片机设计的电阻表具有智能化的功能如果投入生产可以增加量程以便于使用。这种电阻表成本低且实用性、可操作性都很强。 通过本次课设,我知道了怎么去买器材,不仅仅要知道自己所需要的器材名称还要知道型号。遇到问题我们要学会通过另一种途径解决问题,比如本次课设,我使用的是ADC0832芯片而在电子市场的时候拿到的却是DAC0832,这与卖家的粗心有关,但是根本问题还在我自身,没有看清元器件的型号。下次做每一次失败都是下次成功的基础。感谢学校给我们这次机会,锻炼了我们的动手能力及运用专业软件的能力。通过这次课设让我明白了理论和实际操作之间差距,而且也让我很明确得意识到自己在数电上有很多的知识漏洞,以后应该多钻研一下。这次课程设计我主要负责文论撰写,在写论文过程中积极和同组同学探讨电梯的基本原理,每个模块的功能及如何实现。对Office套件的使用更熟悉,为以后毕业论文的撰写奠定了一定基础。最后再次感谢这次课程设计。参考文献【1】 陈舜青 C语言程序设计 南京大学出版社 【2】 张齐 朱西宁 单片机应用系统设计技术 第五版 电子工业出版社 【3】 王敬栋 单片机C语言应用100例 电子工业出版社【4】 李群芳 单片机原理接口与应用 北京:清华大学出版社附录1元器件清单:1、 STC89C52 X 12、LCD1602 X 13、电路板X14、排阻(10k)X15、12M晶振X16、 电位器X17、 40脚管座X18、 8脚管座X19、 自锁开关X110、 复位开关X111、 整流桥X112、 30pf瓷片电容X213、 排针若干14、 排座若干15、 转换开关X316、 各个阻值电阻若干17、 排线若干总计成本 80元附录2 原理图附录3主程序:#include#include#includevoid get_liangcheng(void);void handle_code(void);void dis_code(void);void dis_dw_lc(void);unsigned char code mes1=Resistors:;unsigned char code digit=0123456789;unsigned char code mes=2001K5K10K;unsigned char res5,temp_0=0,temp_1=0;unsigned char t=0,sign=7;unsigned int R=0;unsigned char DIY_1602=/*- 电阻符号 -*/0x00,0x00,0x0E,0x11,0x11,0x0A,0x1B,0x00;/*函数功能:延时若干毫秒 */ void delaynms(unsigned char n) unsigned char i,j,k;delaynms(100);for(i=0;in;i+) for(j=0;j10;j+) for(k=0;k33;k+); /*主函数*/ void main(void) unsigned char j,T1=0,T2=0,k=1; delaynms Init_LCD1602(); Write_DIY1602(DIY_1602); WriteAdd_1602(0x00); j=0; while(mes1j!=0) WriteData_1602(mes1j+);while(1) get_liangcheng(); handle_code();/处理AD读取到的数据 dis_code();/显示四位数字和一个小数点 dis_dw_lc(); /显示电阻单位和量程。 delaynms(1000); void get_liangcheng(void) /判断用哪一个量程 unsigned char i;for(i=0;i5;i+) P3=(P3&0xf0)+i;delaynms(50);temp_0=GetAD_code(0);sign=7;switch(i)case 0:if(0x05temp_0)&(temp_0=0x4f)/200 sign=0;break; /中断switch;case 1:if(0x20temp_0)&(temp_0=0x99)/500 sign=1;break;case 2:if(0x30temp_0)&(temp_0=0xa9)/1k sign=2;break;case 3:if(0x2btemp_0)&(temp_0=0xb0) /5K sign=3;break;case 4:if(0x2btemp_0)&(temp_00xb0) /10k sign=4;break; if(sign!=7)/中断for循环 break; /*处理AD读出的数*/ void handle_code(void) /处理AD读出的数unsigned char i;P3=(P3&0xf0)+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;i4;i+) /把处理后的前四位数放进数组 res3-i=R%10;R=R/10;/*显示读数和小数点*/void dis_code(void)/显示读数和小数点unsigned char point=10,i;if(sign=0|sign=3)/判断各量程的小数点放在第几位point=3;elseif(sign=1|sign=4)point=1;elseif(sign=2)point=2;WriteAdd_1602(0x40); /显示四个数学和一个小数点for(i=0;i4;i+)if(i=point)WriteData_1602(.);WriteData_1602(digitresi);/*显示单位和量程*/void dis_dw_lc(void) unsigned char i; WriteAdd_1602(0x46); /清除上次显示的单位和量程。 for(i=0;i10;i+) WriteData_1602(0x20);switch(sign) case 0: /sign=0.200档 显示(o)WriteAdd_1602(0x46);WriteData_1602(0x00);WriteData_1602(/);WriteData_1602();WriteData_1602(2);WriteData_1602(0);WriteData_1602(0);WriteData_1602(0x00);WriteData_1602();break;case 1:case 2:case 3: /2K/20K/200/档显示单位(Ko)WriteAdd_1602(0x46);WriteData_1602(k);WriteData_1602(0x00);if(sign=1)WriteData_1602(/);WriteData_1602();WriteData_1602(2);WriteData_1602(k);WriteData_1602(0x00);WriteData_1602();elseif(sign=2)WriteData_1602(/);WriteData_1602();WriteData_1602(2);WriteData_1602(0);WriteData_1602(k);WriteData_1602(0x00);WriteData_1602();elseWriteData_1602(/);WriteData_1602();WriteData_1602(2);WriteData_1602(0);WriteData_1602(0);WriteData_1602(k);WriteData_1602(0x00);WriteData_1602();break;case 4: /10k档位,显示单位(ko)WriteAdd_1602(0x46);WriteData_1602(k);WriteData_1602(0x00);WriteData_1602(/);WriteData_1602(10);WriteData_1602(k);WriteData_1602(0x00);break; ADC0832子程序:#include ADC0832.hunsigned char GetAD_code(unsigned char x) /x=0,选通通道0,反之选通1通道。 unsigned char i,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必须跟别输入两位数据用于选择通道,这里选通道CH0 CLK0832=0; /第二个脉冲下降沿 DIO0832=x; /DI置x,选择通道x CLK0832=1; /第三个脉冲 CLK0832=0; /第三个脉冲下降沿 DIO0832=1; /第三个脉冲下沉之后,输入端DIO失去作用,应置1 CLK0832=1; /第四个脉冲for(i=0;i8;i+) /高位在前 CLK0832=1; /第四个脉冲 CLK0832=0; dat=1; /将下面储存的低位数据向右移dat|=(unsigned char)DIO0832; /将输出数据DIO通过或运算储存在dat最低位 CS0832=1; /片选无效 return dat; /将读书的数据返回 LCD1602子程序:/*/#define LCD1602_GLOBALS#include LCD1602.h/*函数功能:延时若干毫秒入口参数:n*/ void LCD1602_delay(unsigned char n) unsigned char ii,i,j;for(ii=0;iin;ii+) for(i=0;i10;i+) for(j=0;j33;j+); /*函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙*/ unsigned char BusyTest(void) bit result;RS=0; /根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; /E=1,才允许读写 _nop_(); /空操作 _nop_(); _nop_(); _nop_(); /空操作四个机器周期,给硬件反应时间 result=BF; /将忙碌标志电平赋给result E=0; /将E恢复低电平 return result; /*函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate*/void WriteCmd_1602 (unsigned char dictate) 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由高电平跳变成低电平时,液晶模块开始执行命令 /*函数功能:指定字符显示的实际地址入口参数:x*/ void WriteAdd_1602(unsigned

温馨提示

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

最新文档

评论

0/150

提交评论