8路数据采集及报警控制系统
目 录
1. 总体设计:
1.1 设计思路
1.2 课题目的
1.3 器件选择
2.硬件电路设计:
2.1 数据输入模块
2.2 模数转换模块
2.3 主控电路-单片机
2.4 显示模块
3. 系统程序设计:
3.1 程序流程框图
3.2 主程序
4.总结
5.附录
1. 总体设计:
1.1 设计思路
我们选择单片机与A/D转换芯片结合的方法实现本设计。使用的基本元器件是:AT89C52单片机,ADC0809模数转换芯片,74LS164, 数码管,按键,电容,电阻,晶振等。 数字电压测量电路由A/D转换、数据处理及显示控制等组成。A/D转换由集成电路ADC0809完成。ADC0809具有8路拟输入端口,地址线(23~- 25脚)可决定对哪一路模拟输入作A/D换。22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。6脚为测试控制,当输入一个2uS 宽高电平脉冲时,就开始A/D转换。7脚为A/D转换结束标志,当A/D转换结束时,7脚输出高电平。9脚为A/D转换数据输出允许控制,当OE 脚为高电平时,A/D转换数据从该端口输出。10脚为0809的时钟输入端。 通过对单片机p2.5口置低电平控制LED 亮灯报警。
1.2 课题目的
(1)掌握数据采集系统的设计方法。
(2)结合8051设计一个8路数据采集系统。
1.3 器件选择
单片机是一种面向大规模的集成电路芯片,是微型计算机中的一个重要的分支。此系统是由CPU 、随即存取数据存储器、只读程序存储器、输入输出电路(I/O口),还有可能包括定时/计数器、串行通信口、显示驱动电路(LCD 和LED 驱动电路)、脉宽调制电路、模拟多路转换器及A/D转换器等电路集成到一个单块芯片上,构成了一个最小但完善的计算机任务。单片机要使用特定的组译和编译软件编译程序,本设计选用80C51单片机。
键盘是一种常见的输入设备,用户可以向计算机输入数据或命令。根据案件的识别方法分类,有编码键盘和非编码键盘两种。通过硬件识别的键盘称编码键盘;通过软件识别的键盘成为非编码键盘。非编码键盘有两种接口方法:一种是独立按键接口;另一种是矩阵式按键接口。本设计使用矩阵键盘。
A/D转换器的种类很多,就位数来说,可以分为8位、10位、12位和16位等。位数越高其分辨率就越高,价格也就越贵。A/D转换器型号很多,而其转换时间和转换误差也各不相同。,在价格、转换速度等多种标准考量下,在本设计选用的是逐渐逼近式A/D转换器——ADC0809。
设计方案的框图
二、硬件电路设计:
2.1 数据输入模块
本次采集器设计的输入的模拟信号比较简单,采用滑动变阻器,外接
+5V电压作为输入模拟信号,标示为RV1分别接入模数转换芯片ADC0809的IN0-IN7(26,27,28,1,2,3,4,5号管脚)。完全符合输入模拟信号0-5V 的调节范围,有效可靠的模拟电压信号。
2.2 模数转换模块
模拟信号通过输入端IN0~IN7:8路模拟量输入端。ADDA,ADDB,ADDC 三个是数据选择控制端输入片选信号与P3.2,P3.3,P3.4连在一起,由A ,B ,C 和IN0-IN7构成3-8数据器,通过AT89S51中的按键程序控制片选信号。START 是 A/D 转换启动脉冲输入端,输入一个正脉冲(至少100ns 宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。ALE 是地址锁存允许信号,输入,高电平有效。将ALE 和START 连在一起与P3.4相连,在A/D转换完成后正脉冲的处于高
电平,即可控制地址锁存器。该脉冲依靠编写的单片机中断程序模拟一个正脉冲控制。OE 端口是数据输出允许信号,由单片机输入高电平控制。当A /D 转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。OUT1-OUT8是A/D转换的输出数字端口,与P1口相连。连接方式是OUT1-OUT2和P1.7-P1.0。12和16号管脚是接基准电压分别接VCC 和GND 。另外10号端口是时钟频率大小不得超过640KHZ 。本次设计中我们采用终端输出脉冲来模拟这个时钟脉冲,但是效果不好,所以采用外接500KHZ 的信号。
2.3单片机
这是单片部分的复位电路和时钟脉冲电路。复位电路采用电平复位的方式,晶振的频率为12MHZ 。连接方式分别连到单片机的19,18,9引脚。
这是单片主控部分的接法,其中P3.1到P3.7与A/D转换芯片相连,做控制口。在A/D部分已经详细介绍了连法。P2.0-P2.4是五位
数码显示管的控制端。P0.0-P0.7是显示的数据输出端与五位位数码管的A-G 相连。
2.4 按键电路
通过串行口和2个IO 口P2.5,P2.6使用74LS164扩展的矩阵键盘,实现通道的选择以及上限下限的设置。上面八个按键实现通道选择,第二行前四个实现参数设置,其他的按键未用到,没有定义。
2.5 显示电路
显示部分我们使用的是六位数码管(共阳极),最后一位未用到,其中标示的是P0.0-P0.7和A-DP 的连接方式,是数据输出端。P2.0-P2.4与1-5相连,做控制端口,控制哪一位显示。
2.6 报警电路
通过p2.5连接的LED 实现报警功能。超过上限闪烁,低于下限一直点亮。
3. 系统程序设计:
3.1 程序流程框图
3.2 程序清单
#include
#include
#define uchar unsigned char #define uint unsigned int #define input P1
sbit START=P3^5;
sbit OE=P3^6;//允许输出信号位 sbit EOC=P3^7;//转换完成信号位 sbit AA=P3^2;
sbit BB=P3^3;
sbit CC=P3^4; sbit LED=P2^5; sbit p26=P2^6; sbit p27=P2^7; sbit shu1=P2^0; sbit shu2=P2^1; sbit shu3=P2^2; sbit shu4=P2^3; sbit shu5=P2^4; uchar tt; uchar mask; uchar
t1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
uchar t2[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; uint i,j; uint sx,xx; uchar rr; uchar an; uint aa;
uint get_char(void); void check_key(void); void delay2ms();
void display(uint temp );
/************延时 5ms*************/ void delay() {uint i;
for(i=5000;i>0;i--); }
//大约50us 的延时
void delay_50us(uint i) {uint j; for(;i>0;i--)
for(j=19;j>0;j--); }
uchar AD() {
uchar dat; START=0; START=1; START=0; //大于200us delay_50us(50); while(EOC==0);
OE=1;
dat=input; return dat; OE=0; }
void get_add(uchar add) {
CC=add/4; BB=add%4/2; AA=add%2; delay(); }
void display(uint temp ) {
uint temp2; if(tt
temp2=temp;
else if(tt==8||tt==9) temp2=sx;
else if (tt==10||tt==11) temp2=xx;
shu1=shu2=shu3=shu4=0; shu1=1; P0=t1[tt]; delay_50us(30); shu1=0; shu2=1; P0=t1[15];
delay_50us(30); shu2=0; shu3=1;
P0=t2[temp2/100]; delay_50us(30); shu3=0; shu4=1;
P0=t1[temp2%100/10]; delay_50us(30); shu4=0; shu5=1;
P0=t1[temp2%10]; delay_50us(30); shu5=0; }
void c_u(uint bb) {
aa=bb*2*0.98; }
void check_key(void) {an=0; mask=0x00; TI=0;
SBUF=mask; while(TI==0); if((p26&&p27)==0) {
delay_50us(200); if((p26&&p27)==0) tt=get_char(); an=1; LED=1; } }
uint get_char(void) {
unsigned char key_code,column=0;
/* 下列语句分析被按下的键所在的列号 */ mask = 0xfe; while(1) {
TI = 0;
SBUF = mask; while(TI==0); if((p26&&p27)!=0) {
mask =_crol_(mask,1); /*mask的值循环左移一位*/ column++;
if(column >= 8) column = 0; continue; }
else break; }
/*下列语句分析被按下的键所在的行号并计算键序号*/ if(p26==0)
key_code = column; else
key_code = 8+column;
while(!(p26&&p27)); delay_50us(200); while(!(p26&&p27)); switch(key_code) {
case 8: sx=sx+100; break; case 9: sx=sx-100; break; case 10: xx=xx+100; break; case 11: xx=xx-100; break;
default:break; }
return(key_code); }
void alarm(uint temp1) {
if(temp1>sx) {
LED=0;
delay_50us(70); LED=1;
//delay_50us(70); }
if(temp1
void main(void)
{ SCON = 0; /* 将串行口设置成方式0 */ ES = 0;
EA=0;/* 禁止串口中断 */ xx=300; sx=400; while(1) {
check_key(); if(an==1&&tt
rr=AD(); c_u(rr); display(aa); alarm(aa); } }
4.总结
本次课程设计用AT89c 51和ADC0809以及四位数码显示管为主
要元件,设计出了简单,实用的数据采集器。本文详细介绍了各个芯片的功能和特点,以及介绍了各芯片之间的连接方式。还编写了实现数据采集器的相应程序。本数据采集器最大的优点是结构简单,成本低,且具有很强的可移植性。为数据采集系统提供了一个可靠的解决方案。
经过本次课程设计,使我深深的体会到了理论应用在实际中的存在相当多的问题。要把所学的知识融会贯通也不是一件容易的事情。比如尽管通过Proteus 仿真出结果,但是仿真和实际电子元器件依然存在很大的差距。要学会如何矫正这些误差,实现系统的功能着实不容易。在焊接元件的时候一不小心也容易出差错。为后期造成很大的困难,
这次课程设计也让我学到了很多东西,比如对Proteus 和keil 的使用。学会如何制作仿真图,调用库元件。掌握了如何使用示波器以及其他电子设备。可以使用keil 编写简单的程序。对我以后的工作和学习都有巨大的影响。
5. 附录
元件清单
总体设计原理图