电子设计应用软件训练总结报告一.任务说明(一)设计利用51单片机设计一个数据采集系统,用3位数码管显示输入的电压:二.原理图绘制说明电路原理图主要应包含数据采集电路,AD(模数)转换电路,数据显示电路三个部分。
下面分三个部分进行说明。
(一)数据采集电路根据任务的要求,该部分电路需要对八路数据进行采集,然后输出到下一级电路,在这里,用八个显示不同电压值的电压源来构成,其输出端对应连接到AD 转换电路的输入端即可。
(二)AD(模数)转换电路根据任务的要求,本部分电路需要把数据采集电路采集到的模拟电压量转换成数字电压量,所以在这里选用一个ADC0808芯片作为AD转换电路,本部分电路需把转换之后的数字量输出到数据显示电路即可。
ADC0808是一个有8路输入的AD转换器,可以根据需要来选择使用的输入通道个数,用ABC三个端口可以控制通道的选择,这里因为需要对八路数据进行采集转换,所以,这里需要使用ADC0808所有的输入通道,通道0到7分别和电压源0到7进行连接。
转换启动信号START 和地址所存信号ALE 都是用51单片机的P2.7和P3.6口通过与非门后的输出来控制,允许输出信号OE由P2.7口和P3.7口通过与非门后的输出控制,通道选择端控制端ABC分别用单片机的P0.0,P0.1和P0.2三个端口来控制。
转换结果输出端(OUT0到OUT7)通过总线分别与51单片机的P0.7到P0.0口连接。
具体连接方式如图1所示:图1 AD转换电路的连接方式(三)数据显示电路本部分电路主要由AT89C51单片机和一个四位一体的共阴极的数码管以及电阻构成。
其中,前三个数码管用来显示采集到的电压值,后一个数码管用来显示采集数据来自哪路通道。
51单片机的P3.0,P3.1,P3.2,P3.3口分别用来控制数码管的开启和关闭,P2.0到P2.6以及P3.5分别与数码管的各段连接。
具体链接方式如图2所示:图2 数据显示电路三.流程图绘制以及说明(一)主程序流程图如图3所示:说明:程序开始执行后,首先启动ADC0808,执行AD转换,接着判断转换是否结束,如果转换没有结束,则程序原地等待,如果转换结束,ADC0808允许转换后数据输出,同时将输出数据暂存起来,此时关闭输出;同时,由单片机将接收到得数字量转换成BCD 码,再调用BCD码显示子程序来显示转换后的BCD码,到此,程序结束。
这样,主程序就完成了一次模拟量采集,AD转换,BCD码转换,并最终显示的过程。
图3 主程序流程图(二)显示子程序流程图如图4所示:说明:子程序开始后,通过查表法来获取数码管要显示的数据并且暂存,接下来选通某位数码管,来显示数据,然后调用延时子程序,延时结束后关闭该位数码管,各位数码管的显示都是这样的流程,当需要显示的数据都显示完毕后,返回主程序。
图4 显示子程序流程图(三)延时子程序如图5所示:说明:首先是初始化,即赋初值。
接着判断循环是否结束,如果未结束,则继续执行,如果进行第二层循环,同样,循环未结束则继续执行,如果结束,则返回。
图6 延时子程序流程图运行结果示例图如图8所示:图8 运行示例图改变电压源的输出电压,实现采集数据的变化,采集数据即电压值由ADC0808的八个通道输入,实现模拟量到数字量的转换,再由单片机实现数字量到BCD码的转换,最后由单片机控制数码管输出,这样整个数据采集到显示的过程就实现了。
图中,数码管显示的数据即为数据采集后变换为BCD码的输出,其中,前三位现实的是AD转换后的数据,最后一位现显示的是该时刻转换的通道号,其前面的小数点使用以区分数据输出是数字电压量还是通道号的。
附录Ⅰ电路原理图图9 电路原理图附录Ⅱ源程序#ifndef __ABSACC_H__#define __ABSACC_H__#define CBYTE ((unsigned char volatile code *) 0)#define DBYTE ((unsigned char volatile data *) 0)#define PBYTE ((unsigned char volatile pdata *) 0)#define XBYTE ((unsigned char volatile xdata *) 0)#define CWORD ((unsigned int volatile code *) 0)#define DWORD ((unsigned int volatile data *) 0)#define PWORD ((unsigned int volatile pdata *) 0)#define XWORD ((unsigned int volatile xdata *) 0)#ifdef __CX51__#define FV AR(object, addr) (*((object volatile far *) (addr)))#define FARRAY(object, base) ((object volatile far *) (base))#define FCV AR(object, addr) (*((object const far *) (addr)))#define FCARRAY(object, base) ((object const far *) (base))#else#define FV AR(object, addr) (*((object volatile far *) ((addr)+0x10000L))) #define FCV AR(object, addr) (*((object const far *) ((addr)+0x810000L))) #define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L)) #define FCARRAY(object, base) ((object const far *) ((base)+0x810000L)) #endif#endif#include "adc0809.c"#define LED_Data P2#define A 10#define U 11sbit LED1=P3^0;sbit LED2=P3^1;sbit LED3=P3^2;sbit LED4=P3^3;sbit dp=P3^5;#define LED_slect P3static uchar dispdata[4];void decodenum(float adv,uchar chn){uint temp;temp=(uint)(adv*100);dispdata[0]=temp/100;dispdata[1]=temp/10%10;dispdata[2]=temp%10;dispdata[3]=chn;}void select(uchar LED){switch(LED){case 0:LED1=0;break;case 1:LED2=0;break;case 2:LED3=0;break;case 3:LED4=0;break;default: LED_slect=0xff;}}void dispone(uchar LED,bit ifpoint,uchar number) //,number 0--9{select(LED);if(ifpoint)dp=1;elsedp=0;LED_Data=num[number]|0x80; delayus(200);LED_slect=0xff;}void disp(){uchar i;bit point;for(i=0;i<4;i++){if(i==1)point=0;elsepoint=1;dispone(i,point,dispdata[i]);}}#include <reg51.h>#include<absacc.h>#include "numcode.h"#define uchar unsigned char#define uint unsigned int#define adin XBYTE[0x7fff]void delayus(uint us){while(us--);}uchar ad_action(uchar chn){uchar read_data;adin=chn;delayus(6);read_data=adin;return read_data;}#ifndef __REG51_H__#define __REG51_H__/* BYTE Register */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0; sfr ACC = 0xE0; sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83; sfr PCON = 0x87; sfr TCON = 0x88; sfr TMOD = 0x89; sfr TL0 = 0x8A; sfr TL1 = 0x8B;sfr TH0 = 0x8C; sfr TH1 = 0x8D; sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98; sfr SBUF = 0x99;/* BIT Register */ /* PSW */sbit CY = 0xD7; sbit AC = 0xD6; sbit F0 = 0xD5; sbit RS1 = 0xD4; sbit RS0 = 0xD3; sbit OV = 0xD2; sbit P = 0xD0; /* TCON */sbit TF1 = 0x8F; sbit TR1 = 0x8E; sbit TF0 = 0x8D; sbit TR0 = 0x8C; sbit IE1 = 0x8B; sbit IT1 = 0x8A; sbit IE0 = 0x89; sbit IT0 = 0x88;/* IE */sbit EA = 0xAF; sbit ES = 0xAC; sbit ET1 = 0xAB; sbit EX1 = 0xAA;sbit ET0 = 0xA9;sbit EX0 = 0xA8;/* IP */sbit PS = 0xBC;sbit PT1 = 0xBB;sbit PX1 = 0xBA;sbit PT0 = 0xB9;sbit PX0 = 0xB8;/* P3 */sbit RD = 0xB7;sbit WR = 0xB6;sbit T1 = 0xB5;sbit T0 = 0xB4;sbit INT1 = 0xB3;sbit INT0 = 0xB2;sbit TXD = 0xB1;sbit RXD = 0xB0;/* SCON */sbit SM0 = 0x9F;sbit SM1 = 0x9E;sbit SM2 = 0x9D;sbit REN = 0x9C;sbit TB8 = 0x9B;sbit RB8 = 0x9A;sbit TI = 0x99;sbit RI = 0x98;#endifunsigned char code num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x3e };。