当前位置:文档之家› 多通道数字电压表设计2012山东理工大学

多通道数字电压表设计2012山东理工大学

目录一、设计任务及要求 (2)1.1设计任务 (2)1.2设计要求 (2)二、硬件电路设计 (2)2.1MCS-51单片机 (2)2.1.1单片机的引脚及其功能 (2)2.1.2单片机的时钟电路 (3)2.1.3单片机的复位电路 (3)2.2A/D转换模块设计 (4)2.2.1ADC0809的介绍 (4)2.2.2ADC0809时钟产生电路 (5)2.3通道选择模块设计 (5)2.4数码管显示电路 (5)2.5电源模块电路 (6)2.6下载模块电路 (6)三、软件设计部分 (7)3.1主程序流程图 (8)3.2A/D转换子程序流程图 (8)3.3显示子程序流程图 (9)3.4通道键值确定流程图 (9)四、结论 (10)参考文献 (10)附件 (11)一、设计任务与要求1.1设计任务利用单片机MCS-51和ADC0809设计一个多通道数字电压表,能够测量0—5V之间的8路直流电压值,并在四位LED上轮流显示。

1.2设计要求利用MCS-51单片机设计一个多通道数字电压表,可以测量0~5v的8路直流电压值,并在四位LED 上轮流显示。

测量最小分辨率为0.02V,测量误差约为±0.02v。

二、硬件设计本系统采用MCS-51单片机作为核心控制,对8路8位模数转换芯片ADC0809采集到的模拟电压信号进行分析处理,实现A/D转换,通过数码管显示其电压值。

电压表的测量电路主要由三个模块组成:A/D 转换模块、数据处理模块以及显示控制模块。

2.1MCS-51单片机MCS-51单片机在一块芯片上集成了CPU、ROM、RAM、定时器/计数器和多种I/O功能部件,具有一台微型计算机的基本结构,主要包括下列部件。

1个8位的CPU、1个布尔处理机、1个片内震荡器、128字节的片内数据存储器、4K字节的片内程序存储器、寻址范围为64K字节的外部数据存储器和程序存储器、21字节的专用存储器、4个并行I/O口、1个全双工的串行口、2个16位的定时器/计数器、5个中断源、2个中断优先级和111条指令,片内采用单总线结构。

2.1.1单片机的引脚及其功能AT89C51的引脚如图1所示。

图1AT89C51的引脚图各引脚的功能介绍如下所示:(1)VCC:运行和程序校验时接电源正端。

(2)P0口:P0口是一个8位、漏极开路的双向I/O口,每脚可吸收8个TTL门电流。

(3)P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。

(4)P2口:P2口是一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流。

(5)P3口:P3口是一个8位带内部上拉电阻的准双向I/O口,可接收输出4个TTL门电流。

(6)RST:复位输入信号,高电平有效。

(7)ALE/PROG:地址锁存允许信号,输出。

(8)/PSEN:片外程序存储器读选通信号,低电平有效。

(9)/EA/VPP:片外程序存储器访问允许信号,低电平有效。

(10)XTAL1:输入到单片微机内部振荡器的反相放大器。

(11)XTAL2:反相放大器的输出,输入到内部时钟发生器。

2.1.2单片机的时钟电路系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。

MCS-51单片机内部有一个用于构成振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。

这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。

外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。

对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性,电容应尽可能的选择陶瓷电容,电容值约为22pF。

振荡器的工作频率一般在1.2MHz~12MHz之间,由于制造工艺的改进,有些单片微机的频率范围正向两端延伸,高端可达40MHz,低端可达0Hz,一般用11.0592MHz晶振。

时钟电路图如图2所示[7]。

图2时钟电路2.1.3单片机的复位电路复位电路是上电自动复位加按键复位。

由于电容两端的电压不能突变,在上电的瞬间电容负端的电位和正端的电位相同都为高电平5V,紧接着电源给电容充电,经过很快的时间充电过程结束,电容对于直流电来说是断路,此时RST引脚通过R12接地。

整个过程会在RST引脚上产生一个维持几个机器周期的高电平脉冲足以使单片机有效复位。

手动按键复位同样是在按键按下的瞬间使电容完成先放电再充电的过程,也能产生一个维持几个机器周期的高电平脉冲使单片机有效复位。

RST引脚是复位信号的输入端,复位信号是高电平有效,其有效时间应持续24个振荡周期(即2个机器周期)以上。

若使用频率为12MHz的晶振,则复位信号应持续2µs以上,复位电路如图3所示[8]。

图3复位电路2.2A/D转换模块设计A/D转换器是模拟量输入通道中的一个环节,单片机通过A/D转换器把输入模拟量转换成数字量再处理,本设计用ADC0809转换器。

测量电压范围为0V~5V,ADC0809的精度可达到0.02V。

2.2.1ADC0809的介绍ADC0809是采样分辨率为8位的、采用CMOS工艺制成的8通道以逐次逼近原理进行模/数转换的器件。

其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

ADC0809的内部结构包括8路模拟选通开关、通道地址锁存器与译码器、8位A/D转换器和三态输出锁存器。

