当前位置:文档之家› 基于AD转换的单片机实验与C语言开发

基于AD转换的单片机实验与C语言开发

基于AD转换的单片机实验与C语言开发
基于AD转换的单片机实验与C语言开发

目录

摘要 (1)

1 设计软件基础知识 (2)

1.1 C编译器Keil介绍 (2)

1.2 Proteus软件简介 (2)

2 总体设计 (4)

2.2系统框图 (4)

2.3 51单片机简介 (4)

2.4 ADC0809简介 (5)

2.4.1 ADC0809内部结构 (5)

2.3.2 ADC0809的工作过程 (6)

3.1 功能简介 (8)

3.2 总原理图 (8)

3.2.1 单片机电路 (8)

3.2.2 ADC采样电路 (9)

3.2.3显示模块 (10)

3.3 系统流程图 (11)

4 程序代码 (12)

5 仿真结果与分析 (18)

6 心得体会 (19)

武汉理工大学《能力拓展训练》设计说明书

摘要

A/D转换是将连续的模拟量通过取样转换成离散的数字量。

A/D转换包括采样、保持、量化和编码四个过程。在某些特定的时刻对这种模拟信号进行测量叫做采样,量化噪声及接收机噪声等因素的影响,采样速率一般取fs=2.5fmax。通常采样脉冲的宽度tw很短,故采样输出是断续的窄脉冲。要把一个采样输出信号数字化,需要将采样输出所得的瞬时模拟信号保持一段时间,这就是保持过程。量化是将连续幅度的抽样信号转换成离散时间、离散幅度的数字信号,量化的主要问题是量化误差。假设噪声信号在量化电平中是均匀分布的,则量化噪声均方值与量化间隔和模数转换器的输入阻抗值有关。编码是将量化后的信号编码成二进制代码输出。这些过程有些是合并进行的。

本次课程设计的要求是:基于A/D转换模块的单片机实验和C语言开发,设计一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。要求进行电路实验或仿真,并使用C语言进行程序的开发。

1 设计软件基础知识

1.1 C编译器Keil介绍

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

KeilSoftware公司推出的uVision4是一款可用于多种8051MCU的集成开发环境(IDE),该IDE同时也是PK51及其它开发套件的一个重要组件。除增加了源代码、功能导航器、模板编辑以及改进的搜索功能外,uVision3还提供了一个配置向导功能,加速了启动代码和配置文件的生成。此外其内置的仿真器可模拟目标MCU,包括指令集、片上外围设备及外部信号等。uVision3提供逻辑分析器,可监控基于MCUI/O引脚和外设状态变化下的程序变量。uVision4提供对多种最新的8051类微处理器的支持,包括AnalogDevices的ADuC83x和ADuC84x,以及Infineon的XC866等。

1.2 Proteus软件简介

Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。其功能特点如下: Proteus软件具有其它EDA工具软件(例:multisim)的功能。

其功能模块:—个易用而又功能强大的ISIS 原理布图工具;PROSPICE 混合模型SPICE 仿真; ARESPCB 设计。PROSPICE 仿真器的一个扩展PROTEUS VSM:

便于包括所有相关的器件的基于微处理器设计的协同仿真。此外,还可以结合微控制器软件使用动态的键盘,开关,按钮,LED 甚至LCD 显示CPU 模型。

Protues 主要特征:

1)支持许多通用的微控制器,如 ARM,PIC,AVR,以及8051.

2)交互的装置模型包括:LED 和LCD 显示,RS232 终端,通用键盘

3)强大的调试工具,包括寄存器和存储器,断点和单步模式

4) IAR C-SPY 和 Keil uVision4 等开发工具的源层调试

革命性的特点:

1)互动的电路仿真用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。

2)仿真处理器及其外围电路可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。

2 总体设计

2.2系统框图

此次设计的多通道数据采集系统设置了4路模拟电压输入通道。仿真中为了便于调节输入的模拟电压,在输入模拟信号时采用电阻分压,最终的采样输入电压便可根据测试需要调节。 系统框图如图2.1所示

图2.1 系统框图

2.3 51单片机简介

单片微型计算机(Single-Chip Microcomputer ),简称单片机。就是将微处理器(CPU )、存储器(存放程序或数据的ROM

和RAM )、总线、定时器/计数器、输入/输出接口(I/O 口)和其他多种功能器件集成在一块芯片上的微型计算机。本次课程设计选用的是MCS-51系列单片机中的89C51。MCS-51单片机包含中央处理器(CPU )、程序存储器(ROM)、数据存储器(RAM )、定时器/计数器、并行I/O 接口、串行I/O 接口和中断系统等几大单元。 其内部结构框图如图2.2所示。

模拟信号 AD 转换芯片采集数据

单片机处理数据,输出数字量

数码管 显示

图2.2 51内部系统结构

2.4 ADC0809简介

ADC0809是8位逐次逼近式A/D转换器。其内部有一个8通道多路模拟开关,片内带有三态输出缓冲器,可直接与单片机的数据总线相连接。它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。2.4.1 ADC0809内部结构

