八路输入模拟信号的数值显示电路作品简介八路输入模拟信号的数值显示电路由以下几部分组成:电源部分,模数转换部分,主控部分,数码显示部分,驱动单元这五个主要单元。
电源部分是由220V电压通过变压器变压变成±12V的正弦波,在经过全桥电路和滤波电容在经过7805后变成5V固定电压,数模转换部分是由ADC0809数模转换模块提供,它的采样频率为8位、是一种以逐次逼近原理进行模—数转换的器件。
其内部有一个8通道多路开关,它可以根据地址锁存译码后的信号,只选通8个模拟输入信号中的一个进行A/D转换,主控电路有单片机STC89C52组成,它是整个电路的核心。
而数码显示电路是由4位共阳极数码管提供,驱动部分采用PNP型的三极管来驱动数码管。
74LS74作为四分频使用,来提供ADC0809的时钟。
引言部分智能仪器是计算机技术和测量仪器结合的产物,是含有微计算机或微处理器的测量仪器,由于他拥有对数据的存储、运算、逻辑判断及自动化操作等功能,具有一定智能作用,因而被称之为智能仪器。
智能仪器的出现,极大地扩充了传统仪器的应用范围。
智能仪器实质上是一种硬件和软件的结合设计,并且充分利用了软件技术的强大功能,它把仪器的主要功能集中放在程序存储器ROM中,因而,当需要增加功能时,不需要全面改变硬件设计,而只要修改存放在ROM中的软件内容就可以很放便地改变仪器的功能。
智能仪器凭借其体积小、功能强、功耗低等优势,迅速地在家用电器、科研单位和工业企业中得到了广泛的应用。
因此单片机的应用使智能仪器具有以下功能特点:1、具有友好的人—机对话能力。
2、自动矫正零点满度和切换量程。
3、多点快速检测。
4、自动修正各类测量误差。
5、数字滤波。
6、数据处理。
7、各种控制规律。
8、多种输出形式。
9、数据通信。
10、自诊断和故障监控。
11、掉电保护。
模数转换:把连续变化的模拟量转化为在时间和幅值上离散的数字量。
模数转换器:实现模数转换的电路或器件,又称A/D转换器或ADC。
ADC是模拟量和数字量之间不可缺少的桥梁。
A/D转换器在数字控制系统中拥有重要的地位。
A/D转换器将各种模拟信号转换为抗干扰性更强的数字信号,直接进入数字计算机上进行处理,存储并产生数字控制信号。
1 总体方案:把ADC0809的ALE的引脚置为高电平,地址锁存与译码器将A, B,C 三条地址线的地址信号进行锁存,经过一段延时,然后把ALE的引脚设为低电平。
接着把START引脚置为高电平,经过一段延时,然后置为低电平,再经过一段延时,此时开始模数转换。
当OE为高电平时。
把转换好的数字量存放在内存某单元中,然后把OE置为低电平,延时,用这种方式依次把八个通道的模拟量转换为数字量存放在假设的某个单元中。
当单片机接收到ADC0809的转换结束性号信号后(既OE为低电平) 。
转换结果放在P0口。
单片机取P0口数据并进行BCD码调整,再通过P1口把调整后的数值送到数码管上显示,按照这样的方式依次把内存单元的八个单元的值在数码管上依次显示出来。
采用动态扫描的方式依次选通四个共阳数码管,第四个数码管显示通道数、第三个数码管显示一横、第二个数码管显示个位、第一个数码管显示十位,使得转换好的数值依次在数码管上显示出来。
我们采用ADC0809作A/D 转换器,STC89C51作控制器,74HC74作二分频器。
开机后能自动轮流显示8路输入的模拟电压值,输入电压在0— 5V范围内,显示值在0—255范围内。
内存中有八个单元存放采样值,四个单元存放显示数据,依次为十位、个位、一横和通道标志位。
总体框图2 硬件设计2.1 电源部分本系统由220V市交流电通过变压器降为9V的交流电,然后再通过整流电路和电容一次得到直流电,接着和7805的输入端1脚相连,7805 的2脚接地,7805的3脚输出,再经过电容的二次滤波输出5V的直流电源,提供给整个系统工作。
系统电源的提供2.2 主控单元STC89C52STC89C52RC/RD+系列单片机的宏晶科技推出的新一代超强抗干扰、高速、低功耗的单片机,指令代码完全兼容于传统的8051单片机。
12时钟|机器周期和6时钟|机器周期可任意选择。
其加密性强,低功耗,超低价,高速,高可靠,强抗静电,强抗干扰最新的D版本内部集成MAX810专用复位电路图2.2 STC89C52其特点如下:增强型6 时钟/ 机器周期,12 时钟/ 机器周期8051 CPU工作电压:5.5V - 3.4V(5V 单片机)/ 3.8V - 2.0V(3V 单片机)工作频率范围:0 - 40 MHz,相当于普通8051 的0~80MHz.实际工作频率可达48MHz.用户应用程序空间4K / 8K / 13K / 16K / 20K / 32K / 64K 字节片上集成1280 字节/ 512 字节RAM通用I/O 口(32/36 个),复位后为:P1/P2/P3/P4 是准双向口/ 弱上拉(普通8051 传统I/O 口)P0 口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻。
I S P (在系统可编程)/ I A P (在应用可编程),无需专用编程器/ 仿真器可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 秒即可完成一片 EEPROM 功能看门狗内部集成M A X 8 1 0 专用复位电路(D 版本才有),外部晶体2 0 M 以下时,可省外部复位电路共3 个16 位定时器/ 计数器,其中定时器0 还可以当成2 个8 位定时器使用外部中断4 路,下降沿中断或低电平触发中断,Power Down 模式可由外部中断低电平触发中断方式唤醒通用异步串行口(UART),还可用定时器软件实现多个UART工作温度范围:0 - 75℃/ -40 - +85℃封装:PDIP-40,PLCC-44,PQFP-442.2.1 单片机的抗干扰能力选择自身抗干扰能力强的单片机,对提高单片机系统的可靠性起到事半功倍的作用。
1.I/O口结构单片机的I/O直接与外界相连,是引入干扰的重要途径。
单片机I/O口的抗干扰措施是:输入口内带施密特触发器,中耐压输入缓冲,对大功率输出引脚采用小功率管并联技术等。
2.系统时钟在指令执行速度不变的前提下,尽量降低单片机外时钟的速度,降低外时钟的干扰。
3.电源脚排列将电源脚与地线脚排在相邻的位置上。
4.时钟监视,低电压复位注意了以上几方面的问题,就使单片机具有较强的自身抗干扰能力。
2.2.2 晶振石英晶体也连接在晶振引脚的输入和输出之间,等效为一个并联谐振回路,振荡频率应该是石英晶体的并联谐振频率。
晶体旁边的两个电容接地,实际上就是电容三点式电路的分压电容,接地点就是分压点。
2.2.3 复位复位电路工作原理是利用RC元件,给电容充电,电容的电压缓慢上升直到Vcc,没到Vcc时芯片复位脚近似低电平,于是芯片复位,接近Vcc时芯片复位脚近高电平,于是芯片停止复位,复位完成。
2.3 分频器本系统的频器工作原理是利用一个74LS74的集成块提供,原理图中利用两个D触发器串联达到分频的目的。
2.4 模数转换ADC0809ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。
多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D 转换器进行转换。
三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
ADC0809 芯片性能特点: 是一个逐次逼近型的A/D 转换器,外部供给基准电压;单通道转换时间116us;分辨率为8 位,带有三态输出锁存器,转换结束时,可由CPU 打开三态门, 读出8 位的转换结果;有8 个模拟量的输入端,可引入8 路待转换的模拟量。
图2.4 ADC08092.5 驱动单元我们利用PNP型三极管实现动态扫描,依次选通四个数码管。
即当三极管的基极和单片机相连的端口为低电平时,三极管工作,进而选通数码管,同时三极管具有放大作用,三极管是一种电流放大器件,但在实际使用中常常利用三极管的电流放大作用,通过电阻转变为电压放大作用。
2.6 LED数码管显示LED显示块是由发光二极管显示字段的显示器件。
在单片机应用系统中通常使用的是七段LED。
这种显示块有共阴极与共阳极两种。
共阴极LED显示块的发光二极管阴极共地。
当某个发光二极管的阴极为高电平时,发光二极管点亮;共阳极LED显示块的发光二极管阴极并接。
3 系统软件设计3.1 主程序部分主程序的功能主要是首先进行初始化,然后ADC0809采集数据进行模数转换,最后通过单片机STC89C52把数据送到数码管,在数码管上依次显示8个通道转换后的值。
3.2 模数转换部分首先把转换值存放在内存某单元,设初值,再启动测试程序,查按键,A/D检测通道,更新显示,判断8路模数转换是否结束,若没结束则返回到测试启动程序,若转换结束则恢复端口。
3.3 显示部分用内存某些单元存放8路信号循环显示控制的数据和采样值。
然后把显示数据转换为三位BCD码分别存入某单元。
调用四位显示程序,在P1口输出数据,然后用动态扫描,依次选通四个数码管并查表显示数据,完成后返回到显示数据转换为BCD码的那部分。
总结内容本课题设计总体上来说是顺利完成了,但由于时间和自己的理论知识和实践操作水平有限,致使作品的有些功能并没有达到预期效果,在老师和其他两位同学的团结努力下大部分功能基本上实现。
总的来说还是不错的。
在这次的毕业设计过程中我们三人小组通过不断的讨论和探索查阅资料,最终完成了此次的毕业设计,在此过程中,我从对单片机C语言的生疏,到了解,再到深入研究,第一次完成了一件实际应用的设计,感觉有不少的收获:1.巩固了以前学的专业知识,并在以前的基础上理解的更加透彻,掌握的更加熟练;2.锻炼了自己的实际应用能力,将课本上学到的理论知识和实际生产联系了起来;3.增强了自己独立解决问题的能力。
虽然,在这个过程中我们也曾遇到了不少困难,但是,在老师和同学们的热情帮助和我自己的不懈努力下,所有的难题都被我们逐个解决,我也从中获得了胜利的喜悦。
这也让我明白了一个道理:前途是光明的,道路是曲折的,只有靠自己顽强拼搏的精神和坚持不懈的努力才能够到达成功的彼岸。
正所谓:天下无难事,只要肯攀登。
只要有契而不舍的精神,就没有办不到的事!总之,通过这次的毕业设计我确实的获得了不少的东西。
附录使用说明如下图所示:当电路通电时首先显示的是模拟值从05-0到00-7,当按下促发按钮P3.2时,按着不动则显示数字值从FF-0到00-7。
其中千位和百位两位数码管显示的是模拟值或数字值,十位是显示‘—’位显示的是通道值0到7。
原理图参考程序#include <at89x52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intUcharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88, 0x83,0xc6,0xa1,0x86,0x8e};uchar code sel[]={0x7f,0xbf,0xdf,0xef};uchar dis[]={0x00,0x00,0x00,0x00};uchar cnt,ad_cnt,ad1,ad2,ad3,ad4,sign,adval;uint count,tmp,ad;sbit key =P3^2;//sbit start=P3^6;//AD启动sbit en =P3^7;//AD out enablesbit adda =P3^3;//AD通道选择sbit addb =P3^4;//sbit addc =P3^5;///*----------------------------------------------*//*----------------------------------------------*/ void init() //定时器初始化{TMOD=0X01;TH0=(63535-4000)/256;TL0=(63535-4000)%256;EA=1;TR0=1;ET0=1;}/*----------------------------------------------*/ void timer0() interrupt 1 //定时器中断{TH0=(63535-4000)/256;TL0=(63535-4000)%256;if(++cnt>=4){cnt=0;}P0=0xff;P0=dis[cnt];P2=sel[cnt];count++;}void delay(uchar k) //延时{uchar i,j;for(i=0;i<k;i++)for(j=0;j<121;j++){;}}/*----------------------------------------------*/ uchar adc0809(uchar num) //AD转换程序{en=0;start=0;switch(num){case 0x00: addc=0;addb=0;adda=0;break;case 0x01: addc=0;addb=0;adda=1;break;case 0x02: addc=0;addb=1;adda=0;break;case 0x03: addc=0;addb=1;adda=1;break;case 0x04: addc=1;addb=0;adda=0;break;case 0x05: addc=1;addb=0;adda=1;break;case 0x06: addc=1;addb=1;adda=0;break;case 0x07: addc=1;addb=1;adda=1;break;}start=1;_nop_();start=0;delay(50);en=1;return P1;}void main() //主程序{init();while(1){if(count>400){count=0;ad_cnt++; //通道切换if(ad_cnt>=8)ad_cnt=0;ad1=adc0809(ad_cnt);delay(10);ad2=adc0809(ad_cnt);delay(10);ad3=adc0809(ad_cnt);delay(10);ad4=adc0809(ad_cnt);delay(10);tmp=ad1+ad2+ad3+ad4;ad=tmp/4; //4次测量取平均值adval=(ad*50)/255; //16进制到电压值转换if(key){dis[0]=seg[ad_cnt];dis[1]=0xbf;dis[3]=seg[adval/10]&0x7f;dis[2]=seg[adval%10];}else{dis[0]=seg[ad_cnt];dis[1]=0xbf;dis[3]=seg[ad/16];dis[2]=seg[ad%16];}}}}。