数字万用表的设计.doc

上传人:星星 文档编号:1038690 上传时间:2024-03-28 格式:DOC 页数:23 大小:607KB
下载 相关 举报
数字万用表的设计.doc_第1页
第1页 / 共23页
数字万用表的设计.doc_第2页
第2页 / 共23页
数字万用表的设计.doc_第3页
第3页 / 共23页
数字万用表的设计.doc_第4页
第4页 / 共23页
数字万用表的设计.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、课程名称: 数字万用表的设计专 业: 电子信息工程 班 级: 0学 号: 姓 名: 指导教师 : 目 录1 、设计任务3 1.1设计目的31.2设计指标及要求32、设计思路与总体框图33、系统硬件电路的设计43.1主控芯片43.2模数转换部分43.3 电阻测量输入电路63.4电压测量输入电路73、5电流输入测量电路93.6 自锁开关104、软件设计104.1主程序设计104.2 A/D转换子模块115、系统调试 115.1硬件调试115.2 硬件故障115.3硬件调试方法125.4软件调试125.5软件故障125.6软件调试方法 126 实验数据处理126.1实验数据 126.2实验数据分析

2、137总结与体会137.1 总结 147.2体会148 参考文献149 附录程序141、设计任务11设计目的采用A/D转换器ADC0804和STC89C51单片机,设计一台数字多用表,能进行电压、电流和电阻的测量,测量结果通过LCD液晶显示器显示,通过按键进行测量功能转换。12设计指标及要求电压测量范围020V,测量误差约为0.05V,电流测量范围1200mA,测量误差约为0.5mA,电阻测量范围01000,测量误差约为2。2、设计思路与总体框图1.方案选择 用单片机STC89C51与ADC0804设计一个数字万用表,配合分流电阻、分压电阻、基准电阻可以测量直流电压值,直流电流、直流电阻,四位

3、数码显示。实现各级量程的直流电压测量,其量程范围为020(V)。实现不同量程的直流电流测量,其量程范围为0200(mA)。实现不同量程的电阻测量,其量程范围为01000()。ADC0804是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。首先,利用P1 口数据地址复用,将地址通过P1口输入到单片机中。然后,充分利用单片机强大的运算转化功能将其转成适当的二进制信号控制数显以确保正确的显示被测量的读数。 2.总体框图液晶显示STC89C51单片机(实现译码驱动)模数转换(ADC0804)待测电压分档电压(量程转换)待测电

4、阻待测电流分档电流(量程转换)分档电阻(量程转换)图一:总体框图3、系统硬件电路的设计3.1主控芯片本电压表采用STC89C52为主控芯片,电路如下图所接:3.2模拟转换部分该电压表采用的ADC0804,此芯片优点是并行输出,速率快,缺点是只有8位,精度不高。下来ADC0804芯片图:单片机的P2.0 P2.2引脚通过一个转换开关接地,通过判断P2.0 P2.2引脚电平的高低,决定是否进行电阻测量、电压测量或电流测量。为了方便,将数字地和模拟地都直接接到了一起,DB0DB7为并行输出口,CS,RD,WR为控制芯片模数转换及读取芯片数据和写数据的引脚,ADC0804可以自己产生时钟,只要在CLK

5、R和CLKIN端接入电阻(10K)和电容(理论为150pf本人接的220pf),可产生脉冲信号。VREF为参考电压端,VIN+和VIN为电压输入端。当电压加在VIN+和VIN端时,在DB0DB7可输出八位到单片机,本处参考电压为5V,则当输入电压U时,输出数据为temp,则U/temp=5/255.3.3数字多用表电阻输入电路图-二 图-二所示为数字多用表的电阻测量输入电路。运算放大器的反馈电阻Rx作为待测电阻,通过1K电阻R10接到5V电源上,那么放大器的输出电压Rv=5*Rx/(Rp+R15+R0+Rx),将Rv送给ADC0804,转换后得到数字量为Dv=Rv*255/5。单片机读取A/D

