目录摘要 (I)1 绪论 (1)1.1数字电压表介绍 (1)1.2仿真软件介绍 (1)1.3 本次设计要求 (2)2 单片机和AD相关知识 (3)2.1 51单片机相关知识 (3)2.2 AD转换器相关知识 (4)3 数字电压表系统设计 (5)3.1系统设计框图 (5)3.2 单片机电路 (5)3.3 ADC采样电路 (6)3.4显示电路 (6)3.5供电电路和参考电压 (7)3.6 数字电压表系统电路原理图 (7)4 软件设计 (8)4.1 系统总流程图 (8)4.2 程序代码 (8)5 数字电压表电路仿真 (15)5.1 仿真总图 (15)5.2 仿真结果显示 (15)6 系统优缺点分析 (16)7 心得体会 (17)参考文献 (18)1 绪论1.1数字电压表介绍数字电压表简称DVM,数字电压表基本原理是将输入的模拟电压信号转化为数字信号,再进行输出显示。
而A/D转换器的作用是将连续变化的模拟信号量转化为离散的数字信号,器基本结构是由采样保持,量化,编码等几部分组成。
因此AD转换是此次设计的核心元件。
输入的模拟量经过AD转换器转换,再由驱动器驱动显示器输出,便得到测量的数字电压。
本次自己的设计作品从各个角度分析了AD转换器组成的数字电压表的设计过程及各部分电路的组成及原理,并且分析了数模转换进而使系统运行起来的原理及方法。
通过自己的实践提高了动手能力,也只有亲历亲为才能收获掌握到液晶学过的知识。
其实也为建立节约成本的意识有些帮助。
本次设计同时也牵涉到了几个问题:精度、位数、速度、还有功耗等不足之处,这些都是要慎重考虑的,这些也是在本次设计中的收获。
1.2仿真软件介绍Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。
它运行于Windows 操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:(1)现了单片机仿真和SPICE电路仿真相结合。
具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
(2)支持主流单片机系统的仿真。
目前支持的单片机类型有:68000系列、8051系列、A VR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。
(3)提供软件调试功能。
在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。
(4)具有强大的原理图绘制功能。
可以仿真51系列、A VR、PIC、ARM、等常用主流单片机。
还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。
配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
PROTEUS 是单片机课堂教学的先进助手。
PROTEUS不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。
前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。
它的元器件、连接线路等却和传统的单片机实验硬件高度对应。
这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。
课程设计、毕业设计是学生走向就业的重要实践环节。
由于PROTEUS提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台。
1.3 本次设计要求本次设计的作品要求制作数字电压表的量程为0到10v,由于用到的模数转换芯片是ADC0809,设计系统给的供电电压为+5v,所以能够测量的电压范围为-0.25v到5.25v之间,但是一般测量的直流电压范围都在这之上,所以采用电阻分压网络,设计的电压测量范围是0到25v之间,满足设计要求的最大量程5v的要求。
同时设计的精度为小数点后三位,满足要求的两位小数的精度,在不考虑AD芯片的量化误差的前提下,此次设计的精度能够满足一般测量的要求。
2单片机和AD相关知识2.1 51单片机相关知识51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。
该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。
单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。
51系列单片机内包含以下几个部件:一个8位CPU;一个片内振荡器及时钟电路;4KB的ROM程序存储器;一个128B的RAM数据存储器;寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;32条可编程的I/O口线;两个16位定时/计数器;一个可编程全双工串行口;5个中断源、两个优先级嵌套中断结构。
51系列单片机如下图:图1 51单片机引脚图2.2 AD转换器相关知识ADC0809是美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式AD转换器。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
(1)主要特性:1)8路输入通道,8位A/D转换器,即分辨率为8位。
2)具有转换起停控制端。
3)转换时间为100μs(时钟为640kHz时),130μs(时钟为500kHz时)4)单个+5V电源供电5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度7)低功耗,约15mW。
(2)内部结构ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
图2 ADC0909引脚武汉理工大学《单片机原理与应用》课程设计说明书3 数字电压表系统设计3.1系统设计框图此次设计的是数字电压表,要求的电压范围是0~5v,而设计扩展的量程为0~25v。
系统设计主要包括四个部分:分别是电源模块、AD模数转换部分、51单片机最小系统部分、1602液晶显示部分。
首先由单片机初始化ADC0809模数转换芯片和1602液晶显示,当外接被测电压后,ADC0809将模拟电压信号转换为数字信号输入到单片机的I/O口,通过单片机处理后将电压的大小显示在1602液晶上面。
如下是本次设计作品的框图:图3 系统框图3.2 单片机电路单片机最小系统如下图所示,各个引脚都已经标出,而且四个I/O口都已经用排阵引出,方便外接I/O扩展用。
图4 单片机最小系统武汉理工大学《单片机原理与应用》课程设计说明书3.3 ADC采样电路由于ADC0809是带地址锁存的模数转换器件,ADDA、ADDB、ADDC为模拟通道选择,编码为000~111分别选中IN0~IN7。
ALE为地址锁存信号,其上升沿锁存ADDA、ADDB、ADDC的信号,译码后控制模拟开关,接通八路模拟输入中相应的一路。
CLK为输入时钟,为AD转换器提供转换的时钟信号,典型工作频率为640KHz。
START为AD转换启动信号,正脉冲启动ADDA~ADDC选中的一路模拟信号开始转换。
OE为输出允许信号,高电平时候打开三态输出缓存器,是转换后的数字量从D0~D7输出。
EOC为转换结束信号,启动转换后EOC变为低电平,转换完成后EOC编程高电平。
图5 ADC模数转换3.4显示电路以下是1602液晶引脚的接线图,中间没有接线的为数据控制端口。
1602字符型通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样:图6 1602引脚图武汉理工大学《单片机原理与应用》课程设计说明书3.5供电电路和参考电压由于此次系统的芯片工作电压为+5v,所以用常用的三端稳压器LM317和LM337构成的电源系统供电,其中ADC0809要提供一个准确的参考电源才能正常的工作,而LM317正好能够达到要求。
图7 系统供电部分3.6 数字电压表系统电路原理图如下是此次数字电压表系统的总原理图,其中的连线用网络标号表示出来,省去了连线的麻烦,而且是总图的可读性增强。
图8 数字电压表总原理图4 软件设计4.1 系统总流程图此次设计的数字电压表系统比较简单,就设置了一个量程为0~25v,所以没有用到按键控制,也没有其他的功能,因此程序比较简单,在输入模拟信号时采用电阻分压,最终的采样输入电压只有实际输入电压的十分之一,所以在编写程序中要编写一段数据调整程序,如下为系统总流程图:图9 系统流程图4.2 程序代码/********电压表********/#include<reg52.h>#include<intrins.h>//库函数头文件,代码中引用了_nop_()函数/*ADC初始定义*/sbit start=P3^0; //转换开始控制sbit oe=P3^2; //输出允许控制sbit eoc=P3^1; //转换结束信号sbit clock=P3^3; //转换时钟sbit P0_2=P0^2; //蜂鸣器sbit P0_5=P0^5;sbit P0_6=P0^6;sbit P0_7=P0^7;/*1602液晶初始定义*/sbit RS=P0^0; //读控制sbit RW=P0^3; //写控制sbit E=P0^1; //使能端unsigned char da0,da1,da2,da3,da4;unsigned int temp;unsigned int d1,d2,d3;unsigned char dat; //数字电压量unsigned char lcdd[]="0123456789";void lcd_w_cmd(unsigned char com); //写命令函数void lcd_w_dat(unsigned char dat); //写数据函数void display(unsigned char dat); //显示函数unsigned char lcd_r_start(); //读状态函数void int1(); //LCD初始化函数void delay(unsigned char t); //可控延时函数void delay1(); //软件实现延时函数,5个机器周期/*显示函数部分*/void display(unsigned char dat){temp=5*dat; //量程扩大五倍da0=temp/51/10; //十位da1=temp/51%10; //个位d1=temp%51;d1=d1*10;da2=d1/51; //十分位d2=d1%51;d2=d2*10;da3=d2/51; //百分位d3=d2%51;d3=d3*10;da4=d3/51; //千分位lcd_w_cmd(0x0c); //设置光标不显示、不闪烁delay(20);lcd_w_cmd(0xc0); //第二行起始显示地址0x80 delay(20);delay(2);lcd_w_dat('V'); //显示字符串‘volatage is’lcd_w_dat('o');lcd_w_dat('l');lcd_w_dat('a');lcd_w_dat('t');lcd_w_dat('a');lcd_w_dat('g');lcd_w_dat('e');lcd_w_dat(' ');//显示电压的大小lcd_w_dat(lcdd[da0]); //十位lcd_w_dat(lcdd[da1]); //个位lcd_w_dat('.'); //小数点lcd_w_dat(lcdd[da2]); //十分位lcd_w_dat(lcdd[da3]); //百分位lcd_w_dat(lcdd[da4]); //千分位lcd_w_dat('V'); //单位/*主函数*/void main(){P0_2=1; //关蜂鸣器P0_5=P0_6=P0_7=0; //选择000第一通道int1(); //LCD初始化while(1){start=0;start=1; //获得上升沿复位start=0; //获得下降沿启动转换,同时ALE开锁存do{clock=~clock; //时钟信号}while(eoc==0); //等待转换结束,eoc=1结束oe=1; //三态锁存缓冲器打开dat=P1; //数字电压信号输出oe=0; //三态锁存缓冲器关闭display(dat);}}/*延时函数*/void delay(unsigned char t){unsigned char j,i;for(i=0;i<t;i++)for(j=0;j<20;j++);/*延时函数1*/void delay1(){_nop_();_nop_();_nop_();}/*LCD初始化函数*/void int1(){lcd_w_cmd(0x3c); // 设置工作方式lcd_w_cmd(0x0c); // 设置光标lcd_w_cmd(0x01); // 清屏lcd_w_cmd(0x06); // 设置输入方式lcd_w_cmd(0x80); // 设置初始显示位置}/*LCD读状态函数*///返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD控制器忙unsigned char lcd_r_start(){unsigned char s;RW=1; //RW=1,RS=0,读LCD状态delay1();RS=0;delay1();E=1; //E端时序delay1();s=P2; //从LCD的数据口读状态delay1();E=0;delay1();RW=0;delay1();return(s); //返回读取的LCD状态字}/*LCD写命令函数*/void lcd_w_cmd(unsigned char com){unsigned char i;do{ // 查LCD忙操作i=lcd_r_start(); // 调用读状态字函数i=i&0x80; // 与操作屏蔽掉低7位delay(2);}while(i!=0); // LCD忙,继续查询,否则退出循环RW=0;delay1();RS=0; // RW=0,RS=0,写LCD命令字delay1();E=1; //E端时序delay1();P2=com; //将com中的命令字写入LCD数据口delay1();E=0;delay1();RW=1;delay(255);;}/*LCD写数据函数*/void lcd_w_dat(unsigned char dat){unsigned char i;do{ // 查忙操作i=lcd_r_start(); // 调用读状态字函数i=i&0x80; // 与操作屏蔽掉低7位delay(2);}while(i!=0); // LCD忙,继续查询,否则退出循环RW=0;delay1();RS=1; // RW=1,RS=0,写LCD数据delay1();E=1; // E端时序delay1();P2=dat; // 将dat中的显示数据写入LCD数据口delay1();E=0;delay1();RW=1;delay(255);}5 数字电压表电路仿真5.1 仿真总图为了验证此次设计原理图的正确性,在制作实物之前用专业软件做了仿真,在Proteus 软件中设置AT89C51单片机的晶振频率为12 MHz。