数据采集实验报告

实验报告

班级:

姓名:

学号:
实验二、基于单片机控制的直流微电压测量系统设计

一、  任务

设计并制作一套直流微电压测量装置,用来测量输入的正负直流微电压,并将结果显示在液晶屏上。整个系统的示意图如图1所示。

图1  直流微电压电流测量示意图

二、要求

1.基本要求

(1)信号调理电路的输入阻抗≧500KW;

(2)测量输入直流微电压范围±400mv,分辨率±10mv;

(3)测量结果显示在液晶屏上(负电压在数值前显示“—”号),误差≦10%。

2.发挥部分

(1)提高测量输入直流微电压范围为±600mv或提高分辨率为±5mv,或两者同时提高,误差≦5%;

(2)其它(如进一步提高分辨率等)。

三、说明

(1)整个系统采用5V电压供电,可由直流电源提供。

(2)MCU推荐采用TI的MSP430系列单片机。

(3)输入的直流微电压可由仪表直接提供或仪表输出分压得到。

(4)正负电压由同一输入端接入测量电路。

实现代码:

    #include<reg52.h>

typedef unsigned char uchar;

typedef unsigned int uint;

unsigned char code duan_m[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X00,0X40};//段选显示0-9

unsigned char code wei_m[]={0Xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0X7f};//位选

uchar        ge_ad,shi_ad,bai_ad,qian_ad,wan_ad;

uchar        flag1;

sbit D0 = P0^4,D2 = P0^5, D3 = P0^6, D4 = P0^7, D5 = P3^3;

                           

void display(uchar wei,uchar duan);

void ms_delay(uchar num)//延时函数

{

    uchar i = 0, j = 0;

    for (i=0; i<mun; i++)

      for (j=0; j<125; j++);

}

void interrupt_init()

{

    IT0 = 1;                        // 外部中断0开启

    EX0 = 1;                        //使能外部中断0

    EA = 1;                         //打开总中断开关

}

void data_read()

{

  

}

void data_display(gew,shiw,baiw,qianw,wanw)

{

   display(5,gew);

   display(4,shiw);

   display(3,baiw);

   display(2,qianw);

   display(1,wan1);

}

void main()

{                

  uchar gew,shiw,baiw,qianw,wanw;

  interrupt_init();

    while (1)

    {

       if(flag1)

       {

         gew=ge_ad;

         shiw=shi_ad;

         baiw=shi_ad;

         qianw=qian_ad;

         wanw=wan_ad;

         flag1=0;

       }

         data_display(gew,shiw,baiw,qianw,wanw);

   }

}

void display(uchar wei,uchar duan)

{

   P2=duan_m[duan];

   P1=wei_m[wei];

   ms_delay(10);

        

}

void exint0() interrupt 0           #if 0 中断一次说明AD向单片机发送一次数据,记录到全局变量

                                          ge shi bai qian wan 中提供显示#end if

{

    if(D5)

    {

        P0=0xff;

        wan_ad=0x0f&P0;

    }                                   

    if(D4)

    {

         P0=0xff;

         qian_ad=0x0f&P0;

    }                          

    if(D3)

    {

         P0=0xff;

         bai_ad=0x0f&P0;

    }

    if(D2)

    {

        P0=0xff;

         shi_ad=0x0f&P0;

    }

    if(D1)

    {

         P0=0xff;

         ge_ad=0x0f&P0;

         flag1=1;

    }

}

 

第二篇:哈工大 选修课—C语言在测试与控制中的应用 数据采集与处理实验报告

C语言测控系统程序设计

数据采集与处理实验报告

学生姓名: xx           学号:xxxxx

实验的目的:

1.  掌握定时器/计数器8254的工作原理与编程。

2.  熟悉中断控制器8259A的工作原理与使用方法。

3.  掌握硬件中断程序设计的原理与编程方法。

4.  掌握数/模、模/数转换器的使用与数据采集的方法。

5.  掌握建立磁盘数据文件的方法。

6.  掌握绘制曲线的方法。

7.  学习频谱分析的方法。

实验用设备:

1.   具有ISA总线插槽和USB接口的PC系列微型计算机,操作系统使用DOS或Windows98。

2.   超低频信号发生器。

3.   超低频示波器。

4.   HY1232模入/模出接口板。


实验设备连接如图所示。超低频信号发生器产生正弦信号,信号的频率