6、转换数据,再经过逆向运算可得Rx=Dv*(R1p+R0+R15)/(5-Dv)*255,注意此时得到的Rx是二进制数,需要转化成十进制数后才能送给1602显示,程序中采取用4字节无符号除法,连续进行4次除以10的除法,依次取得4位数值,并且电阻测量范围只保证在01K范围内误差不超过2,如果要测量其他电阻,则需该改Rp的值。3.4数字多用表的电压测量输入电路图-四图-四所示为数字多用表的交流电压测量输入电路,ACV量程为012V待测电压经交流电压测量图过低通滤波器滤除干扰,再经过同向放大器送给ADC0804,电压测量输入范围012,ADC084的分辨率为8位,测量误差为12/255=0.05V。

7、D5为整流管,D4起保护作用。R24、C6组成平滑滤波器。C5、C4为隔直电容。Uout=Uac(有效值)图-五直流电压测量图图-五直流电压测量电路。DCV量程为012V。Uout=R8*U/(R7+R8+R11),所以,U=(R7+R8+R11)* Uout/R8。R7和R8为分压电阻,大小都为10M。R11为匹配电阻,保证等值分压。R13为限流电阻,大小为1M。3.5数字万用表的电流测量输入电路图-六电流测量电路图图-六是数字万用表电流测量输入电路。电流测量范围为1-200mA,因为ADC0804是电压转化器,必须将电压才能进行测量,这可以通过串接电阻RP来实现,注意RP必须很小(如0.1

8、),否则营销电流数值,由于待测电流和RL都很小,RL两端的电压也很小,必须将其放大到ADC0804能够分辨的范围之内。R12为限流电阻,大小为1M。D2,D3为双向限幅过压保护二极管,起过流保护作用。3.6 自锁开关 图-七 自锁开关图用来控制测量哪一种变量,同时用来检测正测的信息,通过导线送入到单片机。上面接10K的限流电阻。4、软件设计4.1主程序 主程序包括初始化部分 调用A/D转换子程序和调用显示程序,如下图所示:4.2 A/D转换子模块:A/D转换子程序用于对ADC0804八路输入模拟电压进行A/D转换,并将转换的数值存入八个相应的存储单元中,如下图: 5、系统调试基于单片机的数字电

9、压表在组装好以后,便可进入系统的在线调试,起主要任务是排除样机硬件故障并完善其硬件结构,试运行所设计的程序,排除程序错误,优化程序结构,使系统达到预期的功能,进而固化软件。5.1硬件调试单片机应用系统的硬件和软件调试时交叉进行的,但通常是先排除样机中明显的硬件故障,尤其是电源故障,才能安全和仿真器相连,进行综合调试。5.2 硬件电路故障(1)错线 开路 短路;(2)元器件损坏(3)电源故障5.3 硬件调试方法 本设计调试中所用的调试方法是静态测试: 在样机加电之前,首先用万用表等工具,根据硬件电器原理图和装配图仔细检查样机线路的正确性,并核对元器件的型号 规格和安装是否符合要求。第二步是加电后

10、检查各插件上引脚的点位,仔细测量各电位是否正常。第三步是在不加电的情况下,除单片机以外,插上所有的元器件,最后用仿真适配器将样机的单片机插座盒仿真器的仿真接口相连,为联机调试做准备。5.4 软件调试5.5 软件电路故障(1)当以断点或连续方式运行时,目标系统没有按规定的功能进行操作或什么结果也没有,这是由于程序转移到意外之外或在某处死循环所造成的。(2)结果不正确5.6 软件调试方法软件调试所使用的方法有:计算程序的调试方法,I/O处理程序的调试法,综合调试法6、实验数据处理6.1实验数据012直流电压为 012交流电压为次数标准值电压示值满度误差次数标准值电压示值满度误差1122334455

11、667788991010111112121313141415151617181920实验数据0-1K电阻为 0-200mA电流为次数标准值电压示值满度误差次数标准值电压示值满度误差112233445566778899101011111212131314141515161718192062实验数据分析 直流0-12V量程精度为 满度误差 为 交流0-21V量程精度为 满度误差为 电流0-200mA量程精度为满度误差为7、 总结与体会数字多用表的课程设计,从确定方案、查找资料、仿真电路图,到最后电路设计实践,耗时2个星期。数字多用表的设计方案采取STC89C51单片机结合A/D转换器,从而实现对电

