1、数字电压表课程设计湖 南 科 技 大 学单 片 机 课 程 设 计 题 目 数字电压表 姓 名 刘峥嵘 学 院 机电工程学院 专 业 测控技术与仪器 学 号 * 指导教师 戴巨川 成 绩 二一二年六月二日制摘要本课题实验主要采用AT89S52芯片和ADC0809芯片来完成一个简易的数字电压表,完成对输入05 V的模拟直流电压的测量,并通过一个4位一体的8段LED数码管进行显示,测量误差约为0.02 V。由AT89S52和ADC0809组成的数字电压表具有结构简单,易于操作,灵敏度高的特点。该电压表的测量电路方案由三个模块组成:A/D转换模块、数据处理模块及显示控制模块。A/D转换主要由芯片AD
2、C0809来完成,它负责把采集到的模拟量转换为相应的数字量再传送到数据处理模块。数据处理则由芯片AT89S52来完成,其负责把ADC0809传送来的数字量经一定的数据处理,产生相应的显示码送到显示模块进行显示;另外它还控制着ADC0809芯片的工作。显示模块主要由7段数码管组成,显示测量到的电压值。以上方法能较准确的对电压的测量。从而实现电压表的功能。第一章 数字电压表的功能要求说明及设计方案介绍 1.1 课题设计实验任务1 1.2 功能要求说明1 1.3 数字电压表设计方案1 1.4 数字电压表工作原理2第二章 硬件电路的设计 2.1 数字电压表各模块功能简要介绍3 2.2 电路原理图5 2
3、.3 元器件清单6第三章 系统程序的设计 3.1 初始化程序7 3.2 主程序7 3.3 C程序清单8第四章 调试及性能分析 4.1 电压表仿真结果及误差分析10 4.2 电压表设计结论10 4.3 设计体会11参考文献第一章 数字电压表的功能及设计方案介绍1.1 课题设计实验任务利用单片机AT89S52和ADC0809设计一个数字电压表,能够测量0-5V之间的直流电压值,四位数码管显示,要求使用的元器件数目尽量少。1.2 功能要求电路通电或按复位键时,通过改变电位器的阻值改变模拟输入电压,不断的将模拟电压转换成数字量,通过LED显示出所测得的模拟电压。在测试中测试的电压值必须和实际的电压值不
4、超过0.05V的电压。在改变电压时,能够准确的侧量出电压的变化值。1.3 数字电压表设计方案要实现电压的测试有多种方案,其中两种比较简单的且精确度比较高的可以分别采用并行ADC0809芯片和TLC549芯片,其中各芯片都有可取之处。方案一:用TLC549串行芯片作模数采样芯片,占用的单片机的I/O口线少,且占用电路面积小,只是编程复杂点。方案二:用ADC0809并行芯片作模数采样芯片,需要占用一个I/O口,不过可以循环采样8路模拟通道,占用板子的面积大,编程相对来说简单点。本程序采用方案二,采用常用的51单片机作为控制芯片,ADC0809芯片的CLK时钟信号脚接单片机的ALE脚; ADC080
5、9的参考电压接VCC,IN0接输入电压,ADC0809通过采样进来的数据信号送给单片机,再通过计算可以得到电压值,再通过显示电路,将所求得的电压值显示出来。通过调节连接IN0引脚的电位器及可以调节电压是电压在05V左右变化。其硬件流程图如下所示:图1.1 硬件流程图1.4 数字电压表工作原理 数字电压原理:这里主要是利用ADC0809模数串口芯片,ADC0809芯片的基准电压脚外接电压为5V,则最大可以测得的电压为5V,ADC0809芯片的模拟输入脚通过电位器接5V电压,进行模拟采样,通过调整电位器的值改变模拟量。输入的模拟量经过ADC0809芯片的内部8位开关电容逐次逼近A/D转换器,转换成
6、8为二进制数,其最小的分辨率为0.0196(VREF=0.0196V),D为转化的数字量,再通过 可以求得模拟电压,最后通过LED就可将所测得电压显示出来。第二章 系统硬件电路的设计2.1 数字电压表各模块功能简要介绍2.1.1时钟电路ADC0809的时钟取自AT89S52的ALE的信号,接在ADC0809的CLK端。2.1.2 复位电路按键复位具有上电复位功能,若要复位,只要按图中的RESET键,电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。上电复位电路要求接通电源后,通过外部电容充电来实现单片机自动复位操作。上电瞬间RESET引脚获得高电平,随着电容的充电,RERST引
7、脚的高电平将逐渐下降。RERST引脚的高电平只要能保持足够的时间(2个机器周期),单片机就可以进行复位操作。2.1.3 单片机系统电路单片机系统电路采用AT89S52芯片,40引脚的双列直插封装方式,允许RAM、定时器/计数器、串口、中断继续工作;作为输出口,每位能驱动8个TTL逻辑电平,能进行定时器/计数器、串口、中断等系列实验。2.1.4 LED显示电路它的连接方式为8位LED显示器的段控口a,b,c,d,e,f,g,dp分别接单片机的P1口;位控口1,2,3,4分别接单片机的P2口。 2.1.5 AD转换电路把“单片机系统”区域中的P3.6与“模数转换模块”区域中的ST和ALE端用导线相
8、连接;把“单片机系统”区域中的P3.7与“模数转换模块”区域中的OE端用导线相连接;把“单片机系统”区域中的P3.3与“模数转换模块”区域中的EOC端用导线相连接;把“单片机系统”区域中的ALE与“模数转换模块”区域中的CLK端用导线相连接;把“模数转换模块”区域中的A2A1A0端子连接到“电源模块”区域中的GND端;把“模数转换模块”区域中的IN0端子连接到“三路可调电压模块”区域中的VR1端;把“单片机系统”区域中的P0.0-P0.7用8芯排线连接到与“模数转换模块”区域中的D0D1D2D3D4D5D6D7端子。2.1.6 ADC0809的简介ADC0809是带有8位A/D转换器、8路多路
9、开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。(1)ADC0809的内部逻辑结构图2.1 ADC0809结构图由上图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。(2)引脚结构IN0IN7:8条模拟量输入通道ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转
10、换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。地址输入和控制线:4条ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。 图2.2 ADC0809引脚图CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7表 2.1数字量输出及控制线:11条。ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进
11、行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0为数字量输出线。CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,VREF(),VREF()为参考电压输入。2.2 电路原理图2.3 元器件清单 名称规格数量备注电阻 47016个4.7K4个10K1个1K2个电容30pF2个10F1个极性电容 发光二极管1个按键1个
12、晶振12MHz1个排阻102若干单排针若干 电位器W5031个 芯片AT89S521块ADC08091块 LED数码管4位1块脚座401个81个表2.2 元器件清单第三章 系统程序的设计3.1 初始化程序系统上电时,将A/D转换芯片初始化,并将A,B,C三条地址线的地址信号进行锁存。3.2 主程序 图3.1 主程序流程图当进行一次测量后,将显示出每一通道的A/D转换值。每一个位的数据延时时间在40us左右。其流程图如上所示:而输出数据采用动态扫描法实现4位数码管的数值显示。测量所得的A/D转换数据传送到P0口,测量数据在显示时需经内部转换为十进制电压值由P1口输出中,其中P2口控制段选。3.3
13、 C程序清单#include unsigned char code dispbitcode=0xfb,0xfd,0xe,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char code dispcode=0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x00;unsigned char dispbuf8=10,10,10,10,10,0,0,0;unsigned char i;sbit ST=P36;sbit OE=P37;sbit EOC=P32;unsigned char channel=0x8c;/IN0uns
14、igned char getdata;void main(void) TMOD=0x01; TH0=(65536-4000/12)/256; TL0=(65536-4000/12)%256; TR0=1; ET0=1; EA=1; P3=channel; while(1) ST=0; ST=1; ST=0; while(EOC=0); OE=1; getdata=P0; OE=0; getdata= getdata*500/256;dispbuf2=getdata/100; getdata=getdata%100; dispbuf1=getdata/10; dispbuf0=getdata%1
15、0; void t0(void) interrupt 1 using 0 TH0=(65536-4000/12)/256; TL0=(65536-4000/12)%256;P1=dispcodedispbufi; if(i=3) P2=dispbitcodei; i+; if(i=8) i=0; 第四章 调试及性能分析4.1 电压表仿真结果及误差分析 次数123456789理论值/V0.501.001.351.852.003.504.124.505.00实际测量值/V0.480.981.331.831.973.474.094.475.00仿真值0.501.001.351.852.003.504
16、.114.495.00表4.1 电压表测试结果仿真图如下图。仿真结论,通过多次的反复测试,发现当电压比较小时电压的实际测量值和ADC0809芯片的测量显示值误差几乎为零,当电压不断增大时两者的电压值相差慢慢增大,但误差不大,大约在0.010.06V左右,实际电压值比测得的电压值小。在实物中通过改变电位器的输入电压可以,ADC0809转换芯片测得的电压值和万用表测得的电压值相差0.02V,而ADC0809芯片的精确度为0.019左右,误差大小为2%。在制作的数字电压表中,所测得的数字电压值和实际电压值相差0.02V,这个误差可能由于单片机能够精确的小数为小数点后的6位,及小数点后的7位之后的全部
17、去掉,会引起一定误差。在本次设计中重要的是如何将ADC0809芯片所采集的数据送给单片机,同时在将数据送给单片机后如何将ADC0809芯片读得的数据进行计算,然后进行显示。在按键时如何控制进入电压测试,如何停止电压测试,在电压测试时必须可以不断的调节电压可以测量出电压值的大小。4.2 电压表设计结论通过本次设计课程设计,我更加的熟悉了单片机汇编的程序编写,在这次当中遇到了一些问题,当时定义数据时,将整型数据定义成了无符号字符型,去测电压电压值不变,最后通过调试发现是变量类型定义错了,在使用串行芯片ADC0809时要注意A/D转化芯片的时序,只有在正确的时序时才能读得准确的数据,在写程序时先将显
18、示程序写好,将显示程序调好后,在去写其他程序,当要用到显示程序时在去调用它,这样显示程序不用管,在调试程序中采用分步调试可以减少程序的复杂性。4.3 设计体会本次设计中采用串行芯片做数字电压表,其中串行芯片可节省单片机的I/O口,单片机总共有32个I/O口其中LDE显示就占用了P1和P2口,P3口作为ADC0809芯片的三根控制线,虽然采用串行芯片在编程方面变得有点复杂,但它占用的地方比较小。在串行芯片使用时,我们必须重点了解串行芯片的时序图,懂得串行芯片的数据传送方式。当时我认为该芯片也就只有三个编程脚,其中分别为CS、DATA OUT、CLK三个脚编程并不是那么简单,串行芯片需要采集的数据
19、需要按照时序,一个一个得发送到单片机,经过计算在在LED上显示出来,当时我采用的时序和芯片的时序不同,调试了好久都没调试出来,后来参照芯片资料,后改过来单还是发现问题,虽然采集到数据但是LED显示的数字和实际的测量值很大区别,我通过调试程序后发现我将变量的类型定义错了,导致了数据发生错误,我将无符号整型变量定义为无符号字符型变量,而变量的实际值远远超过了那个值使得单片机计算错误,调整电压的大小LED总是显示同一个数,在定义变量时要考虑变量的范围否则程序会出错。总之通过这次的课程设计,我们自己可以通过编程更加了解到了单片机的内部资源,懂得了如何使用单片机的编程。通过本次课程设计,我发现自己的动手能力和编程能力都还是有所欠缺。我认为我们因该多做些实物,增强我们动手能力的同时也提升了我们对相关知识的了解。以及布置相关的编程题,例如:温度计编程,液晶的显示等等,增强了编程能力的同时也丰富了相关的知识。图4.1 仿真图参考文献1 何立民.单片机高级教程应用与设计M.北京:北京航空航天大学出版社,2000.2 李朝青.单片机原理及借口技术M.北京:北京航空航天大学出版社,2005.3 赖麒文.8051单片机C语言彻底应用M北京.科学出版社,2002.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1