在1.0Hz左右,振幅为6~7V。                

实验要求:

(1)每12ms中断一次,每中断一次从A/D的0通道采集一个数据,放入整型数组,并从D/A通道输出相同的(如果不可能相同,则输出最接近的)电压。256次之后恢复系统原有功能,显示数组中的内容,并显示对应的电压值。示波器上显示的波形应是一个削波的正弦信号。

(2)将存放到整型数组中的数据,用二进制文件的形式建立磁盘数据文件。然后读出磁盘数据文件中的数据,在CRT上显示。注意对比是否与采集时的数据相同。

(3)将采集的数据绘制成曲线。

(4)实时在线整流,D/A输出的电压UDA>0V 。(选作)

(5)实时在线整流,D/A输出的电压UDA<0V 。(选作)

(6)将采集的数据进行FFT变换,画出幅频特性。(选作)

设计和计算:

程序框图:

程序清单和注释:

#include <dos.h>

#include <stdio.h>

#include <math.h>

#include <graphics.h>

#define SIZE 400

int i=0;

int data1[SIZE],data2[SIZE];

float v[SIZE];

void interrupt ad(void);

int change(int x);

void wdisk(int *pw,int n);

void main(void)

{

   int j;

    FILE *fp;

    int driver=DETECT,mode,x00,x11,y00,y11,m;

    int data2[256],x1,x2,xstep,ystep,k;

    char stt[10];

    double value;

    disable();

    outportb(0x43,0x36);

    outportb(0x40,0x9d);

    outportb(0x40,0x2e);

   /*10ms*/

    setvect(0x08,ad);

    enable();

    while(i<256)

    {;}

    for (j=0;j<256;j++)

    {

        printf ("%5d",data2[j]);

        printf ("%.5f\n",v[j]);

    }

    fp=fopen("f1.dat","wb");

    if((fp=fopen("f1.dat","r"))==NULL)

    {

        printf("Can not open this file.\n");

        exit();

    }

    wdisk(data2,256);

    fclose(fp);

    initgraph(&driver,&mode," ");

    x00=100,y00=210,x11=x00+512,y11=y00+128;

    rectangle(x00,y00,x11,y11);

    m=(y00+y11)/2;

    line(x00,m,x11,m);

    xstep=(x11-x00)/16;

    ystep=(y11-y00)/8;

    for(k=0;k<=16;k++)

    {

        line(x00+xstep*k,y11,x00+xstep*k,y11+5);

        value=xstep*k/2;

        gcvt(value,3,stt);

        outtextxy(x00+xstep*k-8,y11+8,stt);

    }

   for(k=0;k<=8;k++)

   {

        line(x00-5,y00+ystep*k,x00,y00+ystep*k);

        value=5-1.25*k;

        gcvt(value,3,stt);

        outtextxy(x00-45,y00+ystep*k,stt);

   }

   for(k=0;k<=16;k++)

   {

    line(x00+xstep*k,y11,x00+xstep*k,y11+5);

    value=xstep*k/2;

    gcvt(value,3,stt);

    outtextxy(x00+xstep*k-8,y11+8,stt);

   }

   for(k=0;k<=8;k++)

    line(x00-5,y00+ystep*k,x00,y00+ystep*k);

    x1=x00;

   setcolor(5);

   for(k=0;k<254;k++)

   {

        x2=x1+2;

        line(x1,m-12.8*v[k],x2,m-12.8*v[k+1]);

        x1=x2;

   }

   getch();

   closegraph();

   printf("That's all\n\t...");

   getch();

}

void interrupt ad(void)

{

    outportb(0x280,0x00);

    do

    ;

    while(!(inportb(0x285)&0x80));

    data1[i]=inportb(0x281)|((inportb(0x282)&0x0f)<<8);

    data2[i]=!data1[i]+1;

    v[i]=0.00244*(data1[i]-2047);

    outportb(0x283,(data1[i]&0x00ff));

    outportb(0x284,((data1[i]>>8)&0x0f));

    i++;

    outportb(0x20,0x20);

}

void wdisk(int *pw,int n)

{

    FILE  *fp;

    if((fp=fopen("f1.dat","wb"))==NULL)

    { printf("Can not open the file !\n");

       exit();

    }

    fwrite(pw,sizeof(int),n,fp);

    fclose(fp);

    printf("\n Data write to f1.dat.");

}

调试中出现的错误及分析:

相关推荐