12、阻、电流和电压的测量的方案,从而实现电阻、电流和电压的数字化测量。本次课程设计,虽然方案基本出来了,但是在硬件制作方面出现了几个问题,这也暴露出我们知识方面的一欠缺。不足主要体现在以下几个方面:(1)ADC0804的第10脚的时钟信号,我们是通过单片机编程实现的但是由于频率过低,只有500KHz,造成1602液晶显示器显示不稳定而出现闪烁现象。最终验收时是通过从外部信号发生器输入2MHz时钟信号解决的。(2)万用板焊接时,由于布线不太合理,使得背面线很零乱。并给后面的线路检查带来了不少麻烦。(3)51单片机基础知识不扎实,电路分析遇到比较多的问题历经两个星期的课程设计后我深得做课程设计同时也是

13、对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。虽然最终的结果让人失望,但在此期间我们也曾一度热情高涨。从开始时满8、参考文献单片机原理及应用 张毅刚 主编 高等教育出版社单片机原理实用教程 徐爱钧 编著 电子工业出版社电子技术基础康华光 主编 高等教育出版社集成电路原理及应用谭博学、苗汇静 主编 电子工业出版社9、附录程序主程序:#include /头文件#include /头文件#include#include#include#in

14、clude#include#include#include void main()while(1)write_com(0x01);lcd_init(); display_voltage(); 1、 宏定义和定义变量:#define uchar unsigned char /宏定义#define uint unsigned intuchar table= measurement: ;uchar range20=RANGE020V: ;uchar range200=RANGE0200mA: ;uchar range2000=RANGE02K:;uchar warning=Please Choice

15、! ;/*uchar error=error!; */ uint measure10; sbit key3=P27;sbit key0=P22;sbit key1=P21;sbit key2=P20;sbit lcd_rs=P23; / 定义液晶的rs端口sbit lcd_rw=P24; / 定义液晶的rw端口sbit lcd_en=P25; sbit back=P26;sbit spk=P27; / 定义液晶的en端口sbit cs=P32; / 定义AD的cs端口sbit rd=P31; /定义AD的rd端口sbit wr=P30;/sbit dula=P37;sbit INTR=P37;

