八路数据采集系统.docx
《八路数据采集系统.docx》由会员分享,可在线阅读,更多相关《八路数据采集系统.docx(21页珍藏版)》请在冰豆网上搜索。
八路数据采集系统
基于单片机的八路数据采集系统
(二)
摘要:
单片机数据采集系统是计算机在工业控制中最为普遍的应用系统?
它的任务是采集
生产过程中的各种工况参数经过处理后送入内存储器,CPU再对这些参数数据进行分析,运算和处理。
本系统设计一个单片机系统,负责数据的采集和显示,设计一个多路数据输入输出系统,实现8路输入和输出。
采用89C51系列单片机、ADC0809LCD1602等芯片实现硬件仿真,采用C语言编程。
最后硬件电路在Proteaus下仿真实现。
关键词:
数据采集;8路输入输出;LCD
0.刖言
随着科学技术的进步,人们越来越多地用计算机来实现控制系统,因此,充分理解计
算机控制系统是十分重要的。
计算机控制系统的工作原理可归纳为以下三个步骤:
1.实时数据采集:
对来自测量变送装置已的被控量的瞬时值进行检测和输入。
2.实时控制决策:
对采集到的被控量进行分析和处理,并按已定的控制规律,决定将要采取的控制行为。
3.实时控制输出:
根据控制决策,适时地对执行机构发出控制信号,完成控制任务。
工业控制机包括硬件和软件两部分:
硬件包括主机板、内部总线和外部总线、人-机接口、系统支持板、磁盘系统、通信接口、输入输出通道。
软件包括系统软件、支持软件和应用软件。
本系统设计一个单片机系统,负责数据的采集和显示,设计一个多路数据输入输出系统,实现8路输入和输出。
采用89C51系列单片机、ADC0809LCD1602等芯片实现硬件仿真,采用C语言编程。
最后硬件电路在Proteaus下仿真实现。
1.方案设计
数据采集电路的原理框图1所示
图1数据采集电路的原理框图
根据设计要求,采用的方案如下:
硬件部分实现对8路数据采集和显示的功能,包括MCS-51单片机、ADC0809LCD1602软件部分实现单片机对8路输入数据的采集以及对LCD的显示操作。
主要设计思想:
单片机P1与ADC0809相连,P0与LCD连接。
模拟信号通过IN0――IN7输入到ADC080肿转换为数字信号,P1获得此值后,经过处理得到每位的数据后,通过P2口写数据到LCD屏上。
2.硬件电路设计
2.1MCS51单片机
MCS-51单片机的内部资源主要有并行I/O接口、定时器/计数器、串行接口以及中断系统。
其外部引脚如图2所示。
U1
►KTAL1
PO.CWAEtiPO.I/AD1PQ.2/AD2
XTAL2
PO4/ACM
P0.WAD6POMADE
RST
PO.7/AD7
P2.0/A8
P2.VA'SlP?
2/AlO
PSEN
P2.3/A11
RLE
F2.4XA12
P2.6/A1A
F2.7ZA15
P10
P11
PgQ/PXD
P31/TXD
Fl2
F3.2/INTD
PI3
P3-3/INTl
P14P15
paa/ro
PS.5/T1
P16
R36/WR
PI7
16
■■•I_
6
ATSK51^=TEXTJ>'
图2MCS-51单片机
S2
26as
2.1.1I/O接口
51系列单片机有4个8位并行的I/O端口:
P0、P1、P2、P3口。
这4个口既可以并行输入或输出8位数据,又可以按位方式使用,即每一位均能独立作为输入或输出接口用。
2.1.2定时器/计数器电路
1.MCS-51单片机有两个16位的可编程定时/计数器:
定时/计数器T0和定时/计数器
T1。
2.每个定时/计数器既可以对系统时钟计数实现定时,也可以对外部信号计数实现计数功能,这些功能都是通过编程设定来实现的。
3.每个定时/计数器有多种工作方式,其中T0有四种工作方式;T1有三种工作方式,T2有三种工作方式。
通过编程可设定工作于某种方式。
4.每一个定时/计数器定时计数时间到时产生溢出,使相应的溢出位置位,溢出可通
过查询或中断方式来处理。
2.1.3串行接口
MCS-51单片机具有一个全双工的串行异步通信接口,可以同时发送、接收数据。
发送、接收数据可通过查询或中断的方式来处理。
它有四种工作方式:
0.方式0,称为同步移位寄存器方式,一般用于外接移位寄存器芯片扩展I/O接口。
1.方式1,称为8位的异步通信方式,通常用于双机通信。
2.方式2和方式3,称为9位的异步通信方式,通常用于多机通信。
2.1.4中断系统
MCS-5单片机提供5个(52子系列提供6个)硬件中断源:
两个外部中断源INT0(P3.2)和INT1(P3.3),两个定时/计数器T0和T1的溢出中断TF0和TF1;1个串行口发送T1和接收R1中断。
以下为本系统用到的串口中断部分指令:
EA中断允许总控位。
EA=Q屏蔽所有的中断请求;EA=1,开放中断。
EA的作用是使中断允许形成两级控制。
ES:
串行口中断允许位。
ES=1允许串行口中断。
REN为允许接收控制位。
REN=1则允许接收。
TI位发送中断标志位。
RI为接收中断标志位。
2.2数据采集、模数转换模块
这一模块主要有ADC0808转化器和电位器组成成。
ADC0808是CMO单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
该部分构成如图3所示。
*CL(X.KNO
STARTKI
EOCINS
0UT1幅
0UT2MS
OUTSW7
OUT4
OUTSADDA
0UT6ADOe
0UT7ADOC
OUT9.aj-E
VREF(*)
OE
■U1
1RW
3~R^h
4
12
18
r--
Z
H.
R*3*'ik'
•徒皿’L
-荷2*
ik
■圧皿’
三•
1k
L£3
些
1・'
"HT'
R^6*ik'''FW?
*ik.
2.2.1输入输出端
1.IN0〜IN7:
8路模拟量输入端。
2.0UT1〜0UT88位数字量输出端。
2.2.2传输通道选择端
ADDA、ADDBADDC3位地址输入线,用于选通8路模拟输入中的一路。
2.2.3使能端
1.ALE:
地址锁存允许信号,输入,高电平有效。
2.STARTA/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
3.EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
4.OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
5.CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ
6.REF(+)、REF(-):
基准电压。
2.3显示模块
显示模块选用1602型LCD显示模块。
1602型LCD显示模块具有体积小,功耗低,显示内容丰富等特点。
1602型LCD可以显示2行16个字符,有8位数据总线D0-D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能。
其外部引脚如图4所示。
■E--
izgEfc」
D4
D5
D6
D7
■Z-56
VSSVDDVEE
LM018L
图4LCD1602
2.3.1各引脚功能
1.VSS:
电源地。
2.VDD:
电源正极。
3.VEE:
液晶显示偏压信号。
4.RS:
数据/命令选择端。
5.R/W:
读写选择端。
6.E:
使能信号。
7.D0-D7:
数据输入/输出口。
3.软件编程
设计思想:
ADC0809的使能控制端连接在单片机P3口,操作时由程序控制。
当A/D转换结束后由单片机将P1口A/D转换后的数据附给P0口,进而由连接在P0口的LCD显示。
对各子程序及主程序功能描述、流程图在以下做具体介绍。
3.1显示子程序
该部分程序的功能主要是将储存在单片机寄存器器中的采集到的8路数据送至LCD
中进行显示,其程序流程如图5所示。
3.2数据采集子程序
Y
该部分的功能是将从8路输入通道IN0-IN7输入的模拟量转化成数字量并送至单片机内部寄存器中。
oe=0向单片机输出转换结果
结束
图6数据采集子程序流程图
3.38路数据采集系统主程序
该部分融合各子程序功能,实现对八路数据的采集和显示。
其程序流程如图7所示
4.系统调试和结果分析
根据方案设计结果,进行了硬件电路在Proteaus下的仿真。
当通过电位器调节AD转换器输入端的电压时,模拟电压值经过AD转换后,经由单片机将转换后的电压值发送至P0口,供LCD进行显示。
仿真过程描述:
通过keil软件对所编程序进行编译,生成.hex文件,在proteaus软件中,用MCS5单片机调用.hex,即可进行硬件的仿真。
该仿真包括两部分:
1.对8路电压进行采集,经由AD转换器进行转化,转化后的16进制数存于单片机的内部存储器中。
2.对转换后的电压进行显示。
将内部存储器中存储的转化后的电压对应的16进制数
付给P0口,由LCD进行显示。
调节电位器LCD的显示数据也会发生变化。
调试中遇到的问题:
将程序下载至开发板上的单片机进行硬件调试时主要遇到以下两个问题。
1丄CD不显示数据,LED出现乱闪。
解决方法:
将LED的段选和位选端关闭后再进行硬件调试,问题得到解决。
2.调节电位器后,AD转换的数据不变化只显示5V。
解决方法:
AD转换程序出现错误,更改程序后问题得到解决。
5.结论及进一步设想
本系统设计一个单片机系统,实现8路数据的采集和显示,它的任务是采集生产过程中的各种工况参数经过处理后送入内存储器,CPU再对这些参数数据进行分析,运算和处理。
采用89C51系列单片机、AD转换器、LCD1602等器件,并采用C语言编程,在Proteaus下实现了硬件仿真,得到了一个8路数据输入输出系统。
根据实验结果,本设计已经完成了设计任务,达到要求。
但是由于仿真与实际应用是有很大差别的,该单片机的8路数据采集系统还存在着实际的应用方面的缺陷,可以通过
把C语言编程、单片机、真实的硬件电路等更精密的器件综合到一起,控制在工厂生产过
程中需要采集和控制的数据,从而进一步改善该系统,使其能够应用到实际的生产过程中。
参考文献
[1]谢维成,杨加国.单片机原理与应用及C51程序设计.北京:
清华大学出版社,2009
[2]于海生等.微型计算机控制技术.北京;清华大学出版社,2008
[3]刘复华.单片机及其应用系统.北京:
清华大学出版社,1992
[4]李斌,董慧颖.可重组机器人研究和发展现状.沈阳工业学院学报,2000
⑸于海生等.微型计算机控制技术.北京:
清华大学出版社,1999
课设体会
做了两周的课程设计,对于单片机的实际应用方面让我感受颇深。
对于本专业的学生,我深知不进行自主的实践,永远也学不到真东西。
在课设刚开始拿到题目觉得挺简单,书上也有类似的程序,有点散漫。
但当我真正的去思考开始着手做程序时才发现自己还有好多要去学习。
Proteus仿真软件对我来说还是
比较陌生的,有很多硬件都找不到,查阅了Proteus相关的入门书籍后才能自如的运用软件。
之后便是C程序的编写,根据课设任务的要求,写出了程序的一个大概流程,按着程序流程图一步一步的得到了能实现数据输入输出的程序,期间经过了多次调试,修改。
最终得到完整的程序,心里还是小有成就感的。
问题随之又来,当我将写好的程序进行实物仿真时,和我想的结果完全不同,写入程序的开发板并没有像软件仿真时那样得出期望的结果,最后经过查阅资料将程序、Proteus仿真、硬件的端口一一对应,才得出了争确的结果。
最后,感谢学校和老师给我们安排了这次课程设计,让我真正感受到的是合作的重要,许多时候老师的指导中的一句半句启发了我,就出现的让人欣喜的结果;理论知识同样很重要,有些问题都是由于基础知识掌握不好才出现的。
总之,要想做好一个硬件,理论知
识基础,动手能力也必须过关,二者缺一不可,我会继续努力学习这方面的知识,通过类似课设这种方式锻炼自己,达到学以致用。
[2011年7月22日完成]
附录1电路原理图
員[再勻聶司三冏詞二[至罔
i^ia^i三三三三三三三言创盘围俱営苕
=已占占
rt*~~^"—■^E
FSBC>Of2&—■■RJWVS-^-<*»'l*JU
15—3「•」3Prf
為徂业寄弓吏5严卫sSSSSSaB£|宝戸言当目I英冥奁宝崟至里邕咅M吾誉倉言芒甞莒E"^■H^1I-^-<—3―II"—*・一*RXF-^―F<1―»■1—1CW'―^OF-^->^_aJ!
Rfci
iri
7=^_-_念-■
:
:
:
:
附录2程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//B3.4
//C3.5
//LCDRS3.6
//LCDEN3.7
sbitadoe=P3A7;
sbiteoc=P3A3;sbitadstart=P3A6;
sbita0=P3A0;
sbita仁P3A1;
sbita2=P3A2;
sbitlcdrs=P3A5;sbitIcden=卩3八4;
〃0E接3.7
〃EOC接3.1
//start接3.2
//A3.3
sbitduIa=P2A6;
sbitweIa=P2A7;
longinttemp,b1,b2,b3,b4,b5;
uchartt;
显示电压
ucharcodetable[]="0123456789.V";//
voiddelay(uintz)//延时
{
uintx,y;
for(x=z;x>0;x__)
for(y=100;y>0;y--);
}
voidwrite_command(ucharcom)//写命令
{
dula=0;
wela=0;
lcdrs=0;//输入指令
P0=com;
delay(5);
lcden=1;//读数据
delay(5);
lcden=O;//写指令或者数据
}
写数据
voidwrite_data(uchardate)//
lcdrs=1;//输入数据
P0=date;//显示
delay(5);
lcden=1;//读数据
delay(5);
lcden=0;//写指令或数据
voidinit()//初始化
lcden=0;
write_command(0x38);〃
不可变,显示模式设置:
据接口
write_command(0x0c);〃
屏幕开启和光标闪烁
write_command(0x06);〃
显示开关及光标设置
}
write_command(0x01);〃
清屏
}
voidstart()//开始AD转换
16*2显示,5*7点阵,8位数
{
adoe=0;
adstart=0;
_nop_();
adstart=1;
adstart=0;
}
voidxianshi()//AD转化结果显示
{
write_data(table[b1]);//最高位
delay
(1);
write_data(table[10]);//小数点
delay
(1);
write_data(table[b2]);//第二位
delay
(1);
write_data(table[b3]);//第三位
delay
(1);
write_data(table[11]);//电压V
delay
(1);
}
voidfirst_mark()〃0-4路通道的标号
{
write_command(0x01);
write_command(0x80);write_data('A');
delay
(1);
write_command(0x80+0x01);write_data('=');
delay
(1);
write_command(0x80+0x09);write_data('B');
delay
(1);
write_command(0x80+0x0a);write_data('=');
delay
(1);
write_command(0x80+0x40);
write_data(C);
delay
(1);
write_command(0x80+0x41);write_data('=');
delay
(1);
delay
(1);write_command(0x80+0x49);write_data('D');
delay
(1);
write_command(0x80+0x4a);write_data('=');
delay
(1);
}
voidsecond_mark()〃5-7路通道的标号
{
write_command(0x01);
write_command(0x80);write_data('E');
delay
(1);
write_command(0x80+0x01);write_data('=');
delay
(1);
write_command(0x80+0x09);write_data('F');
delay
(1);
write_command(0x80+0x0a);write_data('=');
delay
(1);
write_command(0x80+0x40);write_data('G');
delay
(1);
write_command(0x80+0x41);write_data('=');
delay
(1);
delay
(1);write_command(0x80+0x49);write_data('H');
delay
(1);
write_command(0x80+0x4a);write_data('=');
delay
(1);
}
voidmain()
{
a2=0;
init();//调用LCD初始化子程序
TMOD=0x01;
EA=1;〃开总中断
TH0=(65535-1000)/256;TL0=(65535-1000)%256;
ET0=1;//开定时器0中断
TR0=1;//定时器0置位first_mark();
while
(1)
{
a0=0;//0路或4路通道的AD转化
a仁0;
start();
while(!
eoc);
adoe=1;
temp=P1;
delay(3);
adoe=0;
b仁(temp*500/255)/100;//最高位
b2=(temp*500/255)%100/10;//第二位
b3=(temp*500/255)%10;//第三位
write_command(0x80+0x02);
xianshi();
a0=1;//1路或5路通道的AD转化
a仁0;
start();
while(!
eoc);
adoe=1;
temp=P1;
delay(3);
adoe=0;
b仁(temp*500/255)/100;//最高位
b2=(temp*500/255)%100/10;//第二位
b3=(temp*500/255)%10;//第三位
write_command(0x80+0x0b);
xianshi();
aO=O;〃2路或6路通道的
a1=1;
start();
while(!
eoc);
adoe=1;
temp=P1;
delay(3);
adoe=0;
b1=(temp*500/255)/100;
b2=(temp*500/255)%100/10;b3=(temp*500/255)%10;write_command(0x80+0x42);xianshi();
a0=1;//3路或7路通道的a1=1;
start();
while(!
eoc);
adoe=1;
temp=P1;
delay(3);
adoe=0;
b1=(temp*500/255)/100;
b2=(temp*500/255)%100/10;b3=(temp*500/255)%10;write_command(0x80+0x4b);xianshi();
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if((a2==0&&tt==20)==1)//LCD
AD转化
//最高位
//第二位
//第三位
AD转化
//最高位
//第二位
//第三位
第二屏显示
{
tt=o;
a2=1;
second_mark();
}
第一屏显示
if((a2==1&&tt==20)==1)//LCD{
tt=0;
a2=0;first_mark();
}
}