ADC0809的引脚功能,其引脚如图4所示。

图4ADC0809的引脚图IN0~IN7:模拟量输入通道。

A、B、C:地址线。

ALE:地址锁存允许信号。

START:启动转换信号。

D0~D7:数据输出线。

OE:输出允许信号。

CLOCK:时钟信号。

EOC:转换结束状态信号。

VCC:接+5V电源。

REF(+)、REF(-):参考电压。

2.2.2AD0809时钟产生电路该电路模块的工作过程:AD0809工作需要时钟电路,单片机ALE端输出为Fosc/6的方波信号,进过74HC74二分频后可做为AD0809的驱动时钟输入。

如图5。

图5时钟产生电路2.3通道选择模块设计矩阵式键盘的硬件结构比较简单,有行输出口和列输出口构成矩阵式键盘,按键设置在行、列的交点上。

图5所示为2*4矩阵式键盘的硬件结构。

图5矩阵式键盘电路2.4数码管显示模块电路显示电路采用四位数码管LG3641通过单片机以及锁存器573控制实现动态显示,通过单片机的P0口做为数据输出口。

U4为段码显示锁存器,U2为位码锁存器,使能端分别连接51单片机的P3.6和P3.7。

电路如图6。

图6数码显示模块电路2.5电源模块电路由于51单片机工作电压为5V,因此可以采用三端集成稳压器L7805的输出电压做为电压输入,如下图C8,C9为电源滤波电容,D1为电源工作指示灯。

图7数码显示模块电路2.6下载模块电路下载模块可以实现将程序烧写如51单片机内,原理为MAX232电平转换芯片可以实现PC机和单片机的电平匹配,同时PC机通过51单片机的串行发送(TXD)和接受(RXD)将程序下载到目标板上。

连接电路如图8。

图8下载模块电路三、系统软件设计软件设计分为主程序设计和子程序设计,下面分别加以说明。

初始化主要是对单片机,它主要包含显示缓冲区初始化。

准备工作做好后便启动ADC0809对模拟通道输入的0V~5V电压模拟信号进行数据采集并转换成相对应的0~255十进制数字量。

在数据处理程序中,运用标度变换知识,编写算法将0~255十进制数字量转换成0.00V~5.00V的数据,输出到显示子程序中进行显示。

3.1主程序流程图主程序包括初始化部分,调用A/D转换子程序和调用显示子程序,通道选择程序。

初始化键盘扫描通道选择启动AD接收数据数据处理显示图9主程序流程图3.2A/D 转换子程序流程图A/D转换子程序是用来控制对ADC0809的8路模拟输入电压的A/D转换,并将对应的数值移入70H~77H8个相应的存储单元中,其程序流程如图10所示。

A/D转换子程序每隔一定时间调用一次。

程序开始执行后首先通过手动控制拨码开关来选择8路模拟通道的一路进行模数转换。

接着启动一次A/D转换,通过判断转换结束状态信号EOC是否为1来判断A/D转换是否结束。

EOC=1,则表示A/D转换结束,否则EOC=0,则表示正在进行A/D转换。

接着输出允许信号OE=1,输出转换后的数据,就完成了一次A/D转换,程序返回到数据处理模块。

只要手动控制模拟通道就可以不停的循环进行模数转换。

图10A/D 转换流程图3.3显示子程序流程图LG3641数码管为4位共阴数码管,采用74hc573锁存器以及单片机控制实现显示功能,显示原理为分时显示,即通过51单片机PO口分时输出数据到573并锁存显示,显示电路共用两片74HC573一片为位选功能,另一片为段选功能。

流程图如图11.开始判断地址码启动一次A/D 转换EOC=1取数据(OE=1)是返回EOC=1A/D 转换结束开始初始化位选数据信号输出至P0口段选数据信号输出至P0口返回4位数据显示完成?是否图11显示流程图3.4通道选择程序流程图图11按键键值处理流程图四、结论由于本设计使用高效的51系列单片机作为核心的测量系统,以及高精度高速度高抗干扰的AD0809转换器。

使得数字电压表具体精度高,灵敏度强,性能可靠,电路简单,成本低等特点。

在电路设计中我总结出,硬件选择,不仅要功能复合逻辑,成本低廉,更重要的是要达到系统的设计要求,有高的系统稳定性和安全性。

在此次设计中,通过对各种备选方案的综合比较,采用ADC0809可以很好地实现设计要求,达到了误差0.02V 的要求。

因为单片机系统设计是硬件和软件相结合的设计,所以系统和硬件软件必须紧密配合,协调一致,应不断调整硬软件设计,以提高系统工作效率。

再设计时已经充分考虑到了软件的可行性,方便了后期系统软件的编写。

通过此次单片机课程设计,我进一步掌握了单片机的内部资源及机构,并熟练掌握了单片机外围硬件的搭建过程。

在课程设计过程中,也遇到过一些问题,但经过查阅相关书籍和芯片资料,问题都得以解决,同时也提高了自己查阅资料的能力。