16、 /定义AD的wr端口uint temp,i,A1,A2,A3,A4; /定义变量 uint date;2、 延时部分:void delay(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void delay_lcd()/1602指令之间延时uint x=5;while(x-);3、 AD转换和数据传送: void AD_init() /初始化ADC0804cs=0;wr=1;_nop_();wr=0;_nop_();wr=1; uint AD_switch() /AD转换部分uint temp;P1=0xff;rd=1;_nop_();r

17、d=0;_nop_();temp=P1;/将转后的原始值返给单片机P1口return temp;uint AD_smooth()/软件滤波uint xx,i,temp;AD_init();for(i=0;i20;i+)measurei=AD_switch();delay(10); /每隔10us ADC转换并采集一次数据,将得 /到的数据放到数组中,采集十个数据for(xx=0;xx20;xx+) /将十个数据冒泡法排序for(i=xx;imeasurei)temp=measurei;measurei=measurexx;measurexx=temp; for(i=6;i16;i+)/去掉了三

18、个最小值和两个最大值, /取中间五个数的平均值xx+=measurei;xx=xx/10;return xx; /将滤过波后的值存入单片机4、 1602子程序:void write_com(uchar com)/写指令delay(5);lcd_en=0;lcd_rs=0;lcd_rw=0;_nop_();lcd_en=1;P0=com;lcd_en=0;lcd_rs=0;void write_date(uchar date)/写数据delay(5);lcd_en=0;lcd_rs=1;lcd_rw=0;_nop_();lcd_en=1;P0=date;lcd_en=0;lcd_rs=0;voi

19、d lcd_init()/初始化 back=0; delay(15); lcd_en=0; write_com(0x38); write_com(0x38); write_com(0x38); write_com(0x06); write_com(0x0c); write_com(0x01); 5、 键盘扫描:uint keyscan()if(key0=0&key1=1&key2=1&key3=1)return 1;else if(key0=1&key1=0&key2=1&key3=1)return (2);else if(key0=1&key1=1&key2=0&key3=1)return

20、(3);else if(key0=1&key1=1&key2=1&key3=0)return (4);else if(key0=1&key1=1&key2=1&key3=1) return(5);else return (6);6、 数据整理及显示:void display20V(uint temp)/量程为20V时的显示状态uint num0,num1,num2,num3;if(temp7) temp=0;else temp=temp-7;num0=temp/51;num1=temp%51*10/51;num2=temp%51*10%51*10/51;num3=temp%51*10%51*1

21、0%51*10/51;write_com(0x80+0x40+11); write_date(num0+0x30);delay_lcd();write_com(0x80+0x40+12); write_date(.);delay_lcd();write_com(0x80+0x40+13); write_date(num1+0x30);delay_lcd();write_com(0x80+0x40+14); write_date(num2+0x30);delay_lcd();write_com(0x80+0x40+15); write_date(num3+0x30);delay_lcd();vo

22、id display200mA(uint temp)/电流200mA时的显示状态uint num0,num1,num2,num3;if(temp7) temp=0;else temp=temp-7;num0=temp/510;num1=temp%51*10/510;num2=temp%51*10%51*10/510;num3=temp%51*10%51*10%51*10/510;write_com(0x80+0x40+11); write_date(num0+0x30);delay_lcd();write_com(0x80+0x40+12); write_date(.);delay_lcd()

23、;write_com(0x80+0x40+13); write_date(num1+0x30);delay_lcd();write_com(0x80+0x40+14); write_date(num2+0x30);delay_lcd();write_com(0x80+0x40+15); write_date(num3+0x30);delay_lcd();void display2000(uint temp)/量程为2000欧时的显示状态uint num0,num1,num2,num3;if(temp7) temp=0;else temp=temp-7;num0=temp/51;num1=tem

24、p%51*10/5.1;num2=temp%51*10%51*10/5.1;num3=temp%51*10%51*10%51*10/5.1;write_com(0x80+0x40+11); write_date(num0+0x30);delay_lcd();write_com(0x80+0x40+12); write_date(.);delay_lcd();write_com(0x80+0x40+13); write_date(num1+0x30);delay_lcd();write_com(0x80+0x40+14); write_date(num2+0x30);delay_lcd();wr

25、ite_com(0x80+0x40+15); write_date(num3+0x30);delay_lcd();void display_voltage()uint numx,temp,temp0,temp1;/float temp;numx=keyscan();temp0=numx;for(i=0;i16;i+)write_com(0x80+i);write_date(tablei);delay_lcd(); if(numx=1)for(i=0;i11;i+)write_com(0x80+0x40+i);write_date(range20i);delay_lcd();else if(nu

26、mx=2)for(i=0;i11;i+)write_com(0x80+0x40+i);write_date200mA(rangei);delay_lcd();else if(numx=3)for(i=0;i11;i+)write_com(0x80+0x40+i);write_date(range2000i);delay_lcd();else if(numx=4)for(i=0;i11;i+)write_com(0x80+0x40+i);write_date(range20i);delay_lcd();else if(numx=5)for(i=0;i16;i+)write_com(0x80+0x

27、40+i);write_date(warningi);delay_lcd();else break;while(temp0=4&numx!=5&numx!=6)temp=AD_smooth();if(temp5) temp=0;if(numx=1)display20V(temp);numx=keyscan();/if(numx=5) break;if(numx=2)display200mA(temp);if(num=3)display2000(temp)if(num=4)display20V(temp)numx=keyscan();while(temp1-temp7|temp-temp17)&temp1=numx)temp=AD_smooth();numx=keyscan(); 23

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 毕业设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922