1、11. 绪论 31.1 课程设计要求 .31.2 数字电压表介绍 .32. 硬件单元电路设计 32.1数字电压表结构框图 .32.1.1 AT89C51单片机简介 42.1.2 ADC0832转换器简介 42.1.3 时钟电路 62.1.4 复位电路 62.1.5 LED显示电路 73. 软件单元电路设计 73.1 主程序流程图 .73.2显示子程序流程图 .83.3 A/D转换子程序流程图 .93.4 数据处理子程序流程图 .94. 数字电压表仿真设计图与实物图 .104.1 仿真图 104.2 器件清单 104.3 硬件电路实物图 115. 程序代码 126. 项目设计总计 .1927.
2、参考文献 .191. 绪论1.1 课程设计要求使用单片机 AT89C51和 ADC0832设计一个数字电压表,能够测量 05V 之间的直流电压值,两位数码显示。在单片机的作用下,能监测两路的输入电压值,用 8位串行 A/D转换器,8 位分辨率,逐次逼近型,基准电压为 5V;能用两位 LED进行轮流显示或单路选择显示,显示精度 0.1伏。1.2 数字电压表介绍数字电压表简称 DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示。而 A/D 转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编码等几部分组成。因此 AD 转换是此次设计
3、的核心元件。输入的模拟量经过 AD 转换器转换,再由驱动器驱动显示器输出,便得到测量的数字电压。2. 硬件单元电路设计2.1数字电压表结构框图结构如(图 1)所示图 132.1.1 AT89C51单片机简介AT89C51 是一个低功耗,高性能 CMOS 8 位单片机,片内含 4k Bytes ISP(In-system programmable)的可反复擦写 1000 次的 Flash 只读程序存储器,器件采用 ATMEL 公司的高密度、非易失性存储技术制造,兼容标准MCS-51 指令系统 及 80C51 引脚结构,芯片内集成了通用 8 位中央处理器和ISP Flash 存储单元 ,AT89C
4、51 在众多嵌入式控制应用系统中得到广泛应用。51 单片机内包含以下几个部件:1) 8 位微处理器( CPU) 。2) 数据存储器(128B RAM) 。3) 程序存储器(ROM/EPROM) 。4) 4 个 8 位可编程并行 I/O 口(P0 口,P1 口,P2 口,P3 口) 。5) 1 个全双工的异步串行口。6) 2 个 16 定时器/计数器。7) 中断系统。8) 特殊功能寄存器(SFR) 。单片机片内结构如(图 2)所示:图 242.1.2 ADC0832转换器简介ADC0832 是美国国家半导体公司生产的一种 8 位分辨率、双通道 A/D转换芯片。由于它体积小,兼容性强,性价比高而深
5、受单片机爱好者及企业欢迎,其目前已经有很高的普及率。学习并使用 ADC0832 可是使我们了解 A/D转换器的原理,有助于我们单片机技术水平的提高。芯片如下(图 3)所示:芯片接口说明如下:CS_ 片选使能,低电平芯片使能。CH0 模拟输入通道 0,或作为 IN+/-使用。CH1 模拟输入通道 1,或作为 IN+/-使用。GND 芯片参考 0 电位(地)。DI 数据信号输入,选择通道控制。DO 数据信号输出,转换数据输出。CLK 芯片时钟输入。Vcc/REF 电源输入及参考电压输入(复用)。工作原理如下:正常情况下 ADC0832 与单片机的接口应为 4条数据线,分别是CS、CLK、DO、DI
6、。但由于 DO端与 DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将 DO和 DI 并联在一根数据线上使用。当ADC0832未工作时其 CS输入端应为高电平,此时芯片禁用,CLK 和 DO/DI 的电平可任意。当要进行 A/D转换时,须先将 CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK 输入时钟脉冲,DO/DI 端则使用 DI端输入通道功能选择的数据信号。在第1 个时钟脉冲的下沉之前 DI端必须是高电平,表示启始信号。在第 2、3 个脉冲下沉之前 DI端应输入 2 位数据用于选择通道功能。当此 2 位数据为
7、“1”、“0”时,只对 CH0 进行单通道转换。当 2位数据为“1”、“1”时,只对 CH1进行单通道转换。当 2 位数据为“0”、 “0”时,将 CH0作为正输入端IN+,CH1 作为负输入端 IN-进行输入。当 2 位数据为“0”、“1”时,将 CH0图 35作为负输入端 IN-,CH1 作为正输入端 IN+进行输入。到第 3 个脉冲的下沉之后 DI端的输入电平就失去输入作用,此后 DO/DI端则开始利用数据输出 DO进行转换数据的读取。从第 4个脉冲下沉开始由 DO端输出转换数据最高位DATA7,随后每一个脉冲下沉 DO端输出下一位数据。直到第 11个脉冲时发出最低位数据 DATA0,一
8、个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第 11个字节的下沉输出 DATD0。随后输出 8位数据,到第19 个脉冲时数据输出完成,也标志着一次 A/D转换的结束。最后将 CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。2.1.3 时钟电路XTAL1是片内振荡器的反相放大器输入端,XTAL2 则是输出端,使用外部振荡器时,外部振荡信号应直接加到 XTAL1,而 XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为 12MHz,时钟频率就为 6MHz。晶振的频率可以在 1MHz-24MHz内选择。电容取 30PF左右。系统的时钟电路设计是采用的内部
9、方式,即利用芯片内部的振荡电路如下(图 4)所示:2.1.4 复位电路由电容串联电阻构成,由图并结合“电容电压不能突变“的性质,可以知道,当系统一上电,RST 脚将会出现高电平,并且,这个高电平持续的时间由电路的 RC值来决定.典型的 51单片机当 RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合 RC的取值就可以保证可靠的复位.一般教科书推荐 C 取 10u,R取 8.2K.当然也有其他取法的,原则就是要让 RC组合可以在 RST脚上产生不少于 2个机周期的高电平.至于如何具体定量计算,可以参考电路分析相关书籍.复位电路如下(图 5)所示。图 4图 562.1.5 LED显示电路
10、本项目所用显示屏为 4 位 LED 显示屏。本 LED 显示器为 8 段(DP 为小数点段) ,每一段为一个发光二极管。发光二极管有共阳极和共阴极两种。本显示器的发光二极管为共阳极数码管。发光二极管的阳极连接在一起,通常在此共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示。通过给 LED 显示器提供不同的代码,是这些不同的 LED 显示器相应的段发光显示不同的字型,这些代码称为段码。本项目所用段码值如下 (表 1) 所示:显示字符0 1 2 3 4 5 6 7 8 9共阳极段码0x03 0x9f 0x25 0x0d 0x99 0x49 0x41 0x1f 0x
11、01 093. 软件单元电路设计3.1 主程序流程图主程序流程图如下(图 6)所示:表 1图 673.2显示子程序流程图显示子程序流程图如下(图 7)所示:图 783.3 A/D转换子程序流程图A/D转换子程序流程图如下(图 8)所示:3.4 数据处理子程序流程图数据处理子程序流程图,如下(图 9)所示:图 8图 994. 数字电压表仿真设计图与实物图4.1 仿真图如下(图 10)所示:4.2 器件清单如下(表 2)所示所用器件名称 型号及大小 个数单片机开发板 AT89C51 一个滑动变阻器 10K 两个AD转换器 ADC0832 一个LED 共阳 一个跳线插口 - 若干跳线 - 若干图 1
12、0表 2104.3 硬件电路实物图电路实物图如下(图 11)所示:电路实物图如下(图 12)所示:图 11图 12115. 程序代码#include #include /*端口定义*/sbit CS = P35;sbit Clk = P33;sbit DATI = P34;sbit DATO = P34;sbit P20=P24 ;/*定义全局变量*/unsigned char dat = 0x00; /AD值unsigned char count = 0x00; /定时器计数unsigned char CH; /通道变量unsigned char dis = 0x00, 0x00,0x00;
13、 /显示数值/*共阳 LED段码表*/unsigned char code tab=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09;char code tablewe= 0xfd,0xfb,0xf7,0xef,0xdf,0xfe ;/*函数功能:AD 转换子程序入口参数:CH出口参数:dat*/unsigned char adc0832(unsigned char CH)12unsigned char i,test,adval;adval = 0x00;test = 0x00;Clk = 0; /初始化DATI = 1;_nop_();CS
14、= 0;_nop_();Clk = 1;_nop_();if ( CH = 0x00 ) /通道选择Clk = 0;DATI = 1; /通道 0的第一位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 0; /通道 0的第二位_nop_();Clk = 1;_nop_(); elseClk = 0;DATI = 1; /通道 1的第一位_nop_();Clk = 1;13_nop_();Clk = 0;DATI = 1; /通道 1的第二位_nop_();Clk = 1;_nop_();Clk = 0;DATI = 1;for( i = 0;i = 1;if (D
15、ATO)test |= 0x80;else test |= 0x00;_nop_();Clk = 1;14_nop_();Clk = 0;if (adval = test) /比较前 8位与后 8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉dat = test;nop_();CS = 1; /释放 ADC0832DATO = 1;Clk = 1;return dat;/*函数功能:延时子程序入口参数:出口参数:*/void delay(void)int k;for(k=10;k500;k+);/*函数功能:将 0-255级换算成 0.00-5.00的电压数值入口参数:i出口参数:*
16、/15void convdata(unsigned char i) dis0 = i/51; /个位dis1 = (i%51)*10/51; /小数点后第一位 dis2 = (i%51)*10%51)*10/51; /小数点后第二位/*函数功能:数码管显示子程序入口参数:出口参数:*/void display(void) P2=0xff;P0=tabdis0 /显示个位和小数点 11111110delay();P2=0xdf; /11011111delay(); P2=0xff;P0=tabdis1; /显示小数点后第一位delay();P2=0xbf; /10111111delay();P2
17、=0xff;P0=tabdis2; /显示小数点后第二位delay();P2=0x7f; /01111111 delay();P2=0xff;16P0=0xff; /显示小数点后第二位delay();P2=0xef; /11101111delay();/*函数功能:主程序入口参数:出口参数:*/void main(void)P2=0xff; /端口初始化P0=0xff; delay();/延时CH = 0x00; /在这里选择通道 0x00 或 0x01TMOD = 0x01; /设置中断 TH0=(65536-50000)/256;/定时器 1初值定时 50msTL0=(65536-5000
18、0)%256;IE = 0x82;TR0 = 1;while(1) /主循环 dat = adc0832(CH); convdata(dat); /数据转换display(); /显示数值 /*17函数功能:定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位会不稳定入口参数:出口参数:*/void timer0(void) interrupt 1 TMOD = 0x01;TH0=(65536-50000)/256;/定时器 1初值定时 50msTL0=(65536-50000)%256;IE = 0x82;TR0 = 1;count+;if (count = 0x01)c
19、ount = 0x00;dat = adc0832(CH);186. 项目设计总计通过这次设计,使我深入了解了 AT89C51单片机和 ADC0832(AD 转换器)的结构和特点及数字电压表的工作原理,加深了对课本理论知识的理解,锻炼了实践动手能力,理论知识与实践设计相结合,培养了创新开发的思维。在此次课程设计中,收获知识的同时,我还收获了阅历。在此过程中,我们通过查找资料,请教老师,以及不懈的努力,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。7. 参考文献1 陈朝元,鲁五一.Proteus 软件在自动控制系统仿真中的应用J.系统仿真学报, 2008(1):318-320.2 毛谦敏.单片机原理及应用设计系统M北京:国防工业出版社,2008:22-26.3 康华光.电子技术基础(数字部分) M. 5版 . 北京:高等教育出版, 2005: 290-293. 19评 语成 绩指导教师(签字) 年 月 日