简易直流电压表——单片机课程设计1摘要本报告介绍了以8051单片机为核心,以ADC0809模数转换芯片采样,以数码管显示的具有一定精度测量功能的直流数字电压表。制作过程中的关键问题在于单片机程序对量化值的处理即如何将量化值转换为数码值并显示。对于此问题,本实验采用汇编语言编辑程序,运用除法取余计算解决量化值的处理。一、设计任务和要求1、设计任务设计制作一个简易直流电压表,该直流电压表能测量直流电压。2、设计要求①能测量电压0—5V,0—50V两档,输入阻抗200K。②数码管显示共3位,其中1位小数(0.00—9.99V或000—999V)。③要有输入信号超范围的保护电路。3、方案论证AD转换方案:采用ADC0809模数转换芯片。该芯片为8位二进制转换芯片,把基准电压量化成256等份,然后通过逐次逼近法,对外部的模拟信号进行取样比较,确定其所在的等级,即所对应的8位二进制数的大小,由此可知,8位转换芯片的精确度为基准电压除以256。基准电压值越低,精度越高,但代价是量程越小。二、实际制作和调试1、测试仪器和方法测试仪器:直流稳压电源、数字万用表。测试方法:因为直流稳压电源的显示输入电压值不够准确,所以以万用表测得的输入电压为准。将数码管显示的直流电压表测量值和输入电压做比较,确定直流电压表的测量误差。2、软件调试1)程序设计思想;①主程序:输入电压AD转换器控制器显示测量值50.02256VV500.2256VV2系统上电,开中断,AD模块将模拟量转换成数字量送到51单片机中处理成十进制的数,再调用显示模块进行显示。②A/D转换模块:A/D转换子程序用来控制对模拟输入电压的A/D转换,转换值存入9000H单元,并对其进行处理,将其对应的数值存入30H-32H内存单元。ADC0809的_ADCS接地址译码CS1。③显示模块:先判断P1.0口的电平,为高电平时是50V档,应在31H显示小数点;P1.0为低电平时,是5V档,应在30H显示小数点。显示子程序采用动态扫描实现三位数码管的数值显示。测量数据在显示时需转换成BCD码。R4作为3路循环控制,R1用作显示数据指针。④8255串口模块:8255的CS接地址译码CS0,则命令字地址为8003H,PA口地址为8000H,PB口地址为8001H,PC口地址为8002H。主程序和A/D转换测量程序流程图如图所示。2)程序清单见附录。3、硬件调试1)实际电路:由设计任务框图分析得,电源部分提供整个系统的电能。单片机部分控制系统,用来将转换来的数字量进行处理,变为应显示的数值。显示部分通过动态扫描显示测量结果。模数转换采集电压值发送到单片机。如果电压超过量程,用稳压二极管实现保护。因为用到的端口比较多,所以引入8255。具体电路图如下。开中断进入A/D转换调用显示子程序开始主程序读取数据数据转换0809地址加进入中断返回A/D转换模块程序流程图32)实际连接:实际连接是在实验箱上进行的,ADC0809和8051的大部分已在向内部连好,所以在实际中连接一下几项:①ADC0809和8255的片选端分别接CS0和CS1②ADC0809的EOC端接非门接到8051的P3.3口。③8051的.01P口在测5V档和50V档时要分别接地和5V。④8255的PA口接位选,PB口接七段码。3)实验结果及数据分析:①直流电压0—5V档测量实验结果:将8051的P1.0口接地,将电压源接入51KΩ电阻的一端,IN0口接“5V”位置,将程序下载到单片机8051后,调节电压源在0—5V的范围内变化,观察数码管的显示结果,将实验结果记录到下表中:待测电压(V)0.20.61.02.32.83.54.87.0测量电压(V)0.310.641.122.362.833.524.815.00数据分析:由实验结果可以看出,能够实现数码管三位显示,且测量值和待测电压基本吻合。但从数据中可以看出:⑴在电压小时,测量误差较大。这是因为,ADC0809是八位A/D转换芯片,转换硬件连接图4精度不高,当输入电压值较小时,其不能准确的转换;⑵由最后一组数据可看出,当待测电压超过5V时,电路依然可正常工作,测量结果始终保持5V。这是因为,实验箱内部有保护电路。②直流电压0—50V档测量实验结果:将8051的P1.0口接+5V,将电压源接入51KΩ电阻的一端。IN0口接“50V”位置,将程序下载到单片机8051后,调节电压源在0—30V(因为电压源上限是30V)的范围内变化,观察数码管的显示结果,将实验结果记录到下表中:待测电压(V)1.53.08.612.115.223.327.130.0测量电压(V)1.583.148.6812.215.423.427.230.0数据分析:由实验结果可以看出,能够实现数码管三位显示,能显示一位小数且测量值和待测电压基本吻合。但从数据中可以看出:⑴在电压很小时,测量误差较大,这是因为,ADC0809是八位A/D转换,转换精度不高,当输入电压值较小时,其不能准确的转换。⑵和0—5V档相比较,其整体误差大一些,这是因为,测0—50V电压的原理是通过一分压电路,把0—50V转换成0—5V的,但由于实际电路中的分压电阻和理论值有偏差,因此误差会大一些。三、课设总结此次课设实现了基本部分的要求,通过对“简易直流电压表”的设计,结合所学过的课程,了解了简易仪表的发展状况,掌握了目前自动化仪表的一般设计要求,工程设计方法,开发及设计工具使用方法,最重要的是通过这一设计实践过程,我不再约束于在理论,在锻炼自身的动手能力的同时,也提高了自己分析、解决问题的能力,积累经验,培养按部就班,一丝不苟的工作态度和对所学知识的综合运用能力。我认为这样的实践环节在我的学习生活中是很难得的,它为我以后走向工作岗位打下了一定的基础。四、参考文献【1】蔡黄琴.《MCS—51系列单片机系统及其应用》,高等教育出版社【2】万福君,潘松峰.《单片微机原理系统设计与应用》,中国科学技术大学出版社,01年8月第2版【3】傅丰林.《低频电子线路》,高等教育出版社【4】林占江,林放.《电子测量仪器原理与使用》,电子工业出版社【5】陈尚松,郭庆,雷加.《电子测量与仪器》,电子工业出版社5附录1.使用仪器及元器件清单名称数量直流稳压电源1数字万用表110K电阻电位器151K电阻15V稳压二极管12.程序清单ORG0000HLJMP0100HORG0013H;外部中断1INT1LJMP1000HORG0100HMAIN:MOVDPTR,#8003H;命令字地址MOVA,#80H;10000000BMOVX@DPTR,A;ABC输出,AB方式0SETBIT1;开外部中断1SETBEX1;开源允许SETBEA;开总允许MOVDPTR,#9000HMOVA,#00HMOVX@DPTR,A;9000H清零LOOP:SETBEAAJMPLOOP;等待中断RETORG1000HSTART:PUSHPSW;保存程序状态字PUSHACC;保存累加器状态PUSHDPL;PUSHDPH;保存DPTR状态CLREA;关总允许MOVDPTR,#9000HMOVR1,#30H;R1数据指针MOVXA,@DPTR;量化值给AMOV@R1,A;量化值存入30H中MOVB,#33H;量化值除以51DIVAB;商1A余数1BMOV@R1,A;商1存入30HINCR1;R1指向31HMOVA,B;余数1给AMOVB,#05H;余数1除以5DIVAB;商2A余数2BMOV@R1,A;商2存入31H中INCR1;R1指向32HMOVA,B;A为余数2MOVB,#02H;余数2乘以2MULAB;B为积高4位,A为积低4位MOV@R1,A;积存入32H中ACALLDISUP调用显示程序MOVDPTR,#9000HMOVX@DPTR,A;积存入9000H中POPDPHPOPDPLPOPACCPOPPSWRETIDISUP:MOVR4,#04H;R4作为循环控制MOVR1,#30HMOVA,P1;采P1状态,确定是哪个档ANLA,#01H;采P1.0口状态JNZKK;0—5V档MOVA,@R1;0—50V档MOVDPTR,#DESMOVCA,@A+DPTR;数码值给AORLA,#80H;保留A第1位MOVDPTR,#8001HMOVX@DPTR,A;数码值给PB口MOVDPTR,#8000H6MOVA,R4MOVX@DPTR,A;循环控制给PA口ACALLDELYRRA;A右移MOVR4,A;R4为循环控制(PA1)INCR1;R1指向31HMOVA,@R1MOVDPTR,#DESMOVCA,@A+DPTRMOVDPTR,#8001HMOVX@DPTR,A;数码值给PB口MOVDPTR,#8000HMOVA,R4MOVX@DPTR,A;循环控制给PA口ACALLDELYRRA;A右移MOVR4,A;R4为循环控制(PA0)INCR1;R1指向32HJMPAAAKK:MOVA,@R1;取30H中数值MOVDPTR,#DESMOVCA,@A+DPTRMOVDPTR,#8001HMOVX@DPTR,A;数码值给PB口MOVDPTR,#8000HMOVA,R4;循环控制给A(PA2)MOVX@DPTR,A;循环控制给PA口ACALLDELY;调用延时程序RRA;A右移MOVR4,A;R4为循环控制(PA1)INCR1;取31H中数值MOVA,@R1MOVDPTR,#DESMOVCA,@A+DPTR;A为数码值ORLA,#80H;保留A中低7位MOVDPTR,#8001HMOVX@DPTR,A;A给PB口MOVDPTR,#8000HMOVA,R4MOVX@DPTR,A;循环控制给PA口ACALLDELYRRA;A右移MOVR4,A;循环控制PA0INCR1;R1指向32HAAA:MOVA,@R1MOVDPTR,#DESMOVCA,@A+DPTRMOVDPTR,#8001HMOVX@DPTR,A;数码值给PB口MOVDPTR,#8000HMOVA,R4MOVX@DPTR,A;循环控制给PA口ACALLDELYRETDES:DB3fh,06h,5bh,4fh,66h,DB6dh,7dh,07h,7fh,67hDELY:MOVR7,#02H;延时程序DL1:MOVR6,#0FFHDL2:DJNZR6,DL2DJNZR7,DL1RET