单片机原理及应用——数据采集系统设计

  • 格式:doc
  • 大小:399.50 KB
  • 文档页数:8

宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

1 数据采集系统设计

姓名: 学号: 班级: 实验时间:

姓名: 学号: 班级: 实验地点:

一、实验目的

1. 掌握单片机片内ADC及温度传感器的使用及应用程序设计

二、实验内容

应用单片机片内ADC实现数据的采集,使用片内温度传感器实现温度的测量。要求:

1. 应用C8051F020单片机片内温度传感器实现温度的测量,并用数码管显示实测温度值,显示精度为0.1oC。

2. 应用C8051F020单片机内ADC实现两路数据的采集,要求对外部输入0-2V的直流电压进行数据采集,测量精度为5mV,显示精度为0.001V。

3. 两种采集功能可以用按键进行切换,可以用按键控制数据采集的通路。

三、实验说明

通过本实验,掌握单片机片内ADC使用方法,掌握基于单片机的数据采集系统的工作原理与设计方法。

必须用模块化方法进行C语言程序设计。

四、实验仪器和设备

PC机、Keil uVision2软件,C8051F020单片机,EC3在线仿真器。

五、实验原理

1:ADC0的使用方法

(1):初始化:

a:输入模式:单端 or双端;

b:选定模拟输入通道;

c:确定PGA增益;

d:确定ADC0转换时钟;

e:选定基准电压VREF;

f:选定启动转换的方式; 宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

2 定时器溢出方式:选择定时器(定时器初始化)

g:确定查询方式还是中断方式

中断方式:需进行中断初始化

(2):开启ADC0:AD0EN=1

(3):启动ADC0:

(4) 读取转换结果。

2:温度传感器的传输函数示于图 6.2。当温度传感器被选中(用 AMX0SL 中的 AMX0AD3-0)

时,其输出电压(VTEMP)是 PGA 的输入;PGA 对该电压的放大倍数由用户编程的 PGA 设置

值决定。

而关于电压的公式为:

4096refadVXX=

refV为基准电压,经测量,2.421VrefV=。

六、程序流程图

宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

3

宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

4 开始关闭看门狗开启中断设置系统时钟选用外部时钟12M交叉开关初始化ADC初始化外部中断7初始化ZLG芯片初始化数码管显示初始化按键值?1选择通道AID0选择通道AID1选择温度传感器20启动AD转化按键值?0计算返回温度值1或2计算返回电压值显示 宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

5 七、实验结果与分析

1、测温度:

经过测量,温度显示为26.5℃

2、测电压:

通过AID0的得的数据如下表1所示

输入电压U理/V 实测电压U实/V 绝对误差|U理—U实| /mV

0.30 0.298 2

0.50 0.497 3

0.80 0.799 1

1.30 1.299 1

1.50 1.488 2

1.80 1.799 1

2.00 1.999 1

表 1

通过AID1的得的数据如下表2所示

输入电压U理/V 实测电压U实/V 绝对误差|U理—U实| /mV

0.30 0.297 3

0.50 0.497 3

0.80 0.798 2

1.30 1.299 1

1.50 1.489 1

1.80 1.797 3

2.00 1.998 2

表 2

结果分析:

通过实验,利用单片机内置的温度传感器测出了单片机的温度,但是所测的温度是单片机芯片的温度,并非室温,由于工作状态的单片机会产热,所以此温度会比实际的室温高,通过查询资料得知大概高1.4℃。单片机显示的温度减去1.4℃的值会更接近室温。

实验利用ADC测出了电压值,通过表1和表2的数据可知,在0~2V的范围内,测得的温度精确度很高,绝对误差小于5mV,而且还利用了两个通道测电压。其实这只是单测一次的电压值,从实验的习惯来讲是不太好的,实验次数太少偶然误差比较大,所以将来测电压时,应该多测几次,取平均值,当然此步骤可以在程序内部执行,不必自己测多组再取平均值。

八、源代码

源代码必须有必要的注释,且要与流程图的逻辑关系对应。

主代码:

#include

#include

#include

#include

unsigned char key=0xff;

void display(unsigned long number)//频率显示函数 宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

6 { unsigned char T1,T2,T3,T4;

T1=number%10;

T2=(number/10)%10;

T3=(number/100)%10;

T4=number/1000;

if(AMX0SL==0X00||AMX0SL==0X01) //测电压时的显示

{ZLG7289_Download(1,7,0,T1);

ZLG7289_Download(1,6,0,T2);

ZLG7289_Download(1,5,0,T3);

ZLG7289_Download(1,4,1,T4);}

else if(AMX0SL==0X0f) //测温度时的显示

{ZLG7289_Download(1,7,0,0);

ZLG7289_Download(1,6,0,T2);

ZLG7289_Download(1,5,1,T3);

ZLG7289_Download(1,4,0,T4);

}

}

void rest() //初始化

{

P3MDOUT=0XFF; //使能P3口,运来运转ZLG7289

XBR2=0X40; //使能交叉开关

AMX0CF=0X00;//单端输入

ADC0CF=0x48;// SAR=1.2mhz

ADC0CN=0x80;//使能ADC0;

EA=0;

EIE2=0X20; //开启外部中断7,并设置其优先级为最高

EIP2=0x20;

EA=1;

REF0CN=0x07; //ADC0 电压基准取自 VREF0 引脚。

}

void keyduqu() interrupt 19 //读取键值

{

key=ZLG7289_Key();

P3IF=0x00;

}

void main()

{

unsigned char i;

unsigned long num=0;

bdwtd();

sysc();

rest();

delay(100);

ZLG7289_Init(40); 宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

7 for(i=0;i<8;i++) //数码管清0

{

ZLG7289_Download(1,i,0,0);

}

while(1)

{

if(key==0)

{

AMX0SL=0X0F;//温度传感器

}

else if(key==1)

{

AMX0SL=0x00; //选择通道AID0

}

else if(key==2)

{

AMX0SL=0x01; //选择通道AID1

}

if(key==0 || key==1 || key==2)

{

AD0INT==0;

AD0BUSY=1; //启动转换

while(AD0INT==0)//等待转换结束

{};

if(key==1 || key==2)

{

num=(2.44*(ADC0H*256+ADC0L)/4096)*1000; //电压值

}

else

{

num=((2.44*(ADC0H*256+ADC0L))/4096-0.776)*100/0.00286; //温度

}

}

delay(1000);

display(num);

delay(1000);

}

}

相关头文件:

延时函数:

#ifndef _delay_H_

#define _delay_H_

宁波大学信息学院 2013(2)“单片机原理及应用1”实验报告

8 void delay(unsigned char x)

{

unsigned int i,j;

for(i=0;i

{

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

}

}

#endif

时钟函数:

#ifndef _sysc_h_

#define _sysc_h_

void sysc(void)

{

int i;

OSCXCN =0x77;

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

while(!(OSCXCN & 0X80));

OSCICN = 0x88;

}

#endif

开门狗函数:

#ifndef _bdwtd_H_

#define _bdwtd_H_

void bdwtd(void)

{

EA=0;

WDTCN=0XDE;

WDTCN=0XAD;

EA=1;

}

#endif