1、目录摘要引言一 课程设计题目及任务要求1.1课程设计主要任务1.2课程设计的要求二 电路设计方案及原理说明2.0课程设计的方案 2.1 ADC0809模数转换芯片2.2 AT89C51单片机 2.3 4个共阳7段数码管显示器2.4 系统整体工作原理2.4.1硬件原理2.4.2软件原理分析三 设计总体框图3.1硬件总体框图3.2主程序流程图3.3待测信号源单元电路3.4 AT89C51单片机3.5单片机控制单元3.5.1外部时钟电路3.5.2复位电路3.5.3数码管显示模块四 实验仿真五 总结及设计心得六 致谢七 参考文献摘要:本设计待测的输入电压为8路,电压范围为05V,使用目前广泛使用的AT
2、89C51来做控制系统,用ADC0809来进行模拟电压的采集及模数转换,实现采集8路数据,并将结果在四位一体数码管上进行显示。该系统主要包括几大模块:数据采集模块、AD转换模块、控制模块、显示模块。显示部分由LED数码显示器构成。该数字电压表具有电路简单,成本低等优点,可以方便地进8路AD转换量的测量。关键词:电压采集、ADC0809、A/D转换、单片机89C51、数码管显示引言随着计算机技术的飞速发展和普及,数据采集系统在多个领域有着广泛的应用。数据采集是工、农业控制系统中至关重要的一环,在医药、化工、食品、等领域的生产过程中,往往需要随时检测各生产环节的温度、湿度、流量及电压等参数。同时,
3、还要对某一检测点任意参数能够进行随机查寻,将其在某一时间段内检测得到的数据经过转换提取出来,以便进行比较,做出决策,调整控制方案,提高产品的合格率,产生良好的经济效益。 随着工、农业的发展,多路数据采集势必将得到越来越多的应用,为适应这一趋势,作这方面的研究就显得十分重要。在科学研究中,运用数据采集系统可获得大量的动态信息,也是获取科学数据和生成知识的重要手段之一。总之,不论在哪个应用领域中,数据采集与处理将直接影响工作效率和所取得的经济效益。 采集系统,从严格的意义上来说,应该是用计算机控制的多路数据自动检测或巡回检测,并且能够对数据实行存储、处理、分析计算以及从检测的数据中提取可用的信息,
4、供显示、记录、打印或描绘的系统。电压测量成为广大电子领域中必须掌握的过程,并且对测量的精度和采集功能的要求也越来越高,而电压的测量与显示系统甚为重要。在课程设计中对一路电压采集系统与显示系统作了基本的研究。电压采集与通信控制采用了模块化的设计,并用单片机8051来实现,硬件部分是以单片机为核心,还包括模-数转换模块,显示模块,和串行接口部分,还有一些简单的外围电路。1路被测电压通过通用ADC0809模-数转换,实现对采集到的电压进行模拟量到数字量的转换,由单片机对数据进行处理,用数码管显示模块来显示所采集的结果,由相关控制器完成数据接收和显示,汇编程序编写了更加明了化数据显示界面。本系统主要包
5、括四大模块:数据采集模块、控制模块、显示模块、A/D转换模块。绘制电路原理图与工作流程图,并进行调试,最终设计完成了该系统的硬件电路。在软件编程上,采用了汇编语言进行编程,开发环境使用相关集成开发环境。开发了显示模块程序、A/D转换程序。一、 设计任务与要求1.1课程设计主要任务A、通过设计是学生掌握利用ADC0809及其适当的外围电路实现直流电压的采集以及利用LED显示功能的方法。B、进一步掌握ADC0809的功能特点、工作原理和正确使用方法。C、进一步了解外围器件接口的基本原理与使用技术。1.2课程设计的要求A、利用ADC0809及其适当的外围电路实现直流电压的采集。B、采集结果在LED数
6、码管上显示出来,数据范围为:05vC、绘制硬件连接图,编写相应的控制程序。D、撰写设计报告、调试报告、设计心得。二 、电路设计方案及原理说明依据综合课程设计的要求,利用ADC0809设计一个单通道模拟电压采集显示电路,要求对所接通道变化的模拟电压值进行采集,采集来的数字量送至数码管指示出来,通过相关转换在数码管上精确显示出来。本课程设计相当于测直流电压的大小,通过对电压值的采集与处理,而由所学微控制器的知识可知,可以利用单片机的模数转换来实现这一设计,进一步把相应的电压值精确显示出来。 模数转换就是利用单片机控制模数转换芯片(A/D),让它对外部的一个模拟信号进行采样、量化、编码然后转化为一个
7、离散的数字量,提供给控制器作进一步处理。对于常用的A/D转换芯片有ADC0809、ADC0808等。它们都是8位的模数转换芯片,就是把模拟量转换为一个8位的二进制数。利用单片机AT89C51与ADC0809设计一个电压采集系统,将模拟信号(实际设计时采用05 V)之间的直流电压值转换成数字量信号0FF,以数码管显示。Proteus软件启动仿真,当前输入电压为25 0V,转换成数字值为7FH,用鼠标指针调节电位器尺,可改变输入模数转换器ADC0809的电压,并通过虚拟电压表观察ADC0809模拟量输入信号的电压值,LED数码管实时显示相应的数值量。 此次电压表总体的方案就是用单片机的I/O口输出
8、信号来控制A/D启动转换,将送入的模拟量转换为一个8位数字量,然后再通过I/O口送回单片机内部进行处理,单片机进行一系列的运算和校准后,通过数码管将电压值显示出来。而在方案的实现上由两部分组成:硬件部分和软件部分。硬件即电子元器件的选择且将它们连接成一个可行的硬件系统,软件是硬件系统功能化的重要组成部分。硬件的设计可以在Proteus上进行,软件可以用Proteus自带的汇编工具,然后在Proteus将硬软件相结合,进行仿真,再根据结果不断对硬件进行改进,对软件进行调试,实现电压的采集与显示功能。2.1 ADC0809模数转换芯片 1.ADC0809是带有8位A/D转换器、8路多路开关以及微处
9、理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。 (1)ADC0809的内部逻辑结构 由下图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。(2)ADC0809引脚结构 ADC0809各脚功能如下:D7-D0:8位数字量输出引脚。IN0-IN7:8位模拟量输入引脚。VCC:+5V工作电压。GND:地。REF(+):参考电压正端
10、。REF(-):参考电压负端。START:A/D转换启动信号输入端。ALE:地址锁存允许信号输入端。(以上两种信号用于启动A/D转换).EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。OE:输出允许控制端,用以打开三态数据输出锁存器。CLK:时钟信号输入端(一般为500KHz)。A、B、C:地址输入线。 ADC0809对输入模拟量要求:信号单极性,电压范围是05V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 地址输入和控制线:4条 ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁
11、存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进入转换器进行转换。A,B和C为地址输入线,用于选通IN0IN7上的一路模拟量输入。通道选择表如下表所示。CBA选择的通道000IN0001IN1010IN2011IN3100IN4101IN5110IN6111IN7数字量输出及控制线:11条 ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。O
12、E1,输出转换得到的数据;OE0,输出数据线呈高阻状态。D7D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, VREF(),VREF()为参考电压输入。 2 ADC0809应用说明 (1) ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。 (2) 初始化时,使ST和OE信号全为低电平。 (3) 送要转换的哪一通道的地址到A,B,C端口上。 (4) 在ST端给出一个至少有100ns宽的正脉冲信号。 (5) 是否转换完毕,我们根据EOC信号来判断。 (6) 当EOC变为高电平时,这时给O
13、E为高电平,转换的数据就输出给单片机了。2.2 AT89C51单片机 ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式,本题中选用中断接口方式。由于ADC0809无片内时钟,时钟信号可由单片机的ALE信号经D触发器二分频后获得。该题目中单片机时钟频率采用12MHz,则ALE输出的频率是2MHz,四分频后为500KHz,符合ADC0809对频率的要求。由于ADC0809内部设有地址锁存器,所以通道地址由P0口的低3位直接与ADC0809的A、B、C相连。通道基本地址为0000H0007H。其对应关系上面已做介绍。 控制信号:将P2.7作为片选信号,在启动
14、A/D转换时,由单片机的写信号和P2.7控制ADC的地址锁存和启动转换。由于ALE和START连在一起,因此ADC0809在锁存通道地址的同时也启动转换。在读取转换结果时,用单片机的P3.0产生正脉冲作为OE信号,用来打开三态输出锁存器。其接口电路如图2-2所示。图2-2 ADC0809与AT89C51的接口电路当8051通过对0000H0007H(基本地址)中的某个口地址进行一次写操作,即可启动相应通道的AD转换;当转换结束后,ADC0809的EOC端向8051发出中断申请信号;8051通过对0000H0007H中的某个口地址进行一次读操作,即可得到转换结果。2.3 4个共阳7段数码管显示器
15、共阳极7段LED数码管和共阴极LED数码管结构类似,其引脚配置,如图所示。从图中可以看出7段LED数码管同样由8个发光二极管组成,其中7个发光二极管构成字形“8”,另一个发光二极管构成小数点。共阳极7段LED数码管的内部结构,如图所示。其中所有发光二极管的阳极为公共端,接+5v电压。如果发光二极管的阴极为低电平的时候,发光二极管导通,该字段发光;反之,如果发光二极管的阴极为高电平的时候,发光二极管截止,该字段不发光。 共阳极7段LED引脚配置 共阳极7段LED结构图2.4 系统整体工作原理1 硬件设计(1)系统构成该系统主要包括几大模块:数据采集模块、AD转换模块、控制模块、显示模块、按键模块
16、等。采用AT89C51作为控制模块,ADC0809作为AD转换模块的核心,ADC0809本身具有8路模拟量输入端口,通过C、B、A,3位地址输入端,能从8路中选择一路进行转换。如每隔一段时间依次轮流改变3位地址输入端的地址,就能依次对8路输入电压进行测量。LED数码管的显示采用软件译码动态显示,通过按键模块的操作可以选择8路循环显示,也可以选择某条单路显示。(2)数据采集电路数据采集电路是系统的主要组成部分,ADC0809具有8路模拟量输入通道IN0IN7,通过3位地址输入端C、B、A(引脚2325)进行选择。引脚22为地址锁存控制端ALE,当输入为高电平时,C、B、A引脚输入的地址锁存于AD
17、C0809内部锁存器中,经内部译码电路译码选中相应的模拟通道。引脚6为启动转换控制端START,当输入一个2 US宽的高电平脉冲时,就启动ADC0809开始对输入通道的模拟量进行转换。引脚7为AD转换器,当开始转换时,EOC信号为低电平,经过一段时间,换结束,转换结束信号EOC输出高电平,转换结果存放干ADC0809内部的输出数据寄存器中。引脚9脚为AD转换数据输出允许控制端OE,当0E为高电平时,存放于输出数据锁存器中的数据通过ADC0809的数据线DOD7输出。引脚10为ADC0809的时钟信号输人端CLOCK。在连接时,ADC0809的数据线D0D7与AT89C51的P1口相连接,ADC
18、0809的地址引脚、地址锁存端ALE、启动信号START、数据输出允许控制端OE分别与AT89C51的P3口相连接,转换结束信号EOC与AT89C52的P31相连接。2 软件设计(1)主程序主程序包含初始化部分,调用AD转换子程序和调用显示子程序。(2)数据处理子程序ADC0809转换之后输出的结果是8位二进制数。由公式(1)可知,当ADC0809输出为(1l1l11111)时,输入电压值V =500V当ADC0809输出为(00000000)时,输入电压值为0.0O0V;当ADC0809输出为(10000000)时,输入电压值V =250V。由于单片机进行数学运算时结果只取整数部分,因此当输
19、出为(10000000)时计算出的电压值V =2OOV,很不准确。为了提高精确度,必须把小数部分保留,具体运算方式如公式(2)。个位:Dout*196/10000 十分位:(Dout*196/1000)%10 百分位:(Dout*196/100)%10 千分位:(Dout*196/10)%10 由此得到较为精确的数值。对上面的硬件部分,按照软件流程框图进行软件设计。用C语言进行程序的编写。(下面的是C语言程序,最后面几页还有汇编程序及其算法说明,可自己选择)#include#include#define uchar unsigned charsbit P2_0=P20;sbit P2_1=P2
20、1; /定义数码管位码端口sbit P2_2=P22;sbit P2_3=P23;sbit OE=P30; /定义ADC0808端口sbit EOC=P31;sbit ST=P32;sbit P3_4=P34;sbit P3_5=P35;sbit P3_6=P36;uchar code table1=0x40,0x79,0x24,0x30,0x19,0x12;/带小数点的05六个uchar code tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;/共阳极09十个段码/段码uchar volt_data;void init();uch
21、ar i;/*/延时子程序/*void delay(uchar z)uchar x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*/将AD转换输出的数据转换成相应的/电压值并且显示出来/*void convert(uchar volt_data) P0=table1volt_data*196/10000; /AD转换的个位的电压值 P2_0=1; delay(2); P2_0=0; P0=tabvolt_data*196/1000%10; P2_1=1; /显示小数点的后的第一位 delay(2); P2_1=0; P0=tabvolt_data*196/100%10;
22、 P2_2=1; /显示小数点的后的第二位 delay(2); P2_2=0; P0=tabvolt_data*196/10%10; P2_3=1; /显示小数点的后的第二位 delay(2); P2_3=0; void main() uchar volt_data; init();/初始化子程序 while(1)if(i=5)i=0; ST=0; _nop_(); ST=1; _nop_(); ST=0; /启动AD转换 if(EOC=0) /等待转换结束 delay(2); while(EOC=0); OE=1;/允许输出 volt_data=P1; convert(volt_data);
23、 /调用数据处理子程序 delay(2);/暂存转换结果 OE=0;/关闭输出 void time0_int(void) interrupt 1TH0=(65536-1000)/256; TL0=(65536-1000)%256; i+; void init() P3_4=1;/选择通道3 P3_5=1; P3_6=0; TMOD=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; EA=1;ET0=1; i=0; TR0=1; 三、 设计框图31硬件总体框图该系统硬件总体框图由四个模块组成,如下图3所示。在芯片的选择中,一般的A/D芯片具有多路
24、转换通道,本课程设计中我们只做一路通道,该通道采集电压,对采集的电压值进行采集、处理并显示,我们还可以通过改变A/D芯片的参考电压来改变其量程,达到对电压值的多样化显示。A/D芯片将输入的模拟电压值转换为一个8位的二进制数字,再输送到单片机控制单元,经过处理显示出相应电压值。直流电压模数转换模块微控制器模块数码显示模拟电压数字电压程序控制控制模块3.2主程序流程图 设计程序部分时,主要应包括主函数和和几个功能子函数。主程序流程图如下图所示。3.3待测信号源单元电路待测信号源就是直流电压采集时,所须测电压值的信号源,其电路图如图3-3-1所示。 图3-3-1 待测信号源该部分实际上是一个滑动变阻
25、器均接在电源和地两端,中间的滑线端提供两路待测信号,该部分提供给模数转换的通道3。3.4 AT89C51单片机(如下图所示) 3.5单片机控制单元单片机控制单元是整个系统的核心中枢,对外围进行控制,对数据进行运算处理,是连接各部分的纽带。它主要包括51单片机芯片和其工作所必须的外围电路,如时钟振荡电路和复位电路等。3.51外部时钟电路主要是通过一个12MHZ的时钟晶振产生时钟信号,以作为单片机工作的外部时钟,其XTAL1和XTAL2分别接入到单片机上相对应的引脚。电路图如图3-5-1。图3-5-1 外部时钟电路(图中晶振标错了,应为12M,上图中我就不改了)外部时钟的晶振频率为12MHZ,则通
26、过该电路提供给单片机的时钟也为12MHZ. 3.52复位电路当对单片机的的reset引脚加超过两个机器周期以上的高电平时,可使单片机复位,即程序从头开始执行。设计的复位电路如图3-5-2所示:图3-5-2 复位电路3.53数码管显示模块选用了一片集成的共阴极数码管,每片是由4块8段数码管组成(包括小数点位)。这4块8断数码管共用相同的数据输入线,每块有一根片选线,只有选中了该数码管,它才会点亮并显示。而通过动态扫描原理可以使接在同一数据线的几块数码管显示不同的数。输入BCD码值,就可以在数码管上显示十进制数字。其中有电压表起校准对比作用。四、 实验仿真在Proteus仿真软件平台上搭建硬件电路
27、,在keil uv2上编写软件并经编译连接生产可执行的.hex文件,把该文件添加到在Proteus平台上搭建好的电路的单片机里。运行进行仿真调试。仿真时,数码管有示数,与标准电压表的示数差不多,说明各模块均在正常工作。例如,在5V量程下,标准电压表的显示值2.50V,而数码管显示2.406;标准电压表显示4.44V,数码管示值为4.420。数码管显示结果有误差是由于ADC0809输出的二进制码数转换为BCD码数的换算方法有一定误差导致。仿真结果如图4-1五、 实验总结本设计是基于ADC0809设计的电压检测装置。采用AT89C51单片机进行数据控制、处理,结构简单,元件较少,成本较低,软件采用
28、c语言实现,程序简单可读写性强,效率高。能够实现八路待测电压测量,还能够自由选择要测量的通道,与传统的电路相比,具有方便操作、处理速度快、稳定性高、性价比高的优点,具有一定的使用价值。通过本次课程设计,我对模数转换芯片ADC0809有进一步了解,故我将此次设计的重点放在了功能的扩展部分模块的实现方法及显示的改变上。大三学期教学实验中,通过网上资料及课本信息,我会会了简单的编程和设计最重要的是排版效果,在这些过程中我获益匪浅:加深了对模数转换的了解,能对其功能进行多元化的应用;数码管的显示技术上,我在以前所存静态显示的基础上,又掌握了动态扫描方法;另一个收获是在课程设计的过程中,我边学边用C语言
29、,对简单的C语言编程能够独立轻松的完成,C语言在单片机的编程中灵活,功能强大,效率高,简单明了,具有很多优势,学会它是此次课程设计的最大收获。本次课程设计,培养了我运用互联网查找资料和综合应用课本理论知识解决实际问题的能力。启发了我,在今后的学习过程中不能懒懒散散,学的要懂不懂,要把课本上的知识学精通,同时也要多学习课外知识来扩张自己的知识面;在计算和动手方面要更加的耐心加细心,才能把事情做得更好;在生活和学习中,要和身边的人团结互助,能帮的就要尽力帮。由于能力有限,我的课程设计难免有一些误差和错误,还望老师批评和指正! 致谢本课程设计是在我的导师张斌张老师的亲切关怀和悉心指导下完成的。他严肃
30、的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,张老师都始终给予我细心的指导和不懈的支持。虽然只有短短的一星期,张老师去教会我们很多。在此谨向郑老师致以诚挚的谢意和崇高的敬意。 另外,我还要感谢在一起愉快的度过这次课程设计的伙伴,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本文的顺利完成。特别感谢我的队友,他对本课题做了不少工作,给予我不少的帮助。 参考文献1.戴梅萼 史嘉权 微型计算机技术及应用 北京:清华大学出版社,20032.仇玉章 32位微型计算机原理与接口技术 北京:清华大学出版社,20013.郑学坚 周斌 微型计
31、算机原理及应用 北京:清华大学出版社,19984.李伯成 候伯亭 微型计算机及应用 西安:电子科技大学出版社,19985.邓元庆 贾鹏 数字电路与系统设计 西安:电子科技大学出版社,2003 下面是汇编程序,其中的BCD的转换算法不同,不过后有解释LED_0 EQU 30H;存放三个数码管的段码LED_1 EQU 31HLED_2EQU 32HADC EQU 35H;存放AD转换后的数据ST BIT P3.2OE BIT P3.0EOC BIT P3.1ORG 0000HLJMPMAINORG0030HMAIN:MOVLED_0,#00H ;给显示赋初值0 MOV LED_1,#00HMOV
32、LED_2,#00H SETB P3.4 SETB P3.5 CLR P3.6;选择通道3WAIT: CLR ST SETB ST CLR ST;启动AD转换 JNB EOC,$;等待转换结束 SETB OE;允许输出 MOV ADC ,P1;暂存转换结果 CLR OE;关闭输出 LCALL BCD;调用数据处理子程序 LCALL LED;调用显示程序,显示转换的值 SJMP WAIT;*;将AD转换输出的数据转换成相应的电压值;*BCD:MOVA,ADC;将AD转换结果转换成BCD码MOV B,#51 ;255/51=5.00V DIV AB MOV LED_2,A;个位数字存入LED_2中
33、 MOV A,B;余数大于19H,F0为1乘法溢出,结果加5 CLR F0 SUBB A,#1AH MOV F0,C MOV A, #10 MUL AB MOV B,#51 DIV AB JB F0,LOOP2 ADD A,#5LOOP2:MOV LED_1,A;小数后的第一位存入LED_1中 MOV A,B CLR F0 SUBB A,#1AH MOV F0,C MOV A,#10 MUL AB MOV B,#51DIV AB JB F0,LOOP3 ADD A,#5LOOP3:MOV LED_0,A;小数后的第二位存入LED_0中 RET;*; 显示程序;*LED:MOVA,LED_0;数
34、码显示子程序MOV DPTR,#TABLE ;送段码表首地址 MOVC A,A+DPTR SETB P2.3;允许百位输出,该数码管为共阳极形 MOV P0,A;将位段码送给P0口 LCALL DELAY;调用延时程序 CLR P2.3;关闭百位显示 MOV A,LED_1 MOV DPTR,#TABLE ;送段码表首地址 MOVC A,A+DPTR SETB P2.2;允许十位输出,该数码管为共阳极形 MOV P0,A;将位段码送给P0口 LCALL DELAY;调用延时程序 CLR P2.2;关闭十位显示 MOV A,LED_2 MOV DPTR,#TABLE2 ;送段码表首地址 MOVC
35、 A,A+DPTR SETB P2.1;允许个位输出,该数码管为共阳极形 MOV P0,A;将位段码送给P0口 LCALL DELAY ;调用延时程序 CLR P2.1;关闭个位显示 RET;*; 延时程序;*DELAY:MOV R6,#2;延时1MS子程序D1: MOV R7,#250 DJNZ R7,$ DJNZ R6,D1 RETTABLE:DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H, 82H,0F8H, 80H,90H;共阳极09十个段码TABLE2:DB 40H,79H,24H,30H,19H,12H;带小数点的05六个段码 END下面是BCD的转换算法的解释:(手机图片比较大,自己再处理一下)除以51,余数最大为50