ADC0809的内部结构如图2.3所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。

图2.3 ADC0809内部结构

各部分功能及作用:

IN0~IN7:8路模拟通道信号输入,通过模拟开关实现8路模拟输入信号分时选通。

ADDC,ADDB和ADDA:模拟通道选择,编码000~111分别选中IN0~IN7。

ALE:地址锁存信号,其上升沿锁存ADDC,ADDB,ADDA信号,译码后控制模拟开关,接通8路模拟信号中相应的一路。

CLK:输入时钟,为A/D转换器提供转换的时钟信号,典型工作频率640HZ。 START:A/D转换启动信号,正脉冲启动ADDC~ADDA选中的一路模拟信号开始转换。

OE:输出允许信号,高电平时打开三态输出缓存器,使转换后的数字量从D0~D7脚输出。

EOC:转换结束信号,启动转换后,EOC变为低电平,转换完成后变为高电平。根据读入转换结果的方式,此信号可有三种方式和单片机相连。

1)延时方式:EOC悬空,启动转换后,延时100us后读入转换结果。

2)查询方式:EOC接单片机端口线,查得EOC变高,读入转换结果,作为查询信号。

3)中断方式:EOC经非门接单片机的中断请求端,转换结果作为中断请求信号向单片机提出中断申请,在中断服务中读入转换结果。

Vref(+)和Vref(-):基准电压输入,用于决定模拟电压的范围。允许Vref(+)和Vref(-)是差动的或不共地的电压信号,多数情况下,Vref(+)接+5V,Vref(-)接GND,此时输入量程为0~5V。当转换精度要求不高或电源电压Vcc较稳定和准确时,Vref(+)可以接Vcc,否则应单独提供基准电源。

2.3.2 ADC0809的工作过程

首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可

用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。

转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。

1)定时传送方式

对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。

2)查询方式

A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。

3)中断方式

把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。

不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。

3 多路模拟信号采集模块设计

3.1 功能简介

使用ADC0809型号的A/D 转换器对多路模拟信号进行数据采集,同时与单片

机进行通信,将测量的模拟信号量传递给89C51单片机,由单片机进行运算,输出对应的数字量,然后在数码管上显示出来。设计中采用开关来选择输入不同通道的模拟信号。

3.2 总原理图

图 3.1 多通道数据采集总原理图

3.2.1 单片机电路

单片机最小系统如下图所示,各个引脚都已经标出。

D7D6D5D4D3D2D1D0

D0D1D2D3D4D5D6D7

C2OE

ST ST C3EOC C1

C3C2C1ST

EOC CLK OE CLK I N 0

I N 1

I N 2

I N 3

IN0IN1IN2IN3XTAL218

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD0

39P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1

AT89C51

OUT121ADD B 24ADD A 25ADD C 23VREF(+)12VREF(-)16

IN31

IN42IN53IN64IN75START 6OUT58EOC 7OE

9CLOCK 10OUT220OUT714OUT615OUT8

17

OUT418OUT319IN228IN127IN026ALE 22U3

ADC0809

SEVEN-MPX4-CC-BLUE

C1

22pF

C2

22pF

C3

10uF

X1

12M

R1

10k

23456789

1RP1

44%

RV21k 51%

RV31k

80%

RV41k

20%

RV51k

图3.2 单片机最小系统

其中,振荡电路以及复位电路均由单片机系统自带。

3.2.2 ADC 采样电路

图3.3 ADC 模数转换

D0D1D2D3D4D5D6D7

C K

XTAL2

18

XTAL1

19

ALE 30EA

31

PSEN 29RST

9

P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78

P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD

17

P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1

AT89C51

D7D6D5D4D3D2D1D0

OE

ST EOC C3C2C1ST

CLK IN0IN1IN2IN3

OUT121ADD B 24ADD A 25ADD C 23VREF(+)12VREF(-)16

IN31IN42IN53IN64IN75START

6OUT58EOC 7OE

9CLOCK 10OUT220OUT714OUT615OUT8

17

OUT418OUT319IN228IN127IN026ALE 22U3

ADC0809

3.2.3显示模块

本次设计采用数码管来显示数据。

SEVEN-MPX4-CC-BLUE

图3.4 数码管

3.3 系统流程图

N

检测是否转换完毕

Y

单片机存储

LED显示

地址增加

图3.5 系统流程图

4 程序代码

#include

#define uchar unsigned char

#define uint unsigned int

/********************定义LCD1602接口信息********************************/

sbit lcdrs=P3^0;//数据命令选择位

sbit lcden=P3^1;//使能位

sbit lcdrw=P3^2;

//LCD1602数据线接P0口

/********************定义ADC0808接口信息********************************/

sbit ADA=P2^0;

sbit ADB=P2^1;

sbit ADC=P2^2;

sbit EOC=P2^3;

sbit CLK=P2^4;

sbit START=P2^5;

sbit OE=P2^6;