此次设计不仅是对所学课程的巩固,更为以后自己从事电子电路开发打下了坚实的基础。

参行扫描开始P2口低两位为10?P2口低两位为01?列扫描,确定键值返回是否列扫描,确定键值参考文献:1.姜志海黄玉清刘连鑫《单片机原理及应用》电子工业出版社2.何立民编《单片机应用技术选编》北京航空航天大学出版社3.童诗白编《模拟电子技术基础》高等教育出版社4.何希才编《传感器及其应用电路》电子工业出版社5.李大有,《单片机应用与设计》,电子工业大学出版社6.赵茂泰,《智能仪器原理及应用》,电子工业出版社7.柳淳,徐玮.单片机开发应用技能与技巧.北京:中国电力出版社,20088.余永权,汪明慧,黄英.单片机在控制系统中的应用.北京:电子工业出版社,9.彭树生.单片机实践与系统设计.北京:电子工业出版社,200710.李元.数字电路与逻辑设计.江苏:南京大学出版社,1997附件一源程序#include<reg52.h>#include<instrins.h>#define uchar unsigned char#define uint unsigned intsbit OE=P2^7sbit start=P2^6sbit EOC=P3^3sbit C=P3^2sbit B=P3^1sbit A=P3^0sbit LATCH1=P2^2;//定义锁存使能端口段锁存sbit LATCH2=P2^3;//位锁存Unsigned char code TempData[4];Unsigned char code dofly_DuanMa[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7};//分别对应相应的数码管点亮,即位码1-4位uchar m,n;uint Chanel,Baiwei,Shiwei,Gewei;//延时时间为1msvoid Delay(uint i){uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void delay(){int i,j;for(i=0;i<=10;i++)for(j=0;j<=2;j++);}/*------------------------------------------------AD初始化函数------------------------------------------------*/void AD0809_init(void){if(DS4==0){A=0;B=0;C=0;}if(DS4==1){A=0;B=0;C=1;}if(DS4==2){A=0;B=1;C=0;}if(DS4==3){A=0;B=1;C=1;}if(DS4==4){A=1;B=0;C=0;}if(DS4==5){A=1;B=0;C=1;}if(DS4==6){A=1;B=1;C=0;}if(DS4==7){A=1;B=1;C=1;}start=1;Delay(2);start=0;}/*------------------------------------------------AD转换结束中断服务函数------------------------------------------------*/void int1(void)interupt1using0{ET1=1;//开外部中断1if(EOC==1){OE=1;//0809输出使能置位_n0p_;m=P0;//读0809转换值}n=int(int(m)/256*500);//转换成百位数(0——500)TempData[0]=dofly_DuanMa[Chanel];Baiwei=int(n/100);//取百位数值TempData[1]=dofly_DuanMa[Baiwei];Shiwei=n%100/10;//取十位数值TempData[2]=dofly_DuanMa[shiwei];gewei=n%10;//取个位数值TempData[3]=dofly_DuanMa[shiwei];}/*------------------------------------------------键盘扫描函数,使用行列逐级扫描法------------------------------------------------*/unsigned char KeyScan(void){unsigned char Val;KeyPort=0xf0;//高四位置高,低两位拉低if(KeyPort!=0xf0)//表示有按键按下{DelayMs(10);//去抖if(KeyPort!=0xf0){//表示有按键按下KeyPort=0xfe;//检测第一行if(KeyPort!=0xfe){Val=KeyPort&0xf0;Val+=0x0e;while(KeyPort!=0xfe);DelayMs(10);//去抖while(KeyPort!=0xfe);return Val;}KeyPort=0xfd;//检测第二行if(KeyPort!=0xfd){Val=KeyPort&0xf0;Val+=0x0d;while(KeyPort!=0xfd);DelayMs(10);//去抖while(KeyPort!=0xfd);return Val;}}}return0xff;}/*------------------------------------------------按键值处理函数,返回扫键值------------------------------------------------*/unsigned char KeyPro(void){switch(KeyScan()){case0x7e:return0;break;//0按下相应的键显示相对应的码值case0x7d:return1;break;//1case0x7b:return2;break;//2case0x77:return3;break;//3case0xbe:return4;break;//4case0xbd:return5;break;//5case0xbb:return6;break;//6case0xb7:return7;break;//7default:return0xff;break;}}/*------------------------------------------------中断初始化函数------------------------------------------------*/Void it_int(){EA=1;//开总中断ET1=1;//开外部中断1IT1=1;//外部中断1边沿促发}/*------------------------------------------------显示子程序------------------------------------------------*/void Display(unsigned char FirstBit,unsigned char Num) {unsigned char i;for(i=0;i<Num;i++){DataPort=0;LATCH1=1;LATCH1=0;DataPort=dofly_WeiMa[i+FirstBit];LATCH2=1;LATCH2=0;DataPort=TempData[i];LATCH1=1;LATCH1=0;Delay(200);//}}/*------------------------------------------------主函数------------------------------------------------*/void main(){it_int();//外部中断初始化while(1){Chanel=KeyPro();//通道键值设定AD0809_init();Display(0,4);}}。

相关主题