/*********************定义数据********************************/ uchar string1[]="Xuzhiqiang AD Sp"; //初始化数据

uchar string2[]="Chan from 1 to 8";

uchar tab[]="0.0 0.0 0.0 0.0 "; //存放AD采集数据

uchar tab1[]="0.0 0.0 0.0 0.0 ";

uchar num,getdata=0;

uint temp=0;

/*延时函数*/

void delay(uchar t)

{

uchar x,y;

for(x=t;x>0;x--)

for(y=110;y>0;y--);

}

void delayl(uchar ltime) {

uchar i;

for(i=ltime;i>0;i--)

delay(255);

}

/*写命令函数*/

void write_com(uchar com) {

lcdrs=0;

P0=com;

delay(10);

lcden=1;

delay(10);

lcden=0;

}

/*写数据函数*/

void write_data(uchar date) {

lcdrs=1;

P0=date;

delay(10);

lcden=1;

delay(10);

lcden=0;

}

void disp(uchar h,l,uchar *p) {

write_com(0x80+h*0x40+l);

while(*p!='\0')

{

write_data(*p);

p++;

}

}

/*初始化函数*/

void LcdInit()

{

lcdrw=0;

delay(5);

lcden=0;//使能位置低电平

write_com(0x38);

write_com(0x0c);

write_com(0x06);

write_com(0x01);

write_com(0x80);

disp(0,0,&string1[0]);

disp(1,0,&string2[0]);

delayl(20);

}

void TimeInit()

{

TMOD=0x10;//定时器1工作于方式1,16位不重装初值

TH1=(65536-200)/256; //定时200us(5KHz)

TL1=(65536-200)%256;

EA=1;

ET1=1;

TR1=1;

}

void AdTr(bit ADDA,ADDB,ADDC,uchar channel)

{

START=0;

OE=0;

START=1;

START=0;//A/D转换启动信号,正脉冲启动选中的模拟信号开始转换 ADA=ADDA;

ADB=ADDB;

ADC=ADDC;

delay(5);

while(EOC==0);//启动转换后EOC变为L,转换结束后变为H

OE=1;

getdata=P1;

temp=getdata*1.0/255*50;

OE=0;

if(channel<4)

{

tab[4*channel]=temp/10+0x30;

tab[4*channel+2]=temp%10+0x30;

}

if(channel>=4)

{

channel=channel-4;

tab1[4*channel]=temp/10+0x30; tab1[4*channel+2]=temp%10+0x30; }

}

void main()

{

LcdInit();

TimeInit();

while(1)

{

AdTr(0,0,0,0);

delay(5);

AdTr(0,0,1,1);

delay(5);

AdTr(0,1,0,2);

delay(5);

AdTr(0,1,1,3);

delay(5);

AdTr(1,0,0,4);

delay(5);

AdTr(1,0,1,5);

delay(5);

AdTr(1,1,0,6);

delay(5);

AdTr(1,1,1,7);

delay(5);

disp(0,0,tab);

disp(1,0,tab1);

}

}

void t1(void) interrupt 3 using 0 {

TH1=(65536-200)/256;

TL1=(65536-200)%256;

CLK=~CLK;

}

5 仿真结果与分析

SEVEN-MPX4-CC-BLUE SEVEN-MPX4-CC-BLUE

图 5.1

图5.2

SEVEN-MPX4-CC-BLUE SEVEN-MPX4-CC-BLUE

图 5.3 图5.4

通过调节电阻来控制模拟信号的输入,由上图可以看出,采集的模拟量经过

A/D转换后的数字量分别为:51、168、130、204。

6 心得体会

这次课程设计的题目是基于A/D转换模块的单片机实验和C语言开发,任务是设计一种多路模拟信号采集模块,从多个通道轮流采集数据一次,并将采集的结果存放在数组中。要求进行电路实验或仿真,并使用C语言进行程序的开发。这需要我们综合运用单片机等课程的知识,通过查阅资料、方案论证与选定,设计和选取电路和元器件,分析指标及讨论,完成设计任务。

在这次课程设计中,我学会了怎样去根据课题的要求去设计电路和调试电路。动手能力得到很大的提高。从中我发现自己并不能很好的熟练去使用我所学到的单片机知识。在以后学习中我要加强对使用电路的设计和选用能力。但由于电路比较简单、定型,而不是真实的生产、科研任务,所以我们基本上能有章可循,完成起来并不困难。把过去熟悉的定型分析、定量计算逐步,元器件选择等手段结合起来,掌握工程设计的步骤和方法,了解科学实验的程序和实施方法。这对今后从事技术工作无疑是个很好的训练。通过这种综合训练,我们可以掌握电路设计的基本方法,提高动手组织实验的基本技能,培养分析解决电路问题的实际本领,为以后毕业设计和从事电子实验实际工作打下基础。

在设计的过程中有许多问题,比如自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固等。我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,若遇到实在搞不明白的问题就会及时请教老师,使自己学到了不少知识,也经历了不少艰辛,但收获同样巨大。

相关主题
文本预览
相关文档